patch-2_6_7-vs1_9_1_12
[linux-2.6.git] / drivers / scsi / qla2xxx / qla_gs.c
1 /*
2  *                  QLOGIC LINUX SOFTWARE
3  *
4  * QLogic ISP2x00 device driver for Linux 2.6.x
5  * Copyright (C) 2003-2004 QLogic Corporation
6  * (www.qlogic.com)
7  *
8  * This program is free software; you can redistribute it and/or modify it
9  * under the terms of the GNU General Public License as published by the
10  * Free Software Foundation; either version 2, or (at your option) any
11  * later version.
12  *
13  * This program is distributed in the hope that it will be useful, but
14  * WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * General Public License for more details.
17  *
18  */
19 #include "qla_os.h"
20
21 #include "qla_def.h"
22
23 static inline ms_iocb_entry_t *
24 qla2x00_prep_ms_iocb(scsi_qla_host_t *, uint32_t, uint32_t);
25
26 static inline struct ct_sns_req *
27 qla2x00_prep_ct_req(struct ct_sns_req *, uint16_t, uint16_t);
28
29 static inline struct sns_cmd_pkt *
30 qla2x00_prep_sns_cmd(scsi_qla_host_t *, uint16_t, uint16_t, uint16_t);
31
32 static int qla2x00_sns_ga_nxt(scsi_qla_host_t *, fc_port_t *);
33 static int qla2x00_sns_gid_pt(scsi_qla_host_t *, sw_info_t *);
34 static int qla2x00_sns_gpn_id(scsi_qla_host_t *, sw_info_t *);
35 static int qla2x00_sns_gnn_id(scsi_qla_host_t *, sw_info_t *);
36 static int qla2x00_sns_rft_id(scsi_qla_host_t *);
37 static int qla2x00_sns_rnn_id(scsi_qla_host_t *);
38
39 /**
40  * qla2x00_prep_ms_iocb() - Prepare common MS IOCB fields for SNS CT query.
41  * @ha: HA context
42  * @req_size: request size in bytes
43  * @rsp_size: response size in bytes
44  *
45  * Returns a pointer to the @ha's ms_iocb.
46  */
47 static inline ms_iocb_entry_t *
48 qla2x00_prep_ms_iocb(scsi_qla_host_t *ha, uint32_t req_size, uint32_t rsp_size)
49 {
50         ms_iocb_entry_t *ms_pkt;
51
52         ms_pkt = ha->ms_iocb;
53         memset(ms_pkt, 0, sizeof(ms_iocb_entry_t));
54
55         ms_pkt->entry_type = MS_IOCB_TYPE;
56         ms_pkt->entry_count = 1;
57         SET_TARGET_ID(ha, ms_pkt->loop_id, SIMPLE_NAME_SERVER);
58         ms_pkt->control_flags = __constant_cpu_to_le16(CF_READ | CF_HEAD_TAG);
59         ms_pkt->timeout = __constant_cpu_to_le16(25);
60         ms_pkt->cmd_dsd_count = __constant_cpu_to_le16(1);
61         ms_pkt->total_dsd_count = __constant_cpu_to_le16(2);
62         ms_pkt->rsp_bytecount = cpu_to_le32(rsp_size);
63         ms_pkt->req_bytecount = cpu_to_le32(req_size);
64
65         ms_pkt->dseg_req_address[0] = cpu_to_le32(LSD(ha->ct_sns_dma));
66         ms_pkt->dseg_req_address[1] = cpu_to_le32(MSD(ha->ct_sns_dma));
67         ms_pkt->dseg_req_length = ms_pkt->req_bytecount;
68
69         ms_pkt->dseg_rsp_address[0] = cpu_to_le32(LSD(ha->ct_sns_dma));
70         ms_pkt->dseg_rsp_address[1] = cpu_to_le32(MSD(ha->ct_sns_dma));
71         ms_pkt->dseg_rsp_length = ms_pkt->rsp_bytecount;
72
73         return (ms_pkt);
74 }
75
76 /**
77  * qla2x00_prep_ct_req() - Prepare common CT request fields for SNS query.
78  * @ct_req: CT request buffer
79  * @cmd: GS command
80  * @rsp_size: response size in bytes
81  *
82  * Returns a pointer to the intitialized @ct_req.
83  */
84 static inline struct ct_sns_req *
85 qla2x00_prep_ct_req(struct ct_sns_req *ct_req, uint16_t cmd, uint16_t rsp_size)
86 {
87         memset(ct_req, 0, sizeof(struct ct_sns_pkt));
88
89         ct_req->header.revision = 0x01;
90         ct_req->header.gs_type = 0xFC;
91         ct_req->header.gs_subtype = 0x02;
92         ct_req->command = cpu_to_be16(cmd);
93         ct_req->max_rsp_size = cpu_to_be16((rsp_size - 16) / 4);
94
95         return (ct_req);
96 }
97
98
99 /**
100  * qla2x00_ga_nxt() - SNS scan for fabric devices via GA_NXT command.
101  * @ha: HA context
102  * @fcport: fcport entry to updated
103  *
104  * Returns 0 on success.
105  */
106 int
107 qla2x00_ga_nxt(scsi_qla_host_t *ha, fc_port_t *fcport)
108 {
109         int             rval;
110
111         ms_iocb_entry_t *ms_pkt;
112         struct ct_sns_req       *ct_req;
113         struct ct_sns_rsp       *ct_rsp;
114
115         if (IS_QLA2100(ha) || IS_QLA2200(ha)) {
116                 return (qla2x00_sns_ga_nxt(ha, fcport));
117         }
118
119         /* Issue GA_NXT */
120         /* Prepare common MS IOCB */
121         ms_pkt = qla2x00_prep_ms_iocb(ha, GA_NXT_REQ_SIZE, GA_NXT_RSP_SIZE);
122
123         /* Prepare CT request */
124         ct_req = qla2x00_prep_ct_req(&ha->ct_sns->p.req, GA_NXT_CMD,
125             GA_NXT_RSP_SIZE);
126         ct_rsp = &ha->ct_sns->p.rsp;
127
128         /* Prepare CT arguments -- port_id */
129         ct_req->req.port_id.port_id[0] = fcport->d_id.b.domain;
130         ct_req->req.port_id.port_id[1] = fcport->d_id.b.area;
131         ct_req->req.port_id.port_id[2] = fcport->d_id.b.al_pa;
132
133         /* Execute MS IOCB */
134         rval = qla2x00_issue_iocb(ha, ha->ms_iocb, ha->ms_iocb_dma,
135             sizeof(ms_iocb_entry_t));
136         if (rval != QLA_SUCCESS) {
137                 /*EMPTY*/
138                 DEBUG2_3(printk("scsi(%ld): GA_NXT issue IOCB failed (%d).\n",
139                     ha->host_no, rval));
140         } else if (ct_rsp->header.response !=
141             __constant_cpu_to_be16(CT_ACCEPT_RESPONSE)) {
142                 DEBUG2_3(printk("scsi(%ld): GA_NXT failed, rejected request, "
143                     "ga_nxt_rsp:\n", ha->host_no));
144                 DEBUG2_3(qla2x00_dump_buffer((uint8_t *)&ct_rsp->header,
145                     sizeof(struct ct_rsp_hdr)));
146                 rval = QLA_FUNCTION_FAILED;
147         } else {
148                 /* Populate fc_port_t entry. */
149                 fcport->d_id.b.domain = ct_rsp->rsp.ga_nxt.port_id[0];
150                 fcport->d_id.b.area = ct_rsp->rsp.ga_nxt.port_id[1];
151                 fcport->d_id.b.al_pa = ct_rsp->rsp.ga_nxt.port_id[2];
152
153                 memcpy(fcport->node_name, ct_rsp->rsp.ga_nxt.node_name,
154                     WWN_SIZE);
155                 memcpy(fcport->port_name, ct_rsp->rsp.ga_nxt.port_name,
156                     WWN_SIZE);
157
158                 if (ct_rsp->rsp.ga_nxt.port_type != NS_N_PORT_TYPE &&
159                     ct_rsp->rsp.ga_nxt.port_type != NS_NL_PORT_TYPE)
160                         fcport->d_id.b.domain = 0xf0;
161
162                 DEBUG2_3(printk("scsi(%ld): GA_NXT entry - "
163                     "nn %02x%02x%02x%02x%02x%02x%02x%02x "
164                     "pn %02x%02x%02x%02x%02x%02x%02x%02x "
165                     "portid=%02x%02x%02x.\n",
166                     ha->host_no,
167                     fcport->node_name[0], fcport->node_name[1],
168                     fcport->node_name[2], fcport->node_name[3],
169                     fcport->node_name[4], fcport->node_name[5],
170                     fcport->node_name[6], fcport->node_name[7],
171                     fcport->port_name[0], fcport->port_name[1],
172                     fcport->port_name[2], fcport->port_name[3],
173                     fcport->port_name[4], fcport->port_name[5],
174                     fcport->port_name[6], fcport->port_name[7],
175                     fcport->d_id.b.domain, fcport->d_id.b.area,
176                     fcport->d_id.b.al_pa));
177         }
178
179         return (rval);
180 }
181
182 /**
183  * qla2x00_gid_pt() - SNS scan for fabric devices via GID_PT command.
184  * @ha: HA context
185  * @list: switch info entries to populate
186  *
187  * NOTE: Non-Nx_Ports are not requested.
188  *
189  * Returns 0 on success.
190  */
191 int
192 qla2x00_gid_pt(scsi_qla_host_t *ha, sw_info_t *list)
193 {
194         int             rval;
195         uint16_t        i;
196
197         ms_iocb_entry_t *ms_pkt;
198         struct ct_sns_req       *ct_req;
199         struct ct_sns_rsp       *ct_rsp;
200
201         struct ct_sns_gid_pt_data *gid_data;
202
203         if (IS_QLA2100(ha) || IS_QLA2200(ha)) {
204                 return (qla2x00_sns_gid_pt(ha, list));
205         }
206
207         gid_data = NULL;
208
209         /* Issue GID_PT */
210         /* Prepare common MS IOCB */
211         ms_pkt = qla2x00_prep_ms_iocb(ha, GID_PT_REQ_SIZE, GID_PT_RSP_SIZE);
212
213         /* Prepare CT request */
214         ct_req = qla2x00_prep_ct_req(&ha->ct_sns->p.req, GID_PT_CMD,
215             GID_PT_RSP_SIZE);
216         ct_rsp = &ha->ct_sns->p.rsp;
217
218         /* Prepare CT arguments -- port_type */
219         ct_req->req.gid_pt.port_type = NS_NX_PORT_TYPE;
220
221         /* Execute MS IOCB */
222         rval = qla2x00_issue_iocb(ha, ha->ms_iocb, ha->ms_iocb_dma,
223             sizeof(ms_iocb_entry_t));
224         if (rval != QLA_SUCCESS) {
225                 /*EMPTY*/
226                 DEBUG2_3(printk("scsi(%ld): GID_PT issue IOCB failed (%d).\n",
227                     ha->host_no, rval));
228         } else if (ct_rsp->header.response !=
229             __constant_cpu_to_be16(CT_ACCEPT_RESPONSE)) {
230                 DEBUG2_3(printk("scsi(%ld): GID_PT failed, rejected request, "
231                     "gid_pt_rsp:\n", ha->host_no));
232                 DEBUG2_3(qla2x00_dump_buffer((uint8_t *)&ct_rsp->header,
233                     sizeof(struct ct_rsp_hdr)));
234                 rval = QLA_FUNCTION_FAILED;
235         } else {
236                 /* Set port IDs in switch info list. */
237                 for (i = 0; i < MAX_FIBRE_DEVICES; i++) {
238                         gid_data = &ct_rsp->rsp.gid_pt.entries[i];
239                         list[i].d_id.b.domain = gid_data->port_id[0];
240                         list[i].d_id.b.area = gid_data->port_id[1];
241                         list[i].d_id.b.al_pa = gid_data->port_id[2];
242
243                         /* Last one exit. */
244                         if (gid_data->control_byte & BIT_7) {
245                                 list[i].d_id.b.rsvd_1 = gid_data->control_byte;
246                                 break;
247                         }
248                 }
249
250                 /*
251                  * If we've used all available slots, then the switch is
252                  * reporting back more devices than we can handle with this
253                  * single call.  Return a failed status, and let GA_NXT handle
254                  * the overload.
255                  */
256                 if (i == MAX_FIBRE_DEVICES) 
257                         rval = QLA_FUNCTION_FAILED;
258         }
259
260         return (rval);
261 }
262
263 /**
264  * qla2x00_gpn_id() - SNS Get Port Name (GPN_ID) query.
265  * @ha: HA context
266  * @list: switch info entries to populate
267  *
268  * Returns 0 on success.
269  */
270 int
271 qla2x00_gpn_id(scsi_qla_host_t *ha, sw_info_t *list)
272 {
273         int             rval;
274         uint16_t        i;
275
276         ms_iocb_entry_t *ms_pkt;
277         struct ct_sns_req       *ct_req;
278         struct ct_sns_rsp       *ct_rsp;
279
280         if (IS_QLA2100(ha) || IS_QLA2200(ha)) {
281                 return (qla2x00_sns_gpn_id(ha, list));
282         }
283
284         for (i = 0; i < MAX_FIBRE_DEVICES; i++) {
285                 /* Issue GPN_ID */
286                 /* Prepare common MS IOCB */
287                 ms_pkt = qla2x00_prep_ms_iocb(ha, GPN_ID_REQ_SIZE,
288                     GPN_ID_RSP_SIZE);
289
290                 /* Prepare CT request */
291                 ct_req = qla2x00_prep_ct_req(&ha->ct_sns->p.req, GPN_ID_CMD,
292                     GPN_ID_RSP_SIZE);
293                 ct_rsp = &ha->ct_sns->p.rsp;
294
295                 /* Prepare CT arguments -- port_id */
296                 ct_req->req.port_id.port_id[0] = list[i].d_id.b.domain;
297                 ct_req->req.port_id.port_id[1] = list[i].d_id.b.area;
298                 ct_req->req.port_id.port_id[2] = list[i].d_id.b.al_pa;
299
300                 /* Execute MS IOCB */
301                 rval = qla2x00_issue_iocb(ha, ha->ms_iocb, ha->ms_iocb_dma,
302                     sizeof(ms_iocb_entry_t));
303                 if (rval != QLA_SUCCESS) {
304                         /*EMPTY*/
305                         DEBUG2_3(printk("scsi(%ld): GPN_ID issue IOCB failed "
306                             "(%d).\n", ha->host_no, rval));
307                 } else if (ct_rsp->header.response !=
308                     __constant_cpu_to_be16(CT_ACCEPT_RESPONSE)) {
309                         DEBUG2_3(printk("scsi(%ld): GPN_ID failed, rejected "
310                             "request, gpn_id_rsp:\n", ha->host_no));
311                         DEBUG2_3(qla2x00_dump_buffer((uint8_t *)&ct_rsp->header,
312                             sizeof(struct ct_rsp_hdr)));
313                         rval = QLA_FUNCTION_FAILED;
314                 } else {
315                         /* Save portname */
316                         memcpy(list[i].port_name,
317                             ct_rsp->rsp.gpn_id.port_name, WWN_SIZE);
318                 }
319
320                 /* Last device exit. */
321                 if (list[i].d_id.b.rsvd_1 != 0)
322                         break;
323         }
324
325         return (rval);
326 }
327
328 /**
329  * qla2x00_gnn_id() - SNS Get Node Name (GNN_ID) query.
330  * @ha: HA context
331  * @list: switch info entries to populate
332  *
333  * Returns 0 on success.
334  */
335 int
336 qla2x00_gnn_id(scsi_qla_host_t *ha, sw_info_t *list)
337 {
338         int             rval;
339         uint16_t        i;
340
341         ms_iocb_entry_t *ms_pkt;
342         struct ct_sns_req       *ct_req;
343         struct ct_sns_rsp       *ct_rsp;
344
345         if (IS_QLA2100(ha) || IS_QLA2200(ha)) {
346                 return (qla2x00_sns_gnn_id(ha, list));
347         }
348
349         for (i = 0; i < MAX_FIBRE_DEVICES; i++) {
350                 /* Issue GNN_ID */
351                 /* Prepare common MS IOCB */
352                 ms_pkt = qla2x00_prep_ms_iocb(ha, GNN_ID_REQ_SIZE,
353                     GNN_ID_RSP_SIZE);
354
355                 /* Prepare CT request */
356                 ct_req = qla2x00_prep_ct_req(&ha->ct_sns->p.req, GNN_ID_CMD,
357                     GNN_ID_RSP_SIZE);
358                 ct_rsp = &ha->ct_sns->p.rsp;
359
360                 /* Prepare CT arguments -- port_id */
361                 ct_req->req.port_id.port_id[0] = list[i].d_id.b.domain;
362                 ct_req->req.port_id.port_id[1] = list[i].d_id.b.area;
363                 ct_req->req.port_id.port_id[2] = list[i].d_id.b.al_pa;
364
365                 /* Execute MS IOCB */
366                 rval = qla2x00_issue_iocb(ha, ha->ms_iocb, ha->ms_iocb_dma,
367                     sizeof(ms_iocb_entry_t));
368                 if (rval != QLA_SUCCESS) {
369                         /*EMPTY*/
370                         DEBUG2_3(printk("scsi(%ld): GNN_ID issue IOCB failed "
371                             "(%d).\n", ha->host_no, rval));
372                 } else if (ct_rsp->header.response !=
373                     __constant_cpu_to_be16(CT_ACCEPT_RESPONSE)) {
374                         DEBUG2_3(printk("scsi(%ld): GNN_ID failed, rejected "
375                             "request, gnn_id_rsp:\n", ha->host_no));
376                         DEBUG2_3(qla2x00_dump_buffer((uint8_t *)&ct_rsp->header,
377                             sizeof(struct ct_rsp_hdr)));
378                         rval = QLA_FUNCTION_FAILED;
379                 } else {
380                         /* Save nodename */
381                         memcpy(list[i].node_name,
382                             ct_rsp->rsp.gnn_id.node_name, WWN_SIZE);
383
384                         DEBUG2_3(printk("scsi(%ld): GID_PT entry - "
385                             "nn %02x%02x%02x%02x%02x%02x%02x%02x "
386                             "pn %02x%02x%02x%02x%02x%02x%02x%02x "
387                             "portid=%02x%02x%02x.\n",
388                             ha->host_no,
389                             list[i].node_name[0], list[i].node_name[1],
390                             list[i].node_name[2], list[i].node_name[3],
391                             list[i].node_name[4], list[i].node_name[5],
392                             list[i].node_name[6], list[i].node_name[7],
393                             list[i].port_name[0], list[i].port_name[1],
394                             list[i].port_name[2], list[i].port_name[3],
395                             list[i].port_name[4], list[i].port_name[5],
396                             list[i].port_name[6], list[i].port_name[7],
397                             list[i].d_id.b.domain, list[i].d_id.b.area,
398                             list[i].d_id.b.al_pa));
399                 }
400
401                 /* Last device exit. */
402                 if (list[i].d_id.b.rsvd_1 != 0)
403                         break;
404         }
405
406         return (rval);
407 }
408
409 /**
410  * qla2x00_rft_id() - SNS Register FC-4 TYPEs (RFT_ID) supported by the HBA.
411  * @ha: HA context
412  *
413  * Returns 0 on success.
414  */
415 int
416 qla2x00_rft_id(scsi_qla_host_t *ha)
417 {
418         int             rval;
419
420         ms_iocb_entry_t *ms_pkt;
421         struct ct_sns_req       *ct_req;
422         struct ct_sns_rsp       *ct_rsp;
423
424         if (IS_QLA2100(ha) || IS_QLA2200(ha)) {
425                 return (qla2x00_sns_rft_id(ha));
426         }
427
428         /* Issue RFT_ID */
429         /* Prepare common MS IOCB */
430         ms_pkt = qla2x00_prep_ms_iocb(ha, RFT_ID_REQ_SIZE, RFT_ID_RSP_SIZE);
431
432         /* Prepare CT request */
433         ct_req = qla2x00_prep_ct_req(&ha->ct_sns->p.req, RFT_ID_CMD,
434             RFT_ID_RSP_SIZE);
435         ct_rsp = &ha->ct_sns->p.rsp;
436
437         /* Prepare CT arguments -- port_id, FC-4 types */
438         ct_req->req.rft_id.port_id[0] = ha->d_id.b.domain;
439         ct_req->req.rft_id.port_id[1] = ha->d_id.b.area;
440         ct_req->req.rft_id.port_id[2] = ha->d_id.b.al_pa;
441
442         ct_req->req.rft_id.fc4_types[2] = 0x01;         /* FCP-3 */
443
444         /* Execute MS IOCB */
445         rval = qla2x00_issue_iocb(ha, ha->ms_iocb, ha->ms_iocb_dma,
446             sizeof(ms_iocb_entry_t));
447         if (rval != QLA_SUCCESS) {
448                 /*EMPTY*/
449                 DEBUG2_3(printk("scsi(%ld): RFT_ID issue IOCB failed (%d).\n",
450                     ha->host_no, rval));
451         } else if (ct_rsp->header.response !=
452             __constant_cpu_to_be16(CT_ACCEPT_RESPONSE)) {
453                 DEBUG2_3(printk("scsi(%ld): RFT_ID failed, rejected "
454                     "request, rft_id_rsp:\n", ha->host_no));
455                 DEBUG2_3(qla2x00_dump_buffer((uint8_t *)&ct_rsp->header,
456                     sizeof(struct ct_rsp_hdr)));
457                 rval = QLA_FUNCTION_FAILED;
458         } else {
459                 DEBUG2(printk("scsi(%ld): RFT_ID exiting normally.\n",
460                     ha->host_no));
461         }
462
463         return (rval);
464 }
465
466 /**
467  * qla2x00_rff_id() - SNS Register FC-4 Features (RFF_ID) supported by the HBA.
468  * @ha: HA context
469  *
470  * Returns 0 on success.
471  */
472 int
473 qla2x00_rff_id(scsi_qla_host_t *ha)
474 {
475         int             rval;
476
477         ms_iocb_entry_t *ms_pkt;
478         struct ct_sns_req       *ct_req;
479         struct ct_sns_rsp       *ct_rsp;
480
481         if (IS_QLA2100(ha) || IS_QLA2200(ha)) {
482                 DEBUG2(printk("scsi(%ld): RFF_ID call unsupported on "
483                     "ISP2100/ISP2200.\n", ha->host_no));
484                 return (QLA_SUCCESS);
485         }
486
487         /* Issue RFF_ID */
488         /* Prepare common MS IOCB */
489         ms_pkt = qla2x00_prep_ms_iocb(ha, RFF_ID_REQ_SIZE, RFF_ID_RSP_SIZE);
490
491         /* Prepare CT request */
492         ct_req = qla2x00_prep_ct_req(&ha->ct_sns->p.req, RFF_ID_CMD,
493             RFF_ID_RSP_SIZE);
494         ct_rsp = &ha->ct_sns->p.rsp;
495
496         /* Prepare CT arguments -- port_id, FC-4 feature, FC-4 type */
497         ct_req->req.rff_id.port_id[0] = ha->d_id.b.domain;
498         ct_req->req.rff_id.port_id[1] = ha->d_id.b.area;
499         ct_req->req.rff_id.port_id[2] = ha->d_id.b.al_pa;
500
501         ct_req->req.rff_id.fc4_type = 0x08;             /* SCSI - FCP */
502
503         /* Execute MS IOCB */
504         rval = qla2x00_issue_iocb(ha, ha->ms_iocb, ha->ms_iocb_dma,
505             sizeof(ms_iocb_entry_t));
506         if (rval != QLA_SUCCESS) {
507                 /*EMPTY*/
508                 DEBUG2_3(printk("scsi(%ld): RFF_ID issue IOCB failed (%d).\n",
509                     ha->host_no, rval));
510         } else if (ct_rsp->header.response !=
511             __constant_cpu_to_be16(CT_ACCEPT_RESPONSE)) {
512                 DEBUG2_3(printk("scsi(%ld): RFF_ID failed, rejected "
513                     "request, rff_id_rsp:\n", ha->host_no));
514                 DEBUG2_3(qla2x00_dump_buffer((uint8_t *)&ct_rsp->header,
515                     sizeof(struct ct_rsp_hdr)));
516                 rval = QLA_FUNCTION_FAILED;
517         } else {
518                 DEBUG2(printk("scsi(%ld): RFF_ID exiting normally.\n",
519                     ha->host_no));
520         }
521
522         return (rval);
523 }
524
525 /**
526  * qla2x00_rnn_id() - SNS Register Node Name (RNN_ID) of the HBA.
527  * @ha: HA context
528  *
529  * Returns 0 on success.
530  */
531 int
532 qla2x00_rnn_id(scsi_qla_host_t *ha)
533 {
534         int             rval;
535
536         ms_iocb_entry_t *ms_pkt;
537         struct ct_sns_req       *ct_req;
538         struct ct_sns_rsp       *ct_rsp;
539
540         if (IS_QLA2100(ha) || IS_QLA2200(ha)) {
541                 return (qla2x00_sns_rnn_id(ha));
542         }
543
544         /* Issue RNN_ID */
545         /* Prepare common MS IOCB */
546         ms_pkt = qla2x00_prep_ms_iocb(ha, RNN_ID_REQ_SIZE, RNN_ID_RSP_SIZE);
547
548         /* Prepare CT request */
549         ct_req = qla2x00_prep_ct_req(&ha->ct_sns->p.req, RNN_ID_CMD,
550             RNN_ID_RSP_SIZE);
551         ct_rsp = &ha->ct_sns->p.rsp;
552
553         /* Prepare CT arguments -- port_id, node_name */
554         ct_req->req.rnn_id.port_id[0] = ha->d_id.b.domain;
555         ct_req->req.rnn_id.port_id[1] = ha->d_id.b.area;
556         ct_req->req.rnn_id.port_id[2] = ha->d_id.b.al_pa;
557
558         memcpy(ct_req->req.rnn_id.node_name, ha->init_cb->node_name, WWN_SIZE);
559
560         /* Execute MS IOCB */
561         rval = qla2x00_issue_iocb(ha, ha->ms_iocb, ha->ms_iocb_dma,
562             sizeof(ms_iocb_entry_t));
563         if (rval != QLA_SUCCESS) {
564                 /*EMPTY*/
565                 DEBUG2_3(printk("scsi(%ld): RNN_ID issue IOCB failed (%d).\n",
566                     ha->host_no, rval));
567         } else if (ct_rsp->header.response !=
568             __constant_cpu_to_be16(CT_ACCEPT_RESPONSE)) {
569                 DEBUG2_3(printk("scsi(%ld): RNN_ID failed, rejected "
570                     "request, rnn_id_rsp:\n", ha->host_no));
571                 DEBUG2_3(qla2x00_dump_buffer((uint8_t *)&ct_rsp->header,
572                     sizeof(struct ct_rsp_hdr)));
573                 rval = QLA_FUNCTION_FAILED;
574         } else {
575                 DEBUG2(printk("scsi(%ld): RNN_ID exiting normally.\n",
576                     ha->host_no));
577         }
578
579         return (rval);
580 }
581
582 /**
583  * qla2x00_rsnn_nn() - SNS Register Symbolic Node Name (RSNN_NN) of the HBA.
584  * @ha: HA context
585  *
586  * Returns 0 on success.
587  */
588 int
589 qla2x00_rsnn_nn(scsi_qla_host_t *ha)
590 {
591         int             rval;
592         uint8_t         *snn;
593         uint8_t         version[20];
594
595         ms_iocb_entry_t *ms_pkt;
596         struct ct_sns_req       *ct_req;
597         struct ct_sns_rsp       *ct_rsp;
598
599         if (IS_QLA2100(ha) || IS_QLA2200(ha)) {
600                 DEBUG2(printk("scsi(%ld): RSNN_ID call unsupported on "
601                     "ISP2100/ISP2200.\n", ha->host_no));
602                 return (QLA_SUCCESS);
603         }
604
605         /* Issue RSNN_NN */
606         /* Prepare common MS IOCB */
607         /*   Request size adjusted after CT preparation */
608         ms_pkt = qla2x00_prep_ms_iocb(ha, 0, RSNN_NN_RSP_SIZE);
609
610         /* Prepare CT request */
611         ct_req = qla2x00_prep_ct_req(&ha->ct_sns->p.req, RSNN_NN_CMD,
612             RSNN_NN_RSP_SIZE);
613         ct_rsp = &ha->ct_sns->p.rsp;
614
615         /* Prepare CT arguments -- node_name, symbolic node_name, size */
616         memcpy(ct_req->req.rsnn_nn.node_name, ha->init_cb->node_name, WWN_SIZE);
617         
618         /* Prepare the Symbolic Node Name */
619         /* Board type */
620         snn = ct_req->req.rsnn_nn.sym_node_name;
621         strcpy(snn, ha->model_number);
622         /* Firmware version */
623         strcat(snn, " FW:v");
624         sprintf(version, "%d.%02d.%02d", ha->fw_major_version,
625             ha->fw_minor_version, ha->fw_subminor_version);
626         strcat(snn, version);
627         /* Driver version */
628         strcat(snn, " DVR:v");
629         strcat(snn, qla2x00_version_str);
630
631         /* Calculate SNN length */
632         ct_req->req.rsnn_nn.name_len = (uint8_t)strlen(snn);
633
634         /* Update MS IOCB request */
635         ms_pkt->req_bytecount =
636             cpu_to_le32(24 + 1 + ct_req->req.rsnn_nn.name_len);
637         ms_pkt->dseg_req_length = ms_pkt->req_bytecount;
638
639         /* Execute MS IOCB */
640         rval = qla2x00_issue_iocb(ha, ha->ms_iocb, ha->ms_iocb_dma,
641             sizeof(ms_iocb_entry_t));
642         if (rval != QLA_SUCCESS) {
643                 /*EMPTY*/
644                 DEBUG2_3(printk("scsi(%ld): RSNN_NN issue IOCB failed (%d).\n",
645                     ha->host_no, rval));
646         } else if (ct_rsp->header.response !=
647             __constant_cpu_to_be16(CT_ACCEPT_RESPONSE)) {
648                 DEBUG2_3(printk("scsi(%ld): RSNN_NN failed, rejected "
649                     "request, rsnn_id_rsp:\n", ha->host_no));
650                 DEBUG2_3(qla2x00_dump_buffer((uint8_t *)&ct_rsp->header,
651                     sizeof(struct ct_rsp_hdr)));
652                 rval = QLA_FUNCTION_FAILED;
653         } else {
654                 DEBUG2(printk("scsi(%ld): RSNN_NN exiting normally.\n",
655                     ha->host_no));
656         }
657
658         return (rval);
659 }
660
661
662 /**
663  * qla2x00_prep_sns_cmd() - Prepare common SNS command request fields for query.
664  * @ha: HA context
665  * @cmd: GS command
666  * @scmd_len: Subcommand length
667  * @data_size: response size in bytes
668  *
669  * Returns a pointer to the @ha's sns_cmd.
670  */
671 static inline struct sns_cmd_pkt *
672 qla2x00_prep_sns_cmd(scsi_qla_host_t *ha, uint16_t cmd, uint16_t scmd_len,
673     uint16_t data_size)
674 {
675         uint16_t                wc;
676         struct sns_cmd_pkt      *sns_cmd;
677
678         sns_cmd = ha->sns_cmd;
679         memset(sns_cmd, 0, sizeof(struct sns_cmd_pkt));
680         wc = data_size / 2;                     /* Size in 16bit words. */
681         sns_cmd->p.cmd.buffer_length = cpu_to_le16(wc);
682         sns_cmd->p.cmd.buffer_address[0] = cpu_to_le32(LSD(ha->sns_cmd_dma));
683         sns_cmd->p.cmd.buffer_address[1] = cpu_to_le32(MSD(ha->sns_cmd_dma));
684         sns_cmd->p.cmd.subcommand_length = cpu_to_le16(scmd_len);
685         sns_cmd->p.cmd.subcommand = cpu_to_le16(cmd);
686         wc = (data_size - 16) / 4;              /* Size in 32bit words. */
687         sns_cmd->p.cmd.size = cpu_to_le16(wc);
688
689         return (sns_cmd);
690 }
691
692 /**
693  * qla2x00_sns_ga_nxt() - SNS scan for fabric devices via GA_NXT command.
694  * @ha: HA context
695  * @fcport: fcport entry to updated
696  *
697  * This command uses the old Exectute SNS Command mailbox routine.
698  *
699  * Returns 0 on success.
700  */
701 static int
702 qla2x00_sns_ga_nxt(scsi_qla_host_t *ha, fc_port_t *fcport)
703 {
704         int             rval;
705
706         struct sns_cmd_pkt      *sns_cmd;
707
708         /* Issue GA_NXT. */
709         /* Prepare SNS command request. */
710         sns_cmd = qla2x00_prep_sns_cmd(ha, GA_NXT_CMD, GA_NXT_SNS_SCMD_LEN,
711             GA_NXT_SNS_DATA_SIZE);
712
713         /* Prepare SNS command arguments -- port_id. */
714         sns_cmd->p.cmd.param[0] = fcport->d_id.b.al_pa;
715         sns_cmd->p.cmd.param[1] = fcport->d_id.b.area;
716         sns_cmd->p.cmd.param[2] = fcport->d_id.b.domain;
717
718         /* Execute SNS command. */
719         rval = qla2x00_send_sns(ha, ha->sns_cmd_dma, GA_NXT_SNS_CMD_SIZE / 2,
720             sizeof(struct sns_cmd_pkt));
721         if (rval != QLA_SUCCESS) {
722                 /*EMPTY*/
723                 DEBUG2_3(printk("scsi(%ld): GA_NXT Send SNS failed (%d).\n",
724                     ha->host_no, rval));
725         } else if (sns_cmd->p.gan_data[8] != 0x80 ||
726             sns_cmd->p.gan_data[9] != 0x02) {
727                 DEBUG2_3(printk("scsi(%ld): GA_NXT failed, rejected request, "
728                     "ga_nxt_rsp:\n", ha->host_no));
729                 DEBUG2_3(qla2x00_dump_buffer(sns_cmd->p.gan_data, 16));
730                 rval = QLA_FUNCTION_FAILED;
731         } else {
732                 /* Populate fc_port_t entry. */
733                 fcport->d_id.b.domain = sns_cmd->p.gan_data[17];
734                 fcport->d_id.b.area = sns_cmd->p.gan_data[18];
735                 fcport->d_id.b.al_pa = sns_cmd->p.gan_data[19];
736
737                 memcpy(fcport->node_name, &sns_cmd->p.gan_data[284], WWN_SIZE);
738                 memcpy(fcport->port_name, &sns_cmd->p.gan_data[20], WWN_SIZE);
739
740                 if (sns_cmd->p.gan_data[16] != NS_N_PORT_TYPE &&
741                     sns_cmd->p.gan_data[16] != NS_NL_PORT_TYPE)
742                         fcport->d_id.b.domain = 0xf0;
743
744                 DEBUG2_3(printk("scsi(%ld): GA_NXT entry - "
745                     "nn %02x%02x%02x%02x%02x%02x%02x%02x "
746                     "pn %02x%02x%02x%02x%02x%02x%02x%02x "
747                     "portid=%02x%02x%02x.\n",
748                     ha->host_no,
749                     fcport->node_name[0], fcport->node_name[1],
750                     fcport->node_name[2], fcport->node_name[3],
751                     fcport->node_name[4], fcport->node_name[5],
752                     fcport->node_name[6], fcport->node_name[7],
753                     fcport->port_name[0], fcport->port_name[1],
754                     fcport->port_name[2], fcport->port_name[3],
755                     fcport->port_name[4], fcport->port_name[5],
756                     fcport->port_name[6], fcport->port_name[7],
757                     fcport->d_id.b.domain, fcport->d_id.b.area,
758                     fcport->d_id.b.al_pa));
759         }
760
761         return (rval);
762 }
763
764 /**
765  * qla2x00_sns_gid_pt() - SNS scan for fabric devices via GID_PT command.
766  * @ha: HA context
767  * @list: switch info entries to populate
768  *
769  * This command uses the old Exectute SNS Command mailbox routine.
770  *
771  * NOTE: Non-Nx_Ports are not requested.
772  *
773  * Returns 0 on success.
774  */
775 static int
776 qla2x00_sns_gid_pt(scsi_qla_host_t *ha, sw_info_t *list)
777 {
778         int             rval;
779
780         uint16_t        i;
781         uint8_t         *entry;
782         struct sns_cmd_pkt      *sns_cmd;
783
784         /* Issue GID_PT. */
785         /* Prepare SNS command request. */
786         sns_cmd = qla2x00_prep_sns_cmd(ha, GID_PT_CMD, GID_PT_SNS_SCMD_LEN,
787             GID_PT_SNS_DATA_SIZE);
788
789         /* Prepare SNS command arguments -- port_type. */
790         sns_cmd->p.cmd.param[0] = NS_NX_PORT_TYPE;
791
792         /* Execute SNS command. */
793         rval = qla2x00_send_sns(ha, ha->sns_cmd_dma, GID_PT_SNS_CMD_SIZE / 2,
794             sizeof(struct sns_cmd_pkt));
795         if (rval != QLA_SUCCESS) {
796                 /*EMPTY*/
797                 DEBUG2_3(printk("scsi(%ld): GID_PT Send SNS failed (%d).\n",
798                     ha->host_no, rval));
799         } else if (sns_cmd->p.gid_data[8] != 0x80 ||
800             sns_cmd->p.gid_data[9] != 0x02) {
801                 DEBUG2_3(printk("scsi(%ld): GID_PT failed, rejected request, "
802                     "gid_rsp:\n", ha->host_no));
803                 DEBUG2_3(qla2x00_dump_buffer(sns_cmd->p.gid_data, 16));
804                 rval = QLA_FUNCTION_FAILED;
805         } else {
806                 /* Set port IDs in switch info list. */
807                 for (i = 0; i < MAX_FIBRE_DEVICES; i++) {
808                         entry = &sns_cmd->p.gid_data[(i * 4) + 16];
809                         list[i].d_id.b.domain = entry[1];
810                         list[i].d_id.b.area = entry[2];
811                         list[i].d_id.b.al_pa = entry[3];
812
813                         /* Last one exit. */
814                         if (entry[0] & BIT_7) {
815                                 list[i].d_id.b.rsvd_1 = entry[0];
816                                 break;
817                         }
818                 }
819
820                 /*
821                  * If we've used all available slots, then the switch is
822                  * reporting back more devices that we can handle with this
823                  * single call.  Return a failed status, and let GA_NXT handle
824                  * the overload.
825                  */
826                 if (i == MAX_FIBRE_DEVICES) 
827                         rval = QLA_FUNCTION_FAILED;
828         }
829
830         return (rval);
831 }
832
833 /**
834  * qla2x00_sns_gpn_id() - SNS Get Port Name (GPN_ID) query.
835  * @ha: HA context
836  * @list: switch info entries to populate
837  *
838  * This command uses the old Exectute SNS Command mailbox routine.
839  *
840  * Returns 0 on success.
841  */
842 static int
843 qla2x00_sns_gpn_id(scsi_qla_host_t *ha, sw_info_t *list)
844 {
845         int             rval;
846
847         uint16_t        i;
848         struct sns_cmd_pkt      *sns_cmd;
849
850         for (i = 0; i < MAX_FIBRE_DEVICES; i++) {
851                 /* Issue GPN_ID */
852                 /* Prepare SNS command request. */
853                 sns_cmd = qla2x00_prep_sns_cmd(ha, GPN_ID_CMD,
854                     GPN_ID_SNS_SCMD_LEN, GPN_ID_SNS_DATA_SIZE);
855
856                 /* Prepare SNS command arguments -- port_id. */
857                 sns_cmd->p.cmd.param[0] = list[i].d_id.b.al_pa;
858                 sns_cmd->p.cmd.param[1] = list[i].d_id.b.area;
859                 sns_cmd->p.cmd.param[2] = list[i].d_id.b.domain;
860
861                 /* Execute SNS command. */
862                 rval = qla2x00_send_sns(ha, ha->sns_cmd_dma,
863                     GPN_ID_SNS_CMD_SIZE / 2, sizeof(struct sns_cmd_pkt));
864                 if (rval != QLA_SUCCESS) {
865                         /*EMPTY*/
866                         DEBUG2_3(printk("scsi(%ld): GPN_ID Send SNS failed "
867                             "(%d).\n", ha->host_no, rval));
868                 } else if (sns_cmd->p.gpn_data[8] != 0x80 ||
869                     sns_cmd->p.gpn_data[9] != 0x02) {
870                         DEBUG2_3(printk("scsi(%ld): GPN_ID failed, rejected "
871                             "request, gpn_rsp:\n", ha->host_no));
872                         DEBUG2_3(qla2x00_dump_buffer(sns_cmd->p.gpn_data, 16));
873                         rval = QLA_FUNCTION_FAILED;
874                 } else {
875                         /* Save portname */
876                         memcpy(list[i].port_name, &sns_cmd->p.gpn_data[16],
877                             WWN_SIZE);
878                 }
879
880                 /* Last device exit. */
881                 if (list[i].d_id.b.rsvd_1 != 0)
882                         break;
883         }
884
885         return (rval);
886 }
887
888 /**
889  * qla2x00_sns_gnn_id() - SNS Get Node Name (GNN_ID) query.
890  * @ha: HA context
891  * @list: switch info entries to populate
892  *
893  * This command uses the old Exectute SNS Command mailbox routine.
894  *
895  * Returns 0 on success.
896  */
897 static int
898 qla2x00_sns_gnn_id(scsi_qla_host_t *ha, sw_info_t *list)
899 {
900         int             rval;
901
902         uint16_t        i;
903         struct sns_cmd_pkt      *sns_cmd;
904
905         for (i = 0; i < MAX_FIBRE_DEVICES; i++) {
906                 /* Issue GNN_ID */
907                 /* Prepare SNS command request. */
908                 sns_cmd = qla2x00_prep_sns_cmd(ha, GNN_ID_CMD,
909                     GNN_ID_SNS_SCMD_LEN, GNN_ID_SNS_DATA_SIZE);
910
911                 /* Prepare SNS command arguments -- port_id. */
912                 sns_cmd->p.cmd.param[0] = list[i].d_id.b.al_pa;
913                 sns_cmd->p.cmd.param[1] = list[i].d_id.b.area;
914                 sns_cmd->p.cmd.param[2] = list[i].d_id.b.domain;
915
916                 /* Execute SNS command. */
917                 rval = qla2x00_send_sns(ha, ha->sns_cmd_dma,
918                     GNN_ID_SNS_CMD_SIZE / 2, sizeof(struct sns_cmd_pkt));
919                 if (rval != QLA_SUCCESS) {
920                         /*EMPTY*/
921                         DEBUG2_3(printk("scsi(%ld): GNN_ID Send SNS failed "
922                             "(%d).\n", ha->host_no, rval));
923                 } else if (sns_cmd->p.gnn_data[8] != 0x80 ||
924                     sns_cmd->p.gnn_data[9] != 0x02) {
925                         DEBUG2_3(printk("scsi(%ld): GNN_ID failed, rejected "
926                             "request, gnn_rsp:\n", ha->host_no));
927                         DEBUG2_3(qla2x00_dump_buffer(sns_cmd->p.gnn_data, 16));
928                         rval = QLA_FUNCTION_FAILED;
929                 } else {
930                         /* Save nodename */
931                         memcpy(list[i].node_name, &sns_cmd->p.gnn_data[16],
932                             WWN_SIZE);
933
934                         DEBUG2_3(printk("scsi(%ld): GID_PT entry - "
935                             "nn %02x%02x%02x%02x%02x%02x%02x%02x "
936                             "pn %02x%02x%02x%02x%02x%02x%02x%02x "
937                             "portid=%02x%02x%02x.\n",
938                             ha->host_no,
939                             list[i].node_name[0], list[i].node_name[1],
940                             list[i].node_name[2], list[i].node_name[3],
941                             list[i].node_name[4], list[i].node_name[5],
942                             list[i].node_name[6], list[i].node_name[7],
943                             list[i].port_name[0], list[i].port_name[1],
944                             list[i].port_name[2], list[i].port_name[3],
945                             list[i].port_name[4], list[i].port_name[5],
946                             list[i].port_name[6], list[i].port_name[7],
947                             list[i].d_id.b.domain, list[i].d_id.b.area,
948                             list[i].d_id.b.al_pa));
949                 }
950
951                 /* Last device exit. */
952                 if (list[i].d_id.b.rsvd_1 != 0)
953                         break;
954         }
955
956         return (rval);
957 }
958
959 /**
960  * qla2x00_snd_rft_id() - SNS Register FC-4 TYPEs (RFT_ID) supported by the HBA.
961  * @ha: HA context
962  *
963  * This command uses the old Exectute SNS Command mailbox routine.
964  *
965  * Returns 0 on success.
966  */
967 static int
968 qla2x00_sns_rft_id(scsi_qla_host_t *ha)
969 {
970         int             rval;
971
972         struct sns_cmd_pkt      *sns_cmd;
973
974         /* Issue RFT_ID. */
975         /* Prepare SNS command request. */
976         sns_cmd = qla2x00_prep_sns_cmd(ha, RFT_ID_CMD, RFT_ID_SNS_SCMD_LEN,
977             RFT_ID_SNS_DATA_SIZE);
978
979         /* Prepare SNS command arguments -- port_id, FC-4 types */
980         sns_cmd->p.cmd.param[0] = ha->d_id.b.al_pa;
981         sns_cmd->p.cmd.param[1] = ha->d_id.b.area;
982         sns_cmd->p.cmd.param[2] = ha->d_id.b.domain;
983
984         sns_cmd->p.cmd.param[5] = 0x01;                 /* FCP-3 */
985
986         /* Execute SNS command. */
987         rval = qla2x00_send_sns(ha, ha->sns_cmd_dma, RFT_ID_SNS_CMD_SIZE / 2,
988             sizeof(struct sns_cmd_pkt));
989         if (rval != QLA_SUCCESS) {
990                 /*EMPTY*/
991                 DEBUG2_3(printk("scsi(%ld): RFT_ID Send SNS failed (%d).\n",
992                     ha->host_no, rval));
993         } else if (sns_cmd->p.rft_data[8] != 0x80 ||
994             sns_cmd->p.rft_data[9] != 0x02) {
995                 DEBUG2_3(printk("scsi(%ld): RFT_ID failed, rejected request, "
996                     "rft_rsp:\n", ha->host_no));
997                 DEBUG2_3(qla2x00_dump_buffer(sns_cmd->p.rft_data, 16));
998                 rval = QLA_FUNCTION_FAILED;
999         } else {
1000                 DEBUG2(printk("scsi(%ld): RFT_ID exiting normally.\n",
1001                     ha->host_no));
1002         }
1003
1004         return (rval);
1005 }
1006
1007 /**
1008  * qla2x00_sns_rnn_id() - SNS Register Node Name (RNN_ID) of the HBA.
1009  * HBA.
1010  * @ha: HA context
1011  *
1012  * This command uses the old Exectute SNS Command mailbox routine.
1013  *
1014  * Returns 0 on success.
1015  */
1016 static int
1017 qla2x00_sns_rnn_id(scsi_qla_host_t *ha)
1018 {
1019         int             rval;
1020
1021         struct sns_cmd_pkt      *sns_cmd;
1022
1023         /* Issue RNN_ID. */
1024         /* Prepare SNS command request. */
1025         sns_cmd = qla2x00_prep_sns_cmd(ha, RNN_ID_CMD, RNN_ID_SNS_SCMD_LEN,
1026             RNN_ID_SNS_DATA_SIZE);
1027
1028         /* Prepare SNS command arguments -- port_id, nodename. */
1029         sns_cmd->p.cmd.param[0] = ha->d_id.b.al_pa;
1030         sns_cmd->p.cmd.param[1] = ha->d_id.b.area;
1031         sns_cmd->p.cmd.param[2] = ha->d_id.b.domain;
1032
1033         sns_cmd->p.cmd.param[4] = ha->init_cb->node_name[7];
1034         sns_cmd->p.cmd.param[5] = ha->init_cb->node_name[6];
1035         sns_cmd->p.cmd.param[6] = ha->init_cb->node_name[5];
1036         sns_cmd->p.cmd.param[7] = ha->init_cb->node_name[4];
1037         sns_cmd->p.cmd.param[8] = ha->init_cb->node_name[3];
1038         sns_cmd->p.cmd.param[9] = ha->init_cb->node_name[2];
1039         sns_cmd->p.cmd.param[10] = ha->init_cb->node_name[1];
1040         sns_cmd->p.cmd.param[11] = ha->init_cb->node_name[0];
1041
1042         /* Execute SNS command. */
1043         rval = qla2x00_send_sns(ha, ha->sns_cmd_dma, RNN_ID_SNS_CMD_SIZE / 2,
1044             sizeof(struct sns_cmd_pkt));
1045         if (rval != QLA_SUCCESS) {
1046                 /*EMPTY*/
1047                 DEBUG2_3(printk("scsi(%ld): RNN_ID Send SNS failed (%d).\n",
1048                     ha->host_no, rval));
1049         } else if (sns_cmd->p.rnn_data[8] != 0x80 ||
1050             sns_cmd->p.rnn_data[9] != 0x02) {
1051                 DEBUG2_3(printk("scsi(%ld): RNN_ID failed, rejected request, "
1052                     "rnn_rsp:\n", ha->host_no));
1053                 DEBUG2_3(qla2x00_dump_buffer(sns_cmd->p.rnn_data, 16));
1054                 rval = QLA_FUNCTION_FAILED;
1055         } else {
1056                 DEBUG2(printk("scsi(%ld): RNN_ID exiting normally.\n",
1057                     ha->host_no));
1058         }
1059
1060         return (rval);
1061 }