]> git.ipfire.org Git - ipfire-2.x.git/blame - src/patches/suse-2.6.27.39/patches.drivers/lpfc-8.2.8-update
Fix oinkmaster patch.
[ipfire-2.x.git] / src / patches / suse-2.6.27.39 / patches.drivers / lpfc-8.2.8-update
CommitLineData
2cb7cef9
BS
1From: Jamie Wellnitz <jamie.wellnitz@emulex.com>
2Subject: Emulex lpfc driver update to 8.2.8
3References: FATE#303485,bnc#420767
4
5Update Emulex lpfc driver from 8.2.7 to 8.2.8
6
7Signed-off-by: Hannes Reinecke <hare@suse.de>
8
9---
10 drivers/scsi/lpfc/lpfc.h | 96 +-
11 drivers/scsi/lpfc/lpfc_attr.c | 1375 +++++++++++++++++++++++++++++
12 drivers/scsi/lpfc/lpfc_crtn.h | 51 -
13 drivers/scsi/lpfc/lpfc_ct.c | 20
14 drivers/scsi/lpfc/lpfc_debugfs.c | 400 +++++++-
15 drivers/scsi/lpfc/lpfc_disc.h | 23
16 drivers/scsi/lpfc/lpfc_els.c | 1712 ++++++++++++++++++++++++++++++++++--
17 drivers/scsi/lpfc/lpfc_hbadisc.c | 233 ++++-
18 drivers/scsi/lpfc/lpfc_hw.h | 183 +++
19 drivers/scsi/lpfc/lpfc_init.c | 924 +++++++++++++++----
20 drivers/scsi/lpfc/lpfc_mbox.c | 624 +++++++++++--
21 drivers/scsi/lpfc/lpfc_mem.c | 116 ++
22 drivers/scsi/lpfc/lpfc_nl.h | 163 +++
23 drivers/scsi/lpfc/lpfc_nportdisc.c | 24
24 drivers/scsi/lpfc/lpfc_scsi.c | 516 ++++++++++-
25 drivers/scsi/lpfc/lpfc_scsi.h | 5
26 drivers/scsi/lpfc/lpfc_sli.c | 1715 ++++++++++++++++++++++++++++++++-----
27 drivers/scsi/lpfc/lpfc_sli.h | 1
28 drivers/scsi/lpfc/lpfc_version.h | 6
29 drivers/scsi/lpfc/lpfc_vport.c | 168 +++
30 drivers/scsi/lpfc/lpfc_vport.h | 4
31 21 files changed, 7464 insertions(+), 895 deletions(-)
32
33--- a/drivers/scsi/lpfc/lpfc_attr.c
34+++ b/drivers/scsi/lpfc/lpfc_attr.c
35@@ -32,6 +32,7 @@
36
37 #include "lpfc_hw.h"
38 #include "lpfc_sli.h"
39+#include "lpfc_nl.h"
40 #include "lpfc_disc.h"
41 #include "lpfc_scsi.h"
42 #include "lpfc.h"
43@@ -49,6 +50,21 @@
44 #define LPFC_LINK_SPEED_BITMAP 0x00000117
45 #define LPFC_LINK_SPEED_STRING "0, 1, 2, 4, 8"
46
47+/**
48+ * lpfc_jedec_to_ascii: Hex to ascii convertor according to JEDEC rules.
49+ * @incr: integer to convert.
50+ * @hdw: ascii string holding converted integer plus a string terminator.
51+ *
52+ * Description:
53+ * JEDEC Joint Electron Device Engineering Council.
54+ * Convert a 32 bit integer composed of 8 nibbles into an 8 byte ascii
55+ * character string. The string is then terminated with a NULL in byte 9.
56+ * Hex 0-9 becomes ascii '0' to '9'.
57+ * Hex a-f becomes ascii '=' to 'B' capital B.
58+ *
59+ * Notes:
60+ * Coded for 32 bit integers only.
61+ **/
62 static void
63 lpfc_jedec_to_ascii(int incr, char hdw[])
64 {
65@@ -65,6 +81,14 @@ lpfc_jedec_to_ascii(int incr, char hdw[]
66 return;
67 }
68
69+/**
70+ * lpfc_drvr_version_show: Return the Emulex driver string with version number.
71+ * @dev: class unused variable.
72+ * @attr: device attribute, not used.
73+ * @buf: on return contains the module description text.
74+ *
75+ * Returns: size of formatted string.
76+ **/
77 static ssize_t
78 lpfc_drvr_version_show(struct device *dev, struct device_attribute *attr,
79 char *buf)
80@@ -72,6 +96,14 @@ lpfc_drvr_version_show(struct device *de
81 return snprintf(buf, PAGE_SIZE, LPFC_MODULE_DESC "\n");
82 }
83
84+/**
85+ * lpfc_info_show: Return some pci info about the host in ascii.
86+ * @dev: class converted to a Scsi_host structure.
87+ * @attr: device attribute, not used.
88+ * @buf: on return contains the formatted text from lpfc_info().
89+ *
90+ * Returns: size of formatted string.
91+ **/
92 static ssize_t
93 lpfc_info_show(struct device *dev, struct device_attribute *attr,
94 char *buf)
95@@ -81,6 +113,14 @@ lpfc_info_show(struct device *dev, struc
96 return snprintf(buf, PAGE_SIZE, "%s\n",lpfc_info(host));
97 }
98
99+/**
100+ * lpfc_serialnum_show: Return the hba serial number in ascii.
101+ * @dev: class converted to a Scsi_host structure.
102+ * @attr: device attribute, not used.
103+ * @buf: on return contains the formatted text serial number.
104+ *
105+ * Returns: size of formatted string.
106+ **/
107 static ssize_t
108 lpfc_serialnum_show(struct device *dev, struct device_attribute *attr,
109 char *buf)
110@@ -92,6 +132,18 @@ lpfc_serialnum_show(struct device *dev,
111 return snprintf(buf, PAGE_SIZE, "%s\n",phba->SerialNumber);
112 }
113
114+/**
115+ * lpfc_temp_sensor_show: Return the temperature sensor level.
116+ * @dev: class converted to a Scsi_host structure.
117+ * @attr: device attribute, not used.
118+ * @buf: on return contains the formatted support level.
119+ *
120+ * Description:
121+ * Returns a number indicating the temperature sensor level currently
122+ * supported, zero or one in ascii.
123+ *
124+ * Returns: size of formatted string.
125+ **/
126 static ssize_t
127 lpfc_temp_sensor_show(struct device *dev, struct device_attribute *attr,
128 char *buf)
129@@ -102,6 +154,14 @@ lpfc_temp_sensor_show(struct device *dev
130 return snprintf(buf, PAGE_SIZE, "%d\n",phba->temp_sensor_support);
131 }
132
133+/**
134+ * lpfc_modeldesc_show: Return the model description of the hba.
135+ * @dev: class converted to a Scsi_host structure.
136+ * @attr: device attribute, not used.
137+ * @buf: on return contains the scsi vpd model description.
138+ *
139+ * Returns: size of formatted string.
140+ **/
141 static ssize_t
142 lpfc_modeldesc_show(struct device *dev, struct device_attribute *attr,
143 char *buf)
144@@ -113,6 +173,14 @@ lpfc_modeldesc_show(struct device *dev,
145 return snprintf(buf, PAGE_SIZE, "%s\n",phba->ModelDesc);
146 }
147
148+/**
149+ * lpfc_modelname_show: Return the model name of the hba.
150+ * @dev: class converted to a Scsi_host structure.
151+ * @attr: device attribute, not used.
152+ * @buf: on return contains the scsi vpd model name.
153+ *
154+ * Returns: size of formatted string.
155+ **/
156 static ssize_t
157 lpfc_modelname_show(struct device *dev, struct device_attribute *attr,
158 char *buf)
159@@ -124,6 +192,14 @@ lpfc_modelname_show(struct device *dev,
160 return snprintf(buf, PAGE_SIZE, "%s\n",phba->ModelName);
161 }
162
163+/**
164+ * lpfc_programtype_show: Return the program type of the hba.
165+ * @dev: class converted to a Scsi_host structure.
166+ * @attr: device attribute, not used.
167+ * @buf: on return contains the scsi vpd program type.
168+ *
169+ * Returns: size of formatted string.
170+ **/
171 static ssize_t
172 lpfc_programtype_show(struct device *dev, struct device_attribute *attr,
173 char *buf)
174@@ -135,6 +211,33 @@ lpfc_programtype_show(struct device *dev
175 return snprintf(buf, PAGE_SIZE, "%s\n",phba->ProgramType);
176 }
177
178+/**
179+ * lpfc_mlomgmt_show: Return the Menlo Maintenance sli flag.
180+ * @dev: class converted to a Scsi_host structure.
181+ * @attr: device attribute, not used.
182+ * @buf: on return contains the Menlo Maintenance sli flag.
183+ *
184+ * Returns: size of formatted string.
185+ **/
186+static ssize_t
187+lpfc_mlomgmt_show(struct device *dev, struct device_attribute *attr, char *buf)
188+{
189+ struct Scsi_Host *shost = class_to_shost(dev);
190+ struct lpfc_vport *vport = (struct lpfc_vport *)shost->hostdata;
191+ struct lpfc_hba *phba = vport->phba;
192+
193+ return snprintf(buf, PAGE_SIZE, "%d\n",
194+ (phba->sli.sli_flag & LPFC_MENLO_MAINT));
195+}
196+
197+/**
198+ * lpfc_vportnum_show: Return the port number in ascii of the hba.
199+ * @dev: class converted to a Scsi_host structure.
200+ * @attr: device attribute, not used.
201+ * @buf: on return contains scsi vpd program type.
202+ *
203+ * Returns: size of formatted string.
204+ **/
205 static ssize_t
206 lpfc_vportnum_show(struct device *dev, struct device_attribute *attr,
207 char *buf)
208@@ -146,6 +249,14 @@ lpfc_vportnum_show(struct device *dev, s
209 return snprintf(buf, PAGE_SIZE, "%s\n",phba->Port);
210 }
211
212+/**
213+ * lpfc_fwrev_show: Return the firmware rev running in the hba.
214+ * @dev: class converted to a Scsi_host structure.
215+ * @attr: device attribute, not used.
216+ * @buf: on return contains the scsi vpd program type.
217+ *
218+ * Returns: size of formatted string.
219+ **/
220 static ssize_t
221 lpfc_fwrev_show(struct device *dev, struct device_attribute *attr,
222 char *buf)
223@@ -159,6 +270,14 @@ lpfc_fwrev_show(struct device *dev, stru
224 return snprintf(buf, PAGE_SIZE, "%s, sli-%d\n", fwrev, phba->sli_rev);
225 }
226
227+/**
228+ * lpfc_hdw_show: Return the jedec information about the hba.
229+ * @dev: class converted to a Scsi_host structure.
230+ * @attr: device attribute, not used.
231+ * @buf: on return contains the scsi vpd program type.
232+ *
233+ * Returns: size of formatted string.
234+ **/
235 static ssize_t
236 lpfc_hdw_show(struct device *dev, struct device_attribute *attr, char *buf)
237 {
238@@ -171,6 +290,15 @@ lpfc_hdw_show(struct device *dev, struct
239 lpfc_jedec_to_ascii(vp->rev.biuRev, hdw);
240 return snprintf(buf, PAGE_SIZE, "%s\n", hdw);
241 }
242+
243+/**
244+ * lpfc_option_rom_version_show: Return the adapter ROM FCode version.
245+ * @dev: class converted to a Scsi_host structure.
246+ * @attr: device attribute, not used.
247+ * @buf: on return contains the ROM and FCode ascii strings.
248+ *
249+ * Returns: size of formatted string.
250+ **/
251 static ssize_t
252 lpfc_option_rom_version_show(struct device *dev, struct device_attribute *attr,
253 char *buf)
254@@ -181,6 +309,18 @@ lpfc_option_rom_version_show(struct devi
255
256 return snprintf(buf, PAGE_SIZE, "%s\n", phba->OptionROMVersion);
257 }
258+
259+/**
260+ * lpfc_state_show: Return the link state of the port.
261+ * @dev: class converted to a Scsi_host structure.
262+ * @attr: device attribute, not used.
263+ * @buf: on return contains text describing the state of the link.
264+ *
265+ * Notes:
266+ * The switch statement has no default so zero will be returned.
267+ *
268+ * Returns: size of formatted string.
269+ **/
270 static ssize_t
271 lpfc_link_state_show(struct device *dev, struct device_attribute *attr,
272 char *buf)
273@@ -232,8 +372,10 @@ lpfc_link_state_show(struct device *dev,
274 "Unknown\n");
275 break;
276 }
277-
278- if (phba->fc_topology == TOPOLOGY_LOOP) {
279+ if (phba->sli.sli_flag & LPFC_MENLO_MAINT)
280+ len += snprintf(buf + len, PAGE_SIZE-len,
281+ " Menlo Maint Mode\n");
282+ else if (phba->fc_topology == TOPOLOGY_LOOP) {
283 if (vport->fc_flag & FC_PUBLIC_LOOP)
284 len += snprintf(buf + len, PAGE_SIZE-len,
285 " Public Loop\n");
286@@ -253,6 +395,18 @@ lpfc_link_state_show(struct device *dev,
287 return len;
288 }
289
290+/**
291+ * lpfc_num_discovered_ports_show: Return sum of mapped and unmapped vports.
292+ * @dev: class device that is converted into a Scsi_host.
293+ * @attr: device attribute, not used.
294+ * @buf: on return contains the sum of fc mapped and unmapped.
295+ *
296+ * Description:
297+ * Returns the ascii text number of the sum of the fc mapped and unmapped
298+ * vport counts.
299+ *
300+ * Returns: size of formatted string.
301+ **/
302 static ssize_t
303 lpfc_num_discovered_ports_show(struct device *dev,
304 struct device_attribute *attr, char *buf)
305@@ -264,7 +418,20 @@ lpfc_num_discovered_ports_show(struct de
306 vport->fc_map_cnt + vport->fc_unmap_cnt);
307 }
308
309-
310+/**
311+ * lpfc_issue_lip: Misnomer, name carried over from long ago.
312+ * @shost: Scsi_Host pointer.
313+ *
314+ * Description:
315+ * Bring the link down gracefully then re-init the link. The firmware will
316+ * re-init the fiber channel interface as required. Does not issue a LIP.
317+ *
318+ * Returns:
319+ * -EPERM port offline or management commands are being blocked
320+ * -ENOMEM cannot allocate memory for the mailbox command
321+ * -EIO error sending the mailbox command
322+ * zero for success
323+ **/
324 static int
325 lpfc_issue_lip(struct Scsi_Host *shost)
326 {
327@@ -306,6 +473,21 @@ lpfc_issue_lip(struct Scsi_Host *shost)
328 return 0;
329 }
330
331+/**
332+ * lpfc_do_offline: Issues a mailbox command to bring the link down.
333+ * @phba: lpfc_hba pointer.
334+ * @type: LPFC_EVT_OFFLINE, LPFC_EVT_WARM_START, LPFC_EVT_KILL.
335+ *
336+ * Notes:
337+ * Assumes any error from lpfc_do_offline() will be negative.
338+ * Can wait up to 5 seconds for the port ring buffers count
339+ * to reach zero, prints a warning if it is not zero and continues.
340+ * lpfc_workq_post_event() returns a non-zero return coce if call fails.
341+ *
342+ * Returns:
343+ * -EIO error posting the event
344+ * zero for success
345+ **/
346 static int
347 lpfc_do_offline(struct lpfc_hba *phba, uint32_t type)
348 {
349@@ -353,6 +535,22 @@ lpfc_do_offline(struct lpfc_hba *phba, u
350 return 0;
351 }
352
353+/**
354+ * lpfc_selective_reset: Offline then onlines the port.
355+ * @phba: lpfc_hba pointer.
356+ *
357+ * Description:
358+ * If the port is configured to allow a reset then the hba is brought
359+ * offline then online.
360+ *
361+ * Notes:
362+ * Assumes any error from lpfc_do_offline() will be negative.
363+ *
364+ * Returns:
365+ * lpfc_do_offline() return code if not zero
366+ * -EIO reset not configured or error posting the event
367+ * zero for success
368+ **/
369 static int
370 lpfc_selective_reset(struct lpfc_hba *phba)
371 {
372@@ -378,6 +576,27 @@ lpfc_selective_reset(struct lpfc_hba *ph
373 return 0;
374 }
375
376+/**
377+ * lpfc_issue_reset: Selectively resets an adapter.
378+ * @dev: class device that is converted into a Scsi_host.
379+ * @attr: device attribute, not used.
380+ * @buf: containing the string "selective".
381+ * @count: unused variable.
382+ *
383+ * Description:
384+ * If the buf contains the string "selective" then lpfc_selective_reset()
385+ * is called to perform the reset.
386+ *
387+ * Notes:
388+ * Assumes any error from lpfc_selective_reset() will be negative.
389+ * If lpfc_selective_reset() returns zero then the length of the buffer
390+ * is returned which indicates succcess
391+ *
392+ * Returns:
393+ * -EINVAL if the buffer does not contain the string "selective"
394+ * length of buf if lpfc-selective_reset() if the call succeeds
395+ * return value of lpfc_selective_reset() if the call fails
396+**/
397 static ssize_t
398 lpfc_issue_reset(struct device *dev, struct device_attribute *attr,
399 const char *buf, size_t count)
400@@ -397,6 +616,14 @@ lpfc_issue_reset(struct device *dev, str
401 return status;
402 }
403
404+/**
405+ * lpfc_nport_evt_cnt_show: Return the number of nport events.
406+ * @dev: class device that is converted into a Scsi_host.
407+ * @attr: device attribute, not used.
408+ * @buf: on return contains the ascii number of nport events.
409+ *
410+ * Returns: size of formatted string.
411+ **/
412 static ssize_t
413 lpfc_nport_evt_cnt_show(struct device *dev, struct device_attribute *attr,
414 char *buf)
415@@ -408,6 +635,14 @@ lpfc_nport_evt_cnt_show(struct device *d
416 return snprintf(buf, PAGE_SIZE, "%d\n", phba->nport_event_cnt);
417 }
418
419+/**
420+ * lpfc_board_mode_show: Return the state of the board.
421+ * @dev: class device that is converted into a Scsi_host.
422+ * @attr: device attribute, not used.
423+ * @buf: on return contains the state of the adapter.
424+ *
425+ * Returns: size of formatted string.
426+ **/
427 static ssize_t
428 lpfc_board_mode_show(struct device *dev, struct device_attribute *attr,
429 char *buf)
430@@ -429,6 +664,19 @@ lpfc_board_mode_show(struct device *dev,
431 return snprintf(buf, PAGE_SIZE, "%s\n", state);
432 }
433
434+/**
435+ * lpfc_board_mode_store: Puts the hba in online, offline, warm or error state.
436+ * @dev: class device that is converted into a Scsi_host.
437+ * @attr: device attribute, not used.
438+ * @buf: containing one of the strings "online", "offline", "warm" or "error".
439+ * @count: unused variable.
440+ *
441+ * Returns:
442+ * -EACCES if enable hba reset not enabled
443+ * -EINVAL if the buffer does not contain a valid string (see above)
444+ * -EIO if lpfc_workq_post_event() or lpfc_do_offline() fails
445+ * buf length greater than zero indicates success
446+ **/
447 static ssize_t
448 lpfc_board_mode_store(struct device *dev, struct device_attribute *attr,
449 const char *buf, size_t count)
450@@ -462,6 +710,24 @@ lpfc_board_mode_store(struct device *dev
451 return -EIO;
452 }
453
454+/**
455+ * lpfc_get_hba_info: Return various bits of informaton about the adapter.
456+ * @phba: pointer to the adapter structure.
457+ * @mxri max xri count.
458+ * @axri available xri count.
459+ * @mrpi max rpi count.
460+ * @arpi available rpi count.
461+ * @mvpi max vpi count.
462+ * @avpi available vpi count.
463+ *
464+ * Description:
465+ * If an integer pointer for an count is not null then the value for the
466+ * count is returned.
467+ *
468+ * Returns:
469+ * zero on error
470+ * one for success
471+ **/
472 static int
473 lpfc_get_hba_info(struct lpfc_hba *phba,
474 uint32_t *mxri, uint32_t *axri,
475@@ -524,6 +790,20 @@ lpfc_get_hba_info(struct lpfc_hba *phba,
476 return 1;
477 }
478
479+/**
480+ * lpfc_max_rpi_show: Return maximum rpi.
481+ * @dev: class device that is converted into a Scsi_host.
482+ * @attr: device attribute, not used.
483+ * @buf: on return contains the maximum rpi count in decimal or "Unknown".
484+ *
485+ * Description:
486+ * Calls lpfc_get_hba_info() asking for just the mrpi count.
487+ * If lpfc_get_hba_info() returns zero (failure) the buffer text is set
488+ * to "Unknown" and the buffer length is returned, therefore the caller
489+ * must check for "Unknown" in the buffer to detect a failure.
490+ *
491+ * Returns: size of formatted string.
492+ **/
493 static ssize_t
494 lpfc_max_rpi_show(struct device *dev, struct device_attribute *attr,
495 char *buf)
496@@ -538,6 +818,20 @@ lpfc_max_rpi_show(struct device *dev, st
497 return snprintf(buf, PAGE_SIZE, "Unknown\n");
498 }
499
500+/**
501+ * lpfc_used_rpi_show: Return maximum rpi minus available rpi.
502+ * @dev: class device that is converted into a Scsi_host.
503+ * @attr: device attribute, not used.
504+ * @buf: containing the used rpi count in decimal or "Unknown".
505+ *
506+ * Description:
507+ * Calls lpfc_get_hba_info() asking for just the mrpi and arpi counts.
508+ * If lpfc_get_hba_info() returns zero (failure) the buffer text is set
509+ * to "Unknown" and the buffer length is returned, therefore the caller
510+ * must check for "Unknown" in the buffer to detect a failure.
511+ *
512+ * Returns: size of formatted string.
513+ **/
514 static ssize_t
515 lpfc_used_rpi_show(struct device *dev, struct device_attribute *attr,
516 char *buf)
517@@ -552,6 +846,20 @@ lpfc_used_rpi_show(struct device *dev, s
518 return snprintf(buf, PAGE_SIZE, "Unknown\n");
519 }
520
521+/**
522+ * lpfc_max_xri_show: Return maximum xri.
523+ * @dev: class device that is converted into a Scsi_host.
524+ * @attr: device attribute, not used.
525+ * @buf: on return contains the maximum xri count in decimal or "Unknown".
526+ *
527+ * Description:
528+ * Calls lpfc_get_hba_info() asking for just the mrpi count.
529+ * If lpfc_get_hba_info() returns zero (failure) the buffer text is set
530+ * to "Unknown" and the buffer length is returned, therefore the caller
531+ * must check for "Unknown" in the buffer to detect a failure.
532+ *
533+ * Returns: size of formatted string.
534+ **/
535 static ssize_t
536 lpfc_max_xri_show(struct device *dev, struct device_attribute *attr,
537 char *buf)
538@@ -566,6 +874,20 @@ lpfc_max_xri_show(struct device *dev, st
539 return snprintf(buf, PAGE_SIZE, "Unknown\n");
540 }
541
542+/**
543+ * lpfc_used_xri_show: Return maximum xpi minus the available xpi.
544+ * @dev: class device that is converted into a Scsi_host.
545+ * @attr: device attribute, not used.
546+ * @buf: on return contains the used xri count in decimal or "Unknown".
547+ *
548+ * Description:
549+ * Calls lpfc_get_hba_info() asking for just the mxri and axri counts.
550+ * If lpfc_get_hba_info() returns zero (failure) the buffer text is set
551+ * to "Unknown" and the buffer length is returned, therefore the caller
552+ * must check for "Unknown" in the buffer to detect a failure.
553+ *
554+ * Returns: size of formatted string.
555+ **/
556 static ssize_t
557 lpfc_used_xri_show(struct device *dev, struct device_attribute *attr,
558 char *buf)
559@@ -580,6 +902,20 @@ lpfc_used_xri_show(struct device *dev, s
560 return snprintf(buf, PAGE_SIZE, "Unknown\n");
561 }
562
563+/**
564+ * lpfc_max_vpi_show: Return maximum vpi.
565+ * @dev: class device that is converted into a Scsi_host.
566+ * @attr: device attribute, not used.
567+ * @buf: on return contains the maximum vpi count in decimal or "Unknown".
568+ *
569+ * Description:
570+ * Calls lpfc_get_hba_info() asking for just the mvpi count.
571+ * If lpfc_get_hba_info() returns zero (failure) the buffer text is set
572+ * to "Unknown" and the buffer length is returned, therefore the caller
573+ * must check for "Unknown" in the buffer to detect a failure.
574+ *
575+ * Returns: size of formatted string.
576+ **/
577 static ssize_t
578 lpfc_max_vpi_show(struct device *dev, struct device_attribute *attr,
579 char *buf)
580@@ -594,6 +930,20 @@ lpfc_max_vpi_show(struct device *dev, st
581 return snprintf(buf, PAGE_SIZE, "Unknown\n");
582 }
583
584+/**
585+ * lpfc_used_vpi_show: Return maximum vpi minus the available vpi.
586+ * @dev: class device that is converted into a Scsi_host.
587+ * @attr: device attribute, not used.
588+ * @buf: on return contains the used vpi count in decimal or "Unknown".
589+ *
590+ * Description:
591+ * Calls lpfc_get_hba_info() asking for just the mvpi and avpi counts.
592+ * If lpfc_get_hba_info() returns zero (failure) the buffer text is set
593+ * to "Unknown" and the buffer length is returned, therefore the caller
594+ * must check for "Unknown" in the buffer to detect a failure.
595+ *
596+ * Returns: size of formatted string.
597+ **/
598 static ssize_t
599 lpfc_used_vpi_show(struct device *dev, struct device_attribute *attr,
600 char *buf)
601@@ -608,6 +958,19 @@ lpfc_used_vpi_show(struct device *dev, s
602 return snprintf(buf, PAGE_SIZE, "Unknown\n");
603 }
604
605+/**
606+ * lpfc_npiv_info_show: Return text about NPIV support for the adapter.
607+ * @dev: class device that is converted into a Scsi_host.
608+ * @attr: device attribute, not used.
609+ * @buf: text that must be interpreted to determine if npiv is supported.
610+ *
611+ * Description:
612+ * Buffer will contain text indicating npiv is not suppoerted on the port,
613+ * the port is an NPIV physical port, or it is an npiv virtual port with
614+ * the id of the vport.
615+ *
616+ * Returns: size of formatted string.
617+ **/
618 static ssize_t
619 lpfc_npiv_info_show(struct device *dev, struct device_attribute *attr,
620 char *buf)
621@@ -623,6 +986,17 @@ lpfc_npiv_info_show(struct device *dev,
622 return snprintf(buf, PAGE_SIZE, "NPIV Virtual (VPI %d)\n", vport->vpi);
623 }
624
625+/**
626+ * lpfc_poll_show: Return text about poll support for the adapter.
627+ * @dev: class device that is converted into a Scsi_host.
628+ * @attr: device attribute, not used.
629+ * @buf: on return contains the cfg_poll in hex.
630+ *
631+ * Notes:
632+ * cfg_poll should be a lpfc_polling_flags type.
633+ *
634+ * Returns: size of formatted string.
635+ **/
636 static ssize_t
637 lpfc_poll_show(struct device *dev, struct device_attribute *attr,
638 char *buf)
639@@ -634,6 +1008,20 @@ lpfc_poll_show(struct device *dev, struc
640 return snprintf(buf, PAGE_SIZE, "%#x\n", phba->cfg_poll);
641 }
642
643+/**
644+ * lpfc_poll_store: Set the value of cfg_poll for the adapter.
645+ * @dev: class device that is converted into a Scsi_host.
646+ * @attr: device attribute, not used.
647+ * @buf: one or more lpfc_polling_flags values.
648+ * @count: not used.
649+ *
650+ * Notes:
651+ * buf contents converted to integer and checked for a valid value.
652+ *
653+ * Returns:
654+ * -EINVAL if the buffer connot be converted or is out of range
655+ * length of the buf on success
656+ **/
657 static ssize_t
658 lpfc_poll_store(struct device *dev, struct device_attribute *attr,
659 const char *buf, size_t count)
660@@ -692,6 +1080,20 @@ lpfc_poll_store(struct device *dev, stru
661 return strlen(buf);
662 }
663
664+/**
665+ * lpfc_param_show: Return a cfg attribute value in decimal.
666+ *
667+ * Description:
668+ * Macro that given an attr e.g. hba_queue_depth expands
669+ * into a function with the name lpfc_hba_queue_depth_show.
670+ *
671+ * lpfc_##attr##_show: Return the decimal value of an adapters cfg_xxx field.
672+ * @dev: class device that is converted into a Scsi_host.
673+ * @attr: device attribute, not used.
674+ * @buf: on return contains the attribute value in decimal.
675+ *
676+ * Returns: size of formatted string.
677+ **/
678 #define lpfc_param_show(attr) \
679 static ssize_t \
680 lpfc_##attr##_show(struct device *dev, struct device_attribute *attr, \
681@@ -706,6 +1108,20 @@ lpfc_##attr##_show(struct device *dev, s
682 phba->cfg_##attr);\
683 }
684
685+/**
686+ * lpfc_param_hex_show: Return a cfg attribute value in hex.
687+ *
688+ * Description:
689+ * Macro that given an attr e.g. hba_queue_depth expands
690+ * into a function with the name lpfc_hba_queue_depth_show
691+ *
692+ * lpfc_##attr##_show: Return the hex value of an adapters cfg_xxx field.
693+ * @dev: class device that is converted into a Scsi_host.
694+ * @attr: device attribute, not used.
695+ * @buf: on return contains the attribute value in hexidecimal.
696+ *
697+ * Returns: size of formatted string.
698+ **/
699 #define lpfc_param_hex_show(attr) \
700 static ssize_t \
701 lpfc_##attr##_show(struct device *dev, struct device_attribute *attr, \
702@@ -720,6 +1136,25 @@ lpfc_##attr##_show(struct device *dev, s
703 phba->cfg_##attr);\
704 }
705
706+/**
707+ * lpfc_param_init: Intializes a cfg attribute.
708+ *
709+ * Description:
710+ * Macro that given an attr e.g. hba_queue_depth expands
711+ * into a function with the name lpfc_hba_queue_depth_init. The macro also
712+ * takes a default argument, a minimum and maximum argument.
713+ *
714+ * lpfc_##attr##_init: Initializes an attribute.
715+ * @phba: pointer the the adapter structure.
716+ * @val: integer attribute value.
717+ *
718+ * Validates the min and max values then sets the adapter config field
719+ * accordingly, or uses the default if out of range and prints an error message.
720+ *
721+ * Returns:
722+ * zero on success
723+ * -EINVAL if default used
724+ **/
725 #define lpfc_param_init(attr, default, minval, maxval) \
726 static int \
727 lpfc_##attr##_init(struct lpfc_hba *phba, int val) \
728@@ -735,6 +1170,26 @@ lpfc_##attr##_init(struct lpfc_hba *phba
729 return -EINVAL;\
730 }
731
732+/**
733+ * lpfc_param_set: Set a cfg attribute value.
734+ *
735+ * Description:
736+ * Macro that given an attr e.g. hba_queue_depth expands
737+ * into a function with the name lpfc_hba_queue_depth_set
738+ *
739+ * lpfc_##attr##_set: Sets an attribute value.
740+ * @phba: pointer the the adapter structure.
741+ * @val: integer attribute value.
742+ *
743+ * Description:
744+ * Validates the min and max values then sets the
745+ * adapter config field if in the valid range. prints error message
746+ * and does not set the parameter if invalid.
747+ *
748+ * Returns:
749+ * zero on success
750+ * -EINVAL if val is invalid
751+ **/
752 #define lpfc_param_set(attr, default, minval, maxval) \
753 static int \
754 lpfc_##attr##_set(struct lpfc_hba *phba, int val) \
755@@ -749,6 +1204,27 @@ lpfc_##attr##_set(struct lpfc_hba *phba,
756 return -EINVAL;\
757 }
758
759+/**
760+ * lpfc_param_store: Set a vport attribute value.
761+ *
762+ * Description:
763+ * Macro that given an attr e.g. hba_queue_depth expands
764+ * into a function with the name lpfc_hba_queue_depth_store.
765+ *
766+ * lpfc_##attr##_store: Set an sttribute value.
767+ * @dev: class device that is converted into a Scsi_host.
768+ * @attr: device attribute, not used.
769+ * @buf: contains the attribute value in ascii.
770+ * @count: not used.
771+ *
772+ * Description:
773+ * Convert the ascii text number to an integer, then
774+ * use the lpfc_##attr##_set function to set the value.
775+ *
776+ * Returns:
777+ * -EINVAL if val is invalid or lpfc_##attr##_set() fails
778+ * length of buffer upon success.
779+ **/
780 #define lpfc_param_store(attr) \
781 static ssize_t \
782 lpfc_##attr##_store(struct device *dev, struct device_attribute *attr, \
783@@ -768,6 +1244,20 @@ lpfc_##attr##_store(struct device *dev,
784 return -EINVAL;\
785 }
786
787+/**
788+ * lpfc_vport_param_show: Return decimal formatted cfg attribute value.
789+ *
790+ * Description:
791+ * Macro that given an attr e.g. hba_queue_depth expands
792+ * into a function with the name lpfc_hba_queue_depth_show
793+ *
794+ * lpfc_##attr##_show: prints the attribute value in decimal.
795+ * @dev: class device that is converted into a Scsi_host.
796+ * @attr: device attribute, not used.
797+ * @buf: on return contains the attribute value in decimal.
798+ *
799+ * Returns: length of formatted string.
800+ **/
801 #define lpfc_vport_param_show(attr) \
802 static ssize_t \
803 lpfc_##attr##_show(struct device *dev, struct device_attribute *attr, \
804@@ -780,6 +1270,21 @@ lpfc_##attr##_show(struct device *dev, s
805 return snprintf(buf, PAGE_SIZE, "%d\n", vport->cfg_##attr);\
806 }
807
808+/**
809+ * lpfc_vport_param_hex_show: Return hex formatted attribute value.
810+ *
811+ * Description:
812+ * Macro that given an attr e.g.
813+ * hba_queue_depth expands into a function with the name
814+ * lpfc_hba_queue_depth_show
815+ *
816+ * lpfc_##attr##_show: prints the attribute value in hexidecimal.
817+ * @dev: class device that is converted into a Scsi_host.
818+ * @attr: device attribute, not used.
819+ * @buf: on return contains the attribute value in hexidecimal.
820+ *
821+ * Returns: length of formatted string.
822+ **/
823 #define lpfc_vport_param_hex_show(attr) \
824 static ssize_t \
825 lpfc_##attr##_show(struct device *dev, struct device_attribute *attr, \
826@@ -792,6 +1297,24 @@ lpfc_##attr##_show(struct device *dev, s
827 return snprintf(buf, PAGE_SIZE, "%#x\n", vport->cfg_##attr);\
828 }
829
830+/**
831+ * lpfc_vport_param_init: Initialize a vport cfg attribute.
832+ *
833+ * Description:
834+ * Macro that given an attr e.g. hba_queue_depth expands
835+ * into a function with the name lpfc_hba_queue_depth_init. The macro also
836+ * takes a default argument, a minimum and maximum argument.
837+ *
838+ * lpfc_##attr##_init: validates the min and max values then sets the
839+ * adapter config field accordingly, or uses the default if out of range
840+ * and prints an error message.
841+ * @phba: pointer the the adapter structure.
842+ * @val: integer attribute value.
843+ *
844+ * Returns:
845+ * zero on success
846+ * -EINVAL if default used
847+ **/
848 #define lpfc_vport_param_init(attr, default, minval, maxval) \
849 static int \
850 lpfc_##attr##_init(struct lpfc_vport *vport, int val) \
851@@ -801,12 +1324,29 @@ lpfc_##attr##_init(struct lpfc_vport *vp
852 return 0;\
853 }\
854 lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT, \
855- "0449 lpfc_"#attr" attribute cannot be set to %d, "\
856+ "0423 lpfc_"#attr" attribute cannot be set to %d, "\
857 "allowed range is ["#minval", "#maxval"]\n", val); \
858 vport->cfg_##attr = default;\
859 return -EINVAL;\
860 }
861
862+/**
863+ * lpfc_vport_param_set: Set a vport cfg attribute.
864+ *
865+ * Description:
866+ * Macro that given an attr e.g. hba_queue_depth expands
867+ * into a function with the name lpfc_hba_queue_depth_set
868+ *
869+ * lpfc_##attr##_set: validates the min and max values then sets the
870+ * adapter config field if in the valid range. prints error message
871+ * and does not set the parameter if invalid.
872+ * @phba: pointer the the adapter structure.
873+ * @val: integer attribute value.
874+ *
875+ * Returns:
876+ * zero on success
877+ * -EINVAL if val is invalid
878+ **/
879 #define lpfc_vport_param_set(attr, default, minval, maxval) \
880 static int \
881 lpfc_##attr##_set(struct lpfc_vport *vport, int val) \
882@@ -816,11 +1356,28 @@ lpfc_##attr##_set(struct lpfc_vport *vpo
883 return 0;\
884 }\
885 lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT, \
886- "0450 lpfc_"#attr" attribute cannot be set to %d, "\
887+ "0424 lpfc_"#attr" attribute cannot be set to %d, "\
888 "allowed range is ["#minval", "#maxval"]\n", val); \
889 return -EINVAL;\
890 }
891
892+/**
893+ * lpfc_vport_param_store: Set a vport attribute.
894+ *
895+ * Description:
896+ * Macro that given an attr e.g. hba_queue_depth
897+ * expands into a function with the name lpfc_hba_queue_depth_store
898+ *
899+ * lpfc_##attr##_store: convert the ascii text number to an integer, then
900+ * use the lpfc_##attr##_set function to set the value.
901+ * @cdev: class device that is converted into a Scsi_host.
902+ * @buf: contains the attribute value in decimal.
903+ * @count: not used.
904+ *
905+ * Returns:
906+ * -EINVAL if val is invalid or lpfc_##attr##_set() fails
907+ * length of buffer upon success.
908+ **/
909 #define lpfc_vport_param_store(attr) \
910 static ssize_t \
911 lpfc_##attr##_store(struct device *dev, struct device_attribute *attr, \
912@@ -941,6 +1498,7 @@ static DEVICE_ATTR(option_rom_version, S
913 lpfc_option_rom_version_show, NULL);
914 static DEVICE_ATTR(num_discovered_ports, S_IRUGO,
915 lpfc_num_discovered_ports_show, NULL);
916+static DEVICE_ATTR(menlo_mgmt_mode, S_IRUGO, lpfc_mlomgmt_show, NULL);
917 static DEVICE_ATTR(nport_evt_cnt, S_IRUGO, lpfc_nport_evt_cnt_show, NULL);
918 static DEVICE_ATTR(lpfc_drvr_version, S_IRUGO, lpfc_drvr_version_show, NULL);
919 static DEVICE_ATTR(board_mode, S_IRUGO | S_IWUSR,
920@@ -958,6 +1516,17 @@ static DEVICE_ATTR(lpfc_temp_sensor, S_I
921
922 static char *lpfc_soft_wwn_key = "C99G71SL8032A";
923
924+/**
925+ * lpfc_soft_wwn_enable_store: Allows setting of the wwn if the key is valid.
926+ * @dev: class device that is converted into a Scsi_host.
927+ * @attr: device attribute, not used.
928+ * @buf: containing the string lpfc_soft_wwn_key.
929+ * @count: must be size of lpfc_soft_wwn_key.
930+ *
931+ * Returns:
932+ * -EINVAL if the buffer does not contain lpfc_soft_wwn_key
933+ * length of buf indicates success
934+ **/
935 static ssize_t
936 lpfc_soft_wwn_enable_store(struct device *dev, struct device_attribute *attr,
937 const char *buf, size_t count)
938@@ -994,6 +1563,14 @@ lpfc_soft_wwn_enable_store(struct device
939 static DEVICE_ATTR(lpfc_soft_wwn_enable, S_IWUSR, NULL,
940 lpfc_soft_wwn_enable_store);
941
942+/**
943+ * lpfc_soft_wwpn_show: Return the cfg soft ww port name of the adapter.
944+ * @dev: class device that is converted into a Scsi_host.
945+ * @attr: device attribute, not used.
946+ * @buf: on return contains the wwpn in hexidecimal.
947+ *
948+ * Returns: size of formatted string.
949+ **/
950 static ssize_t
951 lpfc_soft_wwpn_show(struct device *dev, struct device_attribute *attr,
952 char *buf)
953@@ -1006,7 +1583,19 @@ lpfc_soft_wwpn_show(struct device *dev,
954 (unsigned long long)phba->cfg_soft_wwpn);
955 }
956
957-
958+/**
959+ * lpfc_soft_wwpn_store: Set the ww port name of the adapter.
960+ * @dev class device that is converted into a Scsi_host.
961+ * @attr: device attribute, not used.
962+ * @buf: contains the wwpn in hexidecimal.
963+ * @count: number of wwpn bytes in buf
964+ *
965+ * Returns:
966+ * -EACCES hba reset not enabled, adapter over temp
967+ * -EINVAL soft wwn not enabled, count is invalid, invalid wwpn byte invalid
968+ * -EIO error taking adapter offline or online
969+ * value of count on success
970+ **/
971 static ssize_t
972 lpfc_soft_wwpn_store(struct device *dev, struct device_attribute *attr,
973 const char *buf, size_t count)
974@@ -1080,6 +1669,14 @@ lpfc_soft_wwpn_store(struct device *dev,
975 static DEVICE_ATTR(lpfc_soft_wwpn, S_IRUGO | S_IWUSR,\
976 lpfc_soft_wwpn_show, lpfc_soft_wwpn_store);
977
978+/**
979+ * lpfc_soft_wwnn_show: Return the cfg soft ww node name for the adapter.
980+ * @dev: class device that is converted into a Scsi_host.
981+ * @attr: device attribute, not used.
982+ * @buf: on return contains the wwnn in hexidecimal.
983+ *
984+ * Returns: size of formatted string.
985+ **/
986 static ssize_t
987 lpfc_soft_wwnn_show(struct device *dev, struct device_attribute *attr,
988 char *buf)
989@@ -1090,7 +1687,16 @@ lpfc_soft_wwnn_show(struct device *dev,
990 (unsigned long long)phba->cfg_soft_wwnn);
991 }
992
993-
994+/**
995+ * lpfc_soft_wwnn_store: sets the ww node name of the adapter.
996+ * @cdev: class device that is converted into a Scsi_host.
997+ * @buf: contains the ww node name in hexidecimal.
998+ * @count: number of wwnn bytes in buf.
999+ *
1000+ * Returns:
1001+ * -EINVAL soft wwn not enabled, count is invalid, invalid wwnn byte invalid
1002+ * value of count on success
1003+ **/
1004 static ssize_t
1005 lpfc_soft_wwnn_store(struct device *dev, struct device_attribute *attr,
1006 const char *buf, size_t count)
1007@@ -1178,6 +1784,15 @@ module_param(lpfc_nodev_tmo, int, 0);
1008 MODULE_PARM_DESC(lpfc_nodev_tmo,
1009 "Seconds driver will hold I/O waiting "
1010 "for a device to come back");
1011+
1012+/**
1013+ * lpfc_nodev_tmo_show: Return the hba dev loss timeout value.
1014+ * @dev: class converted to a Scsi_host structure.
1015+ * @attr: device attribute, not used.
1016+ * @buf: on return contains the dev loss timeout in decimal.
1017+ *
1018+ * Returns: size of formatted string.
1019+ **/
1020 static ssize_t
1021 lpfc_nodev_tmo_show(struct device *dev, struct device_attribute *attr,
1022 char *buf)
1023@@ -1189,6 +1804,21 @@ lpfc_nodev_tmo_show(struct device *dev,
1024 return snprintf(buf, PAGE_SIZE, "%d\n", vport->cfg_devloss_tmo);
1025 }
1026
1027+/**
1028+ * lpfc_nodev_tmo_init: Set the hba nodev timeout value.
1029+ * @vport: lpfc vport structure pointer.
1030+ * @val: contains the nodev timeout value.
1031+ *
1032+ * Description:
1033+ * If the devloss tmo is already set then nodev tmo is set to devloss tmo,
1034+ * a kernel error message is printed and zero is returned.
1035+ * Else if val is in range then nodev tmo and devloss tmo are set to val.
1036+ * Otherwise nodev tmo is set to the default value.
1037+ *
1038+ * Returns:
1039+ * zero if already set or if val is in range
1040+ * -EINVAL val out of range
1041+ **/
1042 static int
1043 lpfc_nodev_tmo_init(struct lpfc_vport *vport, int val)
1044 {
1045@@ -1196,7 +1826,7 @@ lpfc_nodev_tmo_init(struct lpfc_vport *v
1046 vport->cfg_nodev_tmo = vport->cfg_devloss_tmo;
1047 if (val != LPFC_DEF_DEVLOSS_TMO)
1048 lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT,
1049- "0402 Ignoring nodev_tmo module "
1050+ "0407 Ignoring nodev_tmo module "
1051 "parameter because devloss_tmo is "
1052 "set.\n");
1053 return 0;
1054@@ -1215,6 +1845,13 @@ lpfc_nodev_tmo_init(struct lpfc_vport *v
1055 return -EINVAL;
1056 }
1057
1058+/**
1059+ * lpfc_update_rport_devloss_tmo: Update dev loss tmo value.
1060+ * @vport: lpfc vport structure pointer.
1061+ *
1062+ * Description:
1063+ * Update all the ndlp's dev loss tmo with the vport devloss tmo value.
1064+ **/
1065 static void
1066 lpfc_update_rport_devloss_tmo(struct lpfc_vport *vport)
1067 {
1068@@ -1229,6 +1866,21 @@ lpfc_update_rport_devloss_tmo(struct lpf
1069 spin_unlock_irq(shost->host_lock);
1070 }
1071
1072+/**
1073+ * lpfc_nodev_tmo_set: Set the vport nodev tmo and devloss tmo values.
1074+ * @vport: lpfc vport structure pointer.
1075+ * @val: contains the tmo value.
1076+ *
1077+ * Description:
1078+ * If the devloss tmo is already set or the vport dev loss tmo has changed
1079+ * then a kernel error message is printed and zero is returned.
1080+ * Else if val is in range then nodev tmo and devloss tmo are set to val.
1081+ * Otherwise nodev tmo is set to the default value.
1082+ *
1083+ * Returns:
1084+ * zero if already set or if val is in range
1085+ * -EINVAL val out of range
1086+ **/
1087 static int
1088 lpfc_nodev_tmo_set(struct lpfc_vport *vport, int val)
1089 {
1090@@ -1269,6 +1921,21 @@ MODULE_PARM_DESC(lpfc_devloss_tmo,
1091 lpfc_vport_param_init(devloss_tmo, LPFC_DEF_DEVLOSS_TMO,
1092 LPFC_MIN_DEVLOSS_TMO, LPFC_MAX_DEVLOSS_TMO)
1093 lpfc_vport_param_show(devloss_tmo)
1094+
1095+/**
1096+ * lpfc_devloss_tmo_set: Sets vport nodev tmo, devloss tmo values, changed bit.
1097+ * @vport: lpfc vport structure pointer.
1098+ * @val: contains the tmo value.
1099+ *
1100+ * Description:
1101+ * If val is in a valid range then set the vport nodev tmo,
1102+ * devloss tmo, also set the vport dev loss tmo changed flag.
1103+ * Else a kernel error message is printed.
1104+ *
1105+ * Returns:
1106+ * zero if val is in range
1107+ * -EINVAL val out of range
1108+ **/
1109 static int
1110 lpfc_devloss_tmo_set(struct lpfc_vport *vport, int val)
1111 {
1112@@ -1366,12 +2033,27 @@ MODULE_PARM_DESC(lpfc_restrict_login,
1113 "Restrict virtual ports login to remote initiators.");
1114 lpfc_vport_param_show(restrict_login);
1115
1116+/**
1117+ * lpfc_restrict_login_init: Set the vport restrict login flag.
1118+ * @vport: lpfc vport structure pointer.
1119+ * @val: contains the restrict login value.
1120+ *
1121+ * Description:
1122+ * If val is not in a valid range then log a kernel error message and set
1123+ * the vport restrict login to one.
1124+ * If the port type is physical clear the restrict login flag and return.
1125+ * Else set the restrict login flag to val.
1126+ *
1127+ * Returns:
1128+ * zero if val is in range
1129+ * -EINVAL val out of range
1130+ **/
1131 static int
1132 lpfc_restrict_login_init(struct lpfc_vport *vport, int val)
1133 {
1134 if (val < 0 || val > 1) {
1135 lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT,
1136- "0449 lpfc_restrict_login attribute cannot "
1137+ "0422 lpfc_restrict_login attribute cannot "
1138 "be set to %d, allowed range is [0, 1]\n",
1139 val);
1140 vport->cfg_restrict_login = 1;
1141@@ -1385,12 +2067,28 @@ lpfc_restrict_login_init(struct lpfc_vpo
1142 return 0;
1143 }
1144
1145+/**
1146+ * lpfc_restrict_login_set: Set the vport restrict login flag.
1147+ * @vport: lpfc vport structure pointer.
1148+ * @val: contains the restrict login value.
1149+ *
1150+ * Description:
1151+ * If val is not in a valid range then log a kernel error message and set
1152+ * the vport restrict login to one.
1153+ * If the port type is physical and the val is not zero log a kernel
1154+ * error message, clear the restrict login flag and return zero.
1155+ * Else set the restrict login flag to val.
1156+ *
1157+ * Returns:
1158+ * zero if val is in range
1159+ * -EINVAL val out of range
1160+ **/
1161 static int
1162 lpfc_restrict_login_set(struct lpfc_vport *vport, int val)
1163 {
1164 if (val < 0 || val > 1) {
1165 lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT,
1166- "0450 lpfc_restrict_login attribute cannot "
1167+ "0425 lpfc_restrict_login attribute cannot "
1168 "be set to %d, allowed range is [0, 1]\n",
1169 val);
1170 vport->cfg_restrict_login = 1;
1171@@ -1441,6 +2139,23 @@ LPFC_VPORT_ATTR_R(scan_down, 1, 0, 1,
1172 # Set loop mode if you want to run as an NL_Port. Value range is [0,0x6].
1173 # Default value is 0.
1174 */
1175+
1176+/**
1177+ * lpfc_topology_set: Set the adapters topology field.
1178+ * @phba: lpfc_hba pointer.
1179+ * @val: topology value.
1180+ *
1181+ * Description:
1182+ * If val is in a valid range then set the adapter's topology field and
1183+ * issue a lip; if the lip fails reset the topology to the old value.
1184+ *
1185+ * If the value is not in range log a kernel error message and return an error.
1186+ *
1187+ * Returns:
1188+ * zero if val is in range and lip okay
1189+ * non-zero return value from lpfc_issue_lip()
1190+ * -EINVAL val out of range
1191+ **/
1192 static int
1193 lpfc_topology_set(struct lpfc_hba *phba, int val)
1194 {
1195@@ -1469,6 +2184,335 @@ lpfc_param_store(topology)
1196 static DEVICE_ATTR(lpfc_topology, S_IRUGO | S_IWUSR,
1197 lpfc_topology_show, lpfc_topology_store);
1198
1199+
1200+/**
1201+ * lpfc_stat_data_ctrl_store: write call back for lpfc_stat_data_ctrl
1202+ * sysfs file.
1203+ * @dev: Pointer to class device.
1204+ * @buf: Data buffer.
1205+ * @count: Size of the data buffer.
1206+ *
1207+ * This function get called when an user write to the lpfc_stat_data_ctrl
1208+ * sysfs file. This function parse the command written to the sysfs file
1209+ * and take appropriate action. These commands are used for controlling
1210+ * driver statistical data collection.
1211+ * Following are the command this function handles.
1212+ *
1213+ * setbucket <bucket_type> <base> <step>
1214+ * = Set the latency buckets.
1215+ * destroybucket = destroy all the buckets.
1216+ * start = start data collection
1217+ * stop = stop data collection
1218+ * reset = reset the collected data
1219+ **/
1220+static ssize_t
1221+lpfc_stat_data_ctrl_store(struct device *dev, struct device_attribute *attr,
1222+ const char *buf, size_t count)
1223+{
1224+ struct Scsi_Host *shost = class_to_shost(dev);
1225+ struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
1226+ struct lpfc_hba *phba = vport->phba;
1227+#define LPFC_MAX_DATA_CTRL_LEN 1024
1228+ static char bucket_data[LPFC_MAX_DATA_CTRL_LEN];
1229+ unsigned long i;
1230+ char *str_ptr, *token;
1231+ struct lpfc_vport **vports;
1232+ struct Scsi_Host *v_shost;
1233+ char *bucket_type_str, *base_str, *step_str;
1234+ unsigned long base, step, bucket_type;
1235+
1236+ if (!strncmp(buf, "setbucket", strlen("setbucket"))) {
1237+ if (strlen(buf) > LPFC_MAX_DATA_CTRL_LEN)
1238+ return -EINVAL;
1239+
1240+ strcpy(bucket_data, buf);
1241+ str_ptr = &bucket_data[0];
1242+ /* Ignore this token - this is command token */
1243+ token = strsep(&str_ptr, "\t ");
1244+ if (!token)
1245+ return -EINVAL;
1246+
1247+ bucket_type_str = strsep(&str_ptr, "\t ");
1248+ if (!bucket_type_str)
1249+ return -EINVAL;
1250+
1251+ if (!strncmp(bucket_type_str, "linear", strlen("linear")))
1252+ bucket_type = LPFC_LINEAR_BUCKET;
1253+ else if (!strncmp(bucket_type_str, "power2", strlen("power2")))
1254+ bucket_type = LPFC_POWER2_BUCKET;
1255+ else
1256+ return -EINVAL;
1257+
1258+ base_str = strsep(&str_ptr, "\t ");
1259+ if (!base_str)
1260+ return -EINVAL;
1261+ base = simple_strtoul(base_str, NULL, 0);
1262+
1263+ step_str = strsep(&str_ptr, "\t ");
1264+ if (!step_str)
1265+ return -EINVAL;
1266+ step = simple_strtoul(step_str, NULL, 0);
1267+ if (!step)
1268+ return -EINVAL;
1269+
1270+ /* Block the data collection for every vport */
1271+ vports = lpfc_create_vport_work_array(phba);
1272+ if (vports == NULL)
1273+ return -ENOMEM;
1274+
1275+ for (i = 0; i <= phba->max_vpi && vports[i] != NULL; i++) {
1276+ v_shost = lpfc_shost_from_vport(vports[i]);
1277+ spin_lock_irq(v_shost->host_lock);
1278+ /* Block and reset data collection */
1279+ vports[i]->stat_data_blocked = 1;
1280+ if (vports[i]->stat_data_enabled)
1281+ lpfc_vport_reset_stat_data(vports[i]);
1282+ spin_unlock_irq(v_shost->host_lock);
1283+ }
1284+
1285+ /* Set the bucket attributes */
1286+ phba->bucket_type = bucket_type;
1287+ phba->bucket_base = base;
1288+ phba->bucket_step = step;
1289+
1290+ for (i = 0; i <= phba->max_vpi && vports[i] != NULL; i++) {
1291+ v_shost = lpfc_shost_from_vport(vports[i]);
1292+
1293+ /* Unblock data collection */
1294+ spin_lock_irq(v_shost->host_lock);
1295+ vports[i]->stat_data_blocked = 0;
1296+ spin_unlock_irq(v_shost->host_lock);
1297+ }
1298+ lpfc_destroy_vport_work_array(phba, vports);
1299+ return strlen(buf);
1300+ }
1301+
1302+ if (!strncmp(buf, "destroybucket", strlen("destroybucket"))) {
1303+ vports = lpfc_create_vport_work_array(phba);
1304+ if (vports == NULL)
1305+ return -ENOMEM;
1306+
1307+ for (i = 0; i <= phba->max_vpi && vports[i] != NULL; i++) {
1308+ v_shost = lpfc_shost_from_vport(vports[i]);
1309+ spin_lock_irq(shost->host_lock);
1310+ vports[i]->stat_data_blocked = 1;
1311+ lpfc_free_bucket(vport);
1312+ vport->stat_data_enabled = 0;
1313+ vports[i]->stat_data_blocked = 0;
1314+ spin_unlock_irq(shost->host_lock);
1315+ }
1316+ lpfc_destroy_vport_work_array(phba, vports);
1317+ phba->bucket_type = LPFC_NO_BUCKET;
1318+ phba->bucket_base = 0;
1319+ phba->bucket_step = 0;
1320+ return strlen(buf);
1321+ }
1322+
1323+ if (!strncmp(buf, "start", strlen("start"))) {
1324+ /* If no buckets configured return error */
1325+ if (phba->bucket_type == LPFC_NO_BUCKET)
1326+ return -EINVAL;
1327+ spin_lock_irq(shost->host_lock);
1328+ if (vport->stat_data_enabled) {
1329+ spin_unlock_irq(shost->host_lock);
1330+ return strlen(buf);
1331+ }
1332+ lpfc_alloc_bucket(vport);
1333+ vport->stat_data_enabled = 1;
1334+ spin_unlock_irq(shost->host_lock);
1335+ return strlen(buf);
1336+ }
1337+
1338+ if (!strncmp(buf, "stop", strlen("stop"))) {
1339+ spin_lock_irq(shost->host_lock);
1340+ if (vport->stat_data_enabled == 0) {
1341+ spin_unlock_irq(shost->host_lock);
1342+ return strlen(buf);
1343+ }
1344+ lpfc_free_bucket(vport);
1345+ vport->stat_data_enabled = 0;
1346+ spin_unlock_irq(shost->host_lock);
1347+ return strlen(buf);
1348+ }
1349+
1350+ if (!strncmp(buf, "reset", strlen("reset"))) {
1351+ if ((phba->bucket_type == LPFC_NO_BUCKET)
1352+ || !vport->stat_data_enabled)
1353+ return strlen(buf);
1354+ spin_lock_irq(shost->host_lock);
1355+ vport->stat_data_blocked = 1;
1356+ lpfc_vport_reset_stat_data(vport);
1357+ vport->stat_data_blocked = 0;
1358+ spin_unlock_irq(shost->host_lock);
1359+ return strlen(buf);
1360+ }
1361+ return -EINVAL;
1362+}
1363+
1364+
1365+/**
1366+ * lpfc_stat_data_ctrl_show: Read callback function for
1367+ * lpfc_stat_data_ctrl sysfs file.
1368+ * @dev: Pointer to class device object.
1369+ * @buf: Data buffer.
1370+ *
1371+ * This function is the read call back function for
1372+ * lpfc_stat_data_ctrl sysfs file. This function report the
1373+ * current statistical data collection state.
1374+ **/
1375+static ssize_t
1376+lpfc_stat_data_ctrl_show(struct device *dev, struct device_attribute *attr,
1377+ char *buf)
1378+{
1379+ struct Scsi_Host *shost = class_to_shost(dev);
1380+ struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
1381+ struct lpfc_hba *phba = vport->phba;
1382+ int index = 0;
1383+ int i;
1384+ char *bucket_type;
1385+ unsigned long bucket_value;
1386+
1387+ switch (phba->bucket_type) {
1388+ case LPFC_LINEAR_BUCKET:
1389+ bucket_type = "linear";
1390+ break;
1391+ case LPFC_POWER2_BUCKET:
1392+ bucket_type = "power2";
1393+ break;
1394+ default:
1395+ bucket_type = "No Bucket";
1396+ break;
1397+ }
1398+
1399+ sprintf(&buf[index], "Statistical Data enabled :%d, "
1400+ "blocked :%d, Bucket type :%s, Bucket base :%d,"
1401+ " Bucket step :%d\nLatency Ranges :",
1402+ vport->stat_data_enabled, vport->stat_data_blocked,
1403+ bucket_type, phba->bucket_base, phba->bucket_step);
1404+ index = strlen(buf);
1405+ if (phba->bucket_type != LPFC_NO_BUCKET) {
1406+ for (i = 0; i < LPFC_MAX_BUCKET_COUNT; i++) {
1407+ if (phba->bucket_type == LPFC_LINEAR_BUCKET)
1408+ bucket_value = phba->bucket_base +
1409+ phba->bucket_step * i;
1410+ else
1411+ bucket_value = phba->bucket_base +
1412+ (1 << i) * phba->bucket_step;
1413+
1414+ if (index + 10 > PAGE_SIZE)
1415+ break;
1416+ sprintf(&buf[index], "%08ld ", bucket_value);
1417+ index = strlen(buf);
1418+ }
1419+ }
1420+ sprintf(&buf[index], "\n");
1421+ return strlen(buf);
1422+}
1423+
1424+/*
1425+ * Sysfs attribute to control the statistical data collection.
1426+ */
1427+static DEVICE_ATTR(lpfc_stat_data_ctrl, S_IRUGO | S_IWUSR,
1428+ lpfc_stat_data_ctrl_show, lpfc_stat_data_ctrl_store);
1429+
1430+/*
1431+ * lpfc_drvr_stat_data: sysfs attr to get driver statistical data.
1432+ */
1433+
1434+/*
1435+ * Each Bucket takes 11 characters and 1 new line + 17 bytes WWN
1436+ * for each target.
1437+ */
1438+#define STAT_DATA_SIZE_PER_TARGET(NUM_BUCKETS) ((NUM_BUCKETS) * 11 + 18)
1439+#define MAX_STAT_DATA_SIZE_PER_TARGET \
1440+ STAT_DATA_SIZE_PER_TARGET(LPFC_MAX_BUCKET_COUNT)
1441+
1442+
1443+/**
1444+ * sysfs_drvr_stat_data_read: Read callback function for lpfc_drvr_stat_data
1445+ * sysfs attribute.
1446+ * @kobj: Pointer to the kernel object
1447+ * @bin_attr: Attribute object
1448+ * @buff: Buffer pointer
1449+ * @off: File offset
1450+ * @count: Buffer size
1451+ *
1452+ * This function is the read call back function for lpfc_drvr_stat_data
1453+ * sysfs file. This function export the statistical data to user
1454+ * applications.
1455+ **/
1456+static ssize_t
1457+sysfs_drvr_stat_data_read(struct kobject *kobj, struct bin_attribute *bin_attr,
1458+ char *buf, loff_t off, size_t count)
1459+{
1460+ struct device *dev = container_of(kobj, struct device,
1461+ kobj);
1462+ struct Scsi_Host *shost = class_to_shost(dev);
1463+ struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
1464+ struct lpfc_hba *phba = vport->phba;
1465+ int i = 0, index = 0;
1466+ unsigned long nport_index;
1467+ struct lpfc_nodelist *ndlp = NULL;
1468+ nport_index = (unsigned long)off /
1469+ MAX_STAT_DATA_SIZE_PER_TARGET;
1470+
1471+ if (!vport->stat_data_enabled || vport->stat_data_blocked
1472+ || (phba->bucket_type == LPFC_NO_BUCKET))
1473+ return 0;
1474+
1475+ spin_lock_irq(shost->host_lock);
1476+ list_for_each_entry(ndlp, &vport->fc_nodes, nlp_listp) {
1477+ if (!NLP_CHK_NODE_ACT(ndlp) || !ndlp->lat_data)
1478+ continue;
1479+
1480+ if (nport_index > 0) {
1481+ nport_index--;
1482+ continue;
1483+ }
1484+
1485+ if ((index + MAX_STAT_DATA_SIZE_PER_TARGET)
1486+ > count)
1487+ break;
1488+
1489+ if (!ndlp->lat_data)
1490+ continue;
1491+
1492+ /* Print the WWN */
1493+ sprintf(&buf[index], "%02x%02x%02x%02x%02x%02x%02x%02x:",
1494+ ndlp->nlp_portname.u.wwn[0],
1495+ ndlp->nlp_portname.u.wwn[1],
1496+ ndlp->nlp_portname.u.wwn[2],
1497+ ndlp->nlp_portname.u.wwn[3],
1498+ ndlp->nlp_portname.u.wwn[4],
1499+ ndlp->nlp_portname.u.wwn[5],
1500+ ndlp->nlp_portname.u.wwn[6],
1501+ ndlp->nlp_portname.u.wwn[7]);
1502+
1503+ index = strlen(buf);
1504+
1505+ for (i = 0; i < LPFC_MAX_BUCKET_COUNT; i++) {
1506+ sprintf(&buf[index], "%010u,",
1507+ ndlp->lat_data[i].cmd_count);
1508+ index = strlen(buf);
1509+ }
1510+ sprintf(&buf[index], "\n");
1511+ index = strlen(buf);
1512+ }
1513+ spin_unlock_irq(shost->host_lock);
1514+ return index;
1515+}
1516+
1517+static struct bin_attribute sysfs_drvr_stat_data_attr = {
1518+ .attr = {
1519+ .name = "lpfc_drvr_stat_data",
1520+ .mode = S_IRUSR,
1521+ .owner = THIS_MODULE,
1522+ },
1523+ .size = LPFC_MAX_TARGET * MAX_STAT_DATA_SIZE_PER_TARGET,
1524+ .read = sysfs_drvr_stat_data_read,
1525+ .write = NULL,
1526+};
1527+
1528 /*
1529 # lpfc_link_speed: Link speed selection for initializing the Fibre Channel
1530 # connection.
1531@@ -1479,6 +2523,24 @@ static DEVICE_ATTR(lpfc_topology, S_IRUG
1532 # 8 = 8 Gigabaud
1533 # Value range is [0,8]. Default value is 0.
1534 */
1535+
1536+/**
1537+ * lpfc_link_speed_set: Set the adapters link speed.
1538+ * @phba: lpfc_hba pointer.
1539+ * @val: link speed value.
1540+ *
1541+ * Description:
1542+ * If val is in a valid range then set the adapter's link speed field and
1543+ * issue a lip; if the lip fails reset the link speed to the old value.
1544+ *
1545+ * Notes:
1546+ * If the value is not in range log a kernel error message and return an error.
1547+ *
1548+ * Returns:
1549+ * zero if val is in range and lip okay.
1550+ * non-zero return value from lpfc_issue_lip()
1551+ * -EINVAL val out of range
1552+ **/
1553 static int
1554 lpfc_link_speed_set(struct lpfc_hba *phba, int val)
1555 {
1556@@ -1513,6 +2575,23 @@ static int lpfc_link_speed = 0;
1557 module_param(lpfc_link_speed, int, 0);
1558 MODULE_PARM_DESC(lpfc_link_speed, "Select link speed");
1559 lpfc_param_show(link_speed)
1560+
1561+/**
1562+ * lpfc_link_speed_init: Set the adapters link speed.
1563+ * @phba: lpfc_hba pointer.
1564+ * @val: link speed value.
1565+ *
1566+ * Description:
1567+ * If val is in a valid range then set the adapter's link speed field.
1568+ *
1569+ * Notes:
1570+ * If the value is not in range log a kernel error message, clear the link
1571+ * speed and return an error.
1572+ *
1573+ * Returns:
1574+ * zero if val saved.
1575+ * -EINVAL val out of range
1576+ **/
1577 static int
1578 lpfc_link_speed_init(struct lpfc_hba *phba, int val)
1579 {
1580@@ -1522,7 +2601,7 @@ lpfc_link_speed_init(struct lpfc_hba *ph
1581 return 0;
1582 }
1583 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
1584- "0454 lpfc_link_speed attribute cannot "
1585+ "0405 lpfc_link_speed attribute cannot "
1586 "be set to %d, allowed values are "
1587 "["LPFC_LINK_SPEED_STRING"]\n", val);
1588 phba->cfg_link_speed = 0;
1589@@ -1548,6 +2627,48 @@ LPFC_VPORT_ATTR_RW(use_adisc, 0, 0, 1,
1590 "Use ADISC on rediscovery to authenticate FCP devices");
1591
1592 /*
1593+# lpfc_max_scsicmpl_time: Use scsi command completion time to control I/O queue
1594+# depth. Default value is 0. When the value of this parameter is zero the
1595+# SCSI command completion time is not used for controlling I/O queue depth. When
1596+# the parameter is set to a non-zero value, the I/O queue depth is controlled
1597+# to limit the I/O completion time to the parameter value.
1598+# The value is set in milliseconds.
1599+*/
1600+static int lpfc_max_scsicmpl_time;
1601+module_param(lpfc_max_scsicmpl_time, int, 0);
1602+MODULE_PARM_DESC(lpfc_max_scsicmpl_time,
1603+ "Use command completion time to control queue depth");
1604+lpfc_vport_param_show(max_scsicmpl_time);
1605+lpfc_vport_param_init(max_scsicmpl_time, 0, 0, 60000);
1606+static int
1607+lpfc_max_scsicmpl_time_set(struct lpfc_vport *vport, int val)
1608+{
1609+ struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
1610+ struct lpfc_nodelist *ndlp, *next_ndlp;
1611+
1612+ if (val == vport->cfg_max_scsicmpl_time)
1613+ return 0;
1614+ if ((val < 0) || (val > 60000))
1615+ return -EINVAL;
1616+ vport->cfg_max_scsicmpl_time = val;
1617+
1618+ spin_lock_irq(shost->host_lock);
1619+ list_for_each_entry_safe(ndlp, next_ndlp, &vport->fc_nodes, nlp_listp) {
1620+ if (!NLP_CHK_NODE_ACT(ndlp))
1621+ continue;
1622+ if (ndlp->nlp_state == NLP_STE_UNUSED_NODE)
1623+ continue;
1624+ ndlp->cmd_qdepth = LPFC_MAX_TGT_QDEPTH;
1625+ }
1626+ spin_unlock_irq(shost->host_lock);
1627+ return 0;
1628+}
1629+lpfc_vport_param_store(max_scsicmpl_time);
1630+static DEVICE_ATTR(lpfc_max_scsicmpl_time, S_IRUGO | S_IWUSR,
1631+ lpfc_max_scsicmpl_time_show,
1632+ lpfc_max_scsicmpl_time_store);
1633+
1634+/*
1635 # lpfc_ack0: Use ACK0, instead of ACK1 for class 2 acknowledgement. Value
1636 # range is [0,1]. Default value is 0.
1637 */
1638@@ -1623,12 +2744,12 @@ LPFC_ATTR_RW(poll_tmo, 10, 1, 255,
1639 /*
1640 # lpfc_use_msi: Use MSI (Message Signaled Interrupts) in systems that
1641 # support this feature
1642-# 0 = MSI disabled (default)
1643+# 0 = MSI disabled
1644 # 1 = MSI enabled
1645-# 2 = MSI-X enabled
1646-# Value range is [0,2]. Default value is 0.
1647+# 2 = MSI-X enabled (default)
1648+# Value range is [0,2]. Default value is 2.
1649 */
1650-LPFC_ATTR_R(use_msi, 0, 0, 2, "Use Message Signaled Interrupts (1) or "
1651+LPFC_ATTR_R(use_msi, 2, 0, 2, "Use Message Signaled Interrupts (1) or "
1652 "MSI-X (2), if possible");
1653
1654 /*
1655@@ -1668,6 +2789,7 @@ struct device_attribute *lpfc_hba_attrs[
1656 &dev_attr_option_rom_version,
1657 &dev_attr_link_state,
1658 &dev_attr_num_discovered_ports,
1659+ &dev_attr_menlo_mgmt_mode,
1660 &dev_attr_lpfc_drvr_version,
1661 &dev_attr_lpfc_temp_sensor,
1662 &dev_attr_lpfc_log_verbose,
1663@@ -1709,6 +2831,8 @@ struct device_attribute *lpfc_hba_attrs[
1664 &dev_attr_lpfc_enable_hba_reset,
1665 &dev_attr_lpfc_enable_hba_heartbeat,
1666 &dev_attr_lpfc_sg_seg_cnt,
1667+ &dev_attr_lpfc_max_scsicmpl_time,
1668+ &dev_attr_lpfc_stat_data_ctrl,
1669 NULL,
1670 };
1671
1672@@ -1731,9 +2855,29 @@ struct device_attribute *lpfc_vport_attr
1673 &dev_attr_nport_evt_cnt,
1674 &dev_attr_npiv_info,
1675 &dev_attr_lpfc_enable_da_id,
1676+ &dev_attr_lpfc_max_scsicmpl_time,
1677+ &dev_attr_lpfc_stat_data_ctrl,
1678 NULL,
1679 };
1680
1681+/**
1682+ * sysfs_ctlreg_write: Write method for writing to ctlreg.
1683+ * @kobj: kernel kobject that contains the kernel class device.
1684+ * @bin_attr: kernel attributes passed to us.
1685+ * @buf: contains the data to be written to the adapter IOREG space.
1686+ * @off: offset into buffer to beginning of data.
1687+ * @count: bytes to transfer.
1688+ *
1689+ * Description:
1690+ * Accessed via /sys/class/scsi_host/hostxxx/ctlreg.
1691+ * Uses the adapter io control registers to send buf contents to the adapter.
1692+ *
1693+ * Returns:
1694+ * -ERANGE off and count combo out of range
1695+ * -EINVAL off, count or buff address invalid
1696+ * -EPERM adapter is offline
1697+ * value of count, buf contents written
1698+ **/
1699 static ssize_t
1700 sysfs_ctlreg_write(struct kobject *kobj, struct bin_attribute *bin_attr,
1701 char *buf, loff_t off, size_t count)
1702@@ -1766,6 +2910,23 @@ sysfs_ctlreg_write(struct kobject *kobj,
1703 return count;
1704 }
1705
1706+/**
1707+ * sysfs_ctlreg_read: Read method for reading from ctlreg.
1708+ * @kobj: kernel kobject that contains the kernel class device.
1709+ * @bin_attr: kernel attributes passed to us.
1710+ * @buf: if succesful contains the data from the adapter IOREG space.
1711+ * @off: offset into buffer to beginning of data.
1712+ * @count: bytes to transfer.
1713+ *
1714+ * Description:
1715+ * Accessed via /sys/class/scsi_host/hostxxx/ctlreg.
1716+ * Uses the adapter io control registers to read data into buf.
1717+ *
1718+ * Returns:
1719+ * -ERANGE off and count combo out of range
1720+ * -EINVAL off, count or buff address invalid
1721+ * value of count, buf contents read
1722+ **/
1723 static ssize_t
1724 sysfs_ctlreg_read(struct kobject *kobj, struct bin_attribute *bin_attr,
1725 char *buf, loff_t off, size_t count)
1726@@ -1810,7 +2971,10 @@ static struct bin_attribute sysfs_ctlreg
1727 .write = sysfs_ctlreg_write,
1728 };
1729
1730-
1731+/**
1732+ * sysfs_mbox_idle: frees the sysfs mailbox.
1733+ * @phba: lpfc_hba pointer
1734+ **/
1735 static void
1736 sysfs_mbox_idle(struct lpfc_hba *phba)
1737 {
1738@@ -1824,6 +2988,27 @@ sysfs_mbox_idle(struct lpfc_hba *phba)
1739 }
1740 }
1741
1742+/**
1743+ * sysfs_mbox_write: Write method for writing information via mbox.
1744+ * @kobj: kernel kobject that contains the kernel class device.
1745+ * @bin_attr: kernel attributes passed to us.
1746+ * @buf: contains the data to be written to sysfs mbox.
1747+ * @off: offset into buffer to beginning of data.
1748+ * @count: bytes to transfer.
1749+ *
1750+ * Description:
1751+ * Accessed via /sys/class/scsi_host/hostxxx/mbox.
1752+ * Uses the sysfs mbox to send buf contents to the adapter.
1753+ *
1754+ * Returns:
1755+ * -ERANGE off and count combo out of range
1756+ * -EINVAL off, count or buff address invalid
1757+ * zero if count is zero
1758+ * -EPERM adapter is offline
1759+ * -ENOMEM failed to allocate memory for the mail box
1760+ * -EAGAIN offset, state or mbox is NULL
1761+ * count number of bytes transferred
1762+ **/
1763 static ssize_t
1764 sysfs_mbox_write(struct kobject *kobj, struct bin_attribute *bin_attr,
1765 char *buf, loff_t off, size_t count)
1766@@ -1878,6 +3063,29 @@ sysfs_mbox_write(struct kobject *kobj, s
1767 return count;
1768 }
1769
1770+/**
1771+ * sysfs_mbox_read: Read method for reading information via mbox.
1772+ * @kobj: kernel kobject that contains the kernel class device.
1773+ * @bin_attr: kernel attributes passed to us.
1774+ * @buf: contains the data to be read from sysfs mbox.
1775+ * @off: offset into buffer to beginning of data.
1776+ * @count: bytes to transfer.
1777+ *
1778+ * Description:
1779+ * Accessed via /sys/class/scsi_host/hostxxx/mbox.
1780+ * Uses the sysfs mbox to receive data from to the adapter.
1781+ *
1782+ * Returns:
1783+ * -ERANGE off greater than mailbox command size
1784+ * -EINVAL off, count or buff address invalid
1785+ * zero if off and count are zero
1786+ * -EACCES adapter over temp
1787+ * -EPERM garbage can value to catch a multitude of errors
1788+ * -EAGAIN management IO not permitted, state or off error
1789+ * -ETIME mailbox timeout
1790+ * -ENODEV mailbox error
1791+ * count number of bytes transferred
1792+ **/
1793 static ssize_t
1794 sysfs_mbox_read(struct kobject *kobj, struct bin_attribute *bin_attr,
1795 char *buf, loff_t off, size_t count)
1796@@ -1954,6 +3162,8 @@ sysfs_mbox_read(struct kobject *kobj, st
1797 case MBX_DEL_LD_ENTRY:
1798 case MBX_SET_VARIABLE:
1799 case MBX_WRITE_WWN:
1800+ case MBX_PORT_CAPABILITIES:
1801+ case MBX_PORT_IOV_CONTROL:
1802 break;
1803 case MBX_READ_SPARM64:
1804 case MBX_READ_LA:
1805@@ -1978,17 +3188,15 @@ sysfs_mbox_read(struct kobject *kobj, st
1806 /* If HBA encountered an error attention, allow only DUMP
1807 * or RESTART mailbox commands until the HBA is restarted.
1808 */
1809- if ((phba->pport->stopped) &&
1810- (phba->sysfs_mbox.mbox->mb.mbxCommand !=
1811- MBX_DUMP_MEMORY &&
1812- phba->sysfs_mbox.mbox->mb.mbxCommand !=
1813- MBX_RESTART &&
1814- phba->sysfs_mbox.mbox->mb.mbxCommand !=
1815- MBX_WRITE_VPARMS)) {
1816- sysfs_mbox_idle(phba);
1817- spin_unlock_irq(&phba->hbalock);
1818- return -EPERM;
1819- }
1820+ if (phba->pport->stopped &&
1821+ phba->sysfs_mbox.mbox->mb.mbxCommand != MBX_DUMP_MEMORY &&
1822+ phba->sysfs_mbox.mbox->mb.mbxCommand != MBX_RESTART &&
1823+ phba->sysfs_mbox.mbox->mb.mbxCommand != MBX_WRITE_VPARMS &&
1824+ phba->sysfs_mbox.mbox->mb.mbxCommand != MBX_WRITE_WWN)
1825+ lpfc_printf_log(phba, KERN_WARNING, LOG_MBOX,
1826+ "1259 mbox: Issued mailbox cmd "
1827+ "0x%x while in stopped state.\n",
1828+ phba->sysfs_mbox.mbox->mb.mbxCommand);
1829
1830 phba->sysfs_mbox.mbox->vport = vport;
1831
1832@@ -2059,6 +3267,14 @@ static struct bin_attribute sysfs_mbox_a
1833 .write = sysfs_mbox_write,
1834 };
1835
1836+/**
1837+ * lpfc_alloc_sysfs_attr: Creates the ctlreg and mbox entries.
1838+ * @vport: address of lpfc vport structure.
1839+ *
1840+ * Return codes:
1841+ * zero on success
1842+ * error return code from sysfs_create_bin_file()
1843+ **/
1844 int
1845 lpfc_alloc_sysfs_attr(struct lpfc_vport *vport)
1846 {
1847@@ -2075,18 +3291,30 @@ lpfc_alloc_sysfs_attr(struct lpfc_vport
1848 if (error)
1849 goto out_remove_ctlreg_attr;
1850
1851+ error = sysfs_create_bin_file(&shost->shost_dev.kobj,
1852+ &sysfs_drvr_stat_data_attr);
1853+ if (error)
1854+ goto out_remove_mbox_attr;
1855+
1856 return 0;
1857+out_remove_mbox_attr:
1858+ sysfs_remove_bin_file(&shost->shost_dev.kobj, &sysfs_mbox_attr);
1859 out_remove_ctlreg_attr:
1860 sysfs_remove_bin_file(&shost->shost_dev.kobj, &sysfs_ctlreg_attr);
1861 out:
1862 return error;
1863 }
1864
1865+/**
1866+ * lpfc_free_sysfs_attr: Removes the ctlreg and mbox entries.
1867+ * @vport: address of lpfc vport structure.
1868+ **/
1869 void
1870 lpfc_free_sysfs_attr(struct lpfc_vport *vport)
1871 {
1872 struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
1873-
1874+ sysfs_remove_bin_file(&shost->shost_dev.kobj,
1875+ &sysfs_drvr_stat_data_attr);
1876 sysfs_remove_bin_file(&shost->shost_dev.kobj, &sysfs_mbox_attr);
1877 sysfs_remove_bin_file(&shost->shost_dev.kobj, &sysfs_ctlreg_attr);
1878 }
1879@@ -2096,6 +3324,10 @@ lpfc_free_sysfs_attr(struct lpfc_vport *
1880 * Dynamic FC Host Attributes Support
1881 */
1882
1883+/**
1884+ * lpfc_get_host_port_id: Copy the vport DID into the scsi host port id.
1885+ * @shost: kernel scsi host pointer.
1886+ **/
1887 static void
1888 lpfc_get_host_port_id(struct Scsi_Host *shost)
1889 {
1890@@ -2105,6 +3337,10 @@ lpfc_get_host_port_id(struct Scsi_Host *
1891 fc_host_port_id(shost) = vport->fc_myDID;
1892 }
1893
1894+/**
1895+ * lpfc_get_host_port_type: Set the value of the scsi host port type.
1896+ * @shost: kernel scsi host pointer.
1897+ **/
1898 static void
1899 lpfc_get_host_port_type(struct Scsi_Host *shost)
1900 {
1901@@ -2133,6 +3369,10 @@ lpfc_get_host_port_type(struct Scsi_Host
1902 spin_unlock_irq(shost->host_lock);
1903 }
1904
1905+/**
1906+ * lpfc_get_host_port_state: Set the value of the scsi host port state.
1907+ * @shost: kernel scsi host pointer.
1908+ **/
1909 static void
1910 lpfc_get_host_port_state(struct Scsi_Host *shost)
1911 {
1912@@ -2167,6 +3407,10 @@ lpfc_get_host_port_state(struct Scsi_Hos
1913 spin_unlock_irq(shost->host_lock);
1914 }
1915
1916+/**
1917+ * lpfc_get_host_speed: Set the value of the scsi host speed.
1918+ * @shost: kernel scsi host pointer.
1919+ **/
1920 static void
1921 lpfc_get_host_speed(struct Scsi_Host *shost)
1922 {
1923@@ -2199,6 +3443,10 @@ lpfc_get_host_speed(struct Scsi_Host *sh
1924 spin_unlock_irq(shost->host_lock);
1925 }
1926
1927+/**
1928+ * lpfc_get_host_fabric_name: Set the value of the scsi host fabric name.
1929+ * @shost: kernel scsi host pointer.
1930+ **/
1931 static void
1932 lpfc_get_host_fabric_name (struct Scsi_Host *shost)
1933 {
1934@@ -2221,6 +3469,18 @@ lpfc_get_host_fabric_name (struct Scsi_H
1935 fc_host_fabric_name(shost) = node_name;
1936 }
1937
1938+/**
1939+ * lpfc_get_stats: Return statistical information about the adapter.
1940+ * @shost: kernel scsi host pointer.
1941+ *
1942+ * Notes:
1943+ * NULL on error for link down, no mbox pool, sli2 active,
1944+ * management not allowed, memory allocation error, or mbox error.
1945+ *
1946+ * Returns:
1947+ * NULL for error
1948+ * address of the adapter host statistics
1949+ **/
1950 static struct fc_host_statistics *
1951 lpfc_get_stats(struct Scsi_Host *shost)
1952 {
1953@@ -2334,6 +3594,10 @@ lpfc_get_stats(struct Scsi_Host *shost)
1954 return hs;
1955 }
1956
1957+/**
1958+ * lpfc_reset_stats: Copy the adapter link stats information.
1959+ * @shost: kernel scsi host pointer.
1960+ **/
1961 static void
1962 lpfc_reset_stats(struct Scsi_Host *shost)
1963 {
1964@@ -2411,6 +3675,14 @@ lpfc_reset_stats(struct Scsi_Host *shost
1965 * are no sysfs handlers for link_down_tmo.
1966 */
1967
1968+/**
1969+ * lpfc_get_node_by_target: Return the nodelist for a target.
1970+ * @starget: kernel scsi target pointer.
1971+ *
1972+ * Returns:
1973+ * address of the node list if found
1974+ * NULL target not found
1975+ **/
1976 static struct lpfc_nodelist *
1977 lpfc_get_node_by_target(struct scsi_target *starget)
1978 {
1979@@ -2432,6 +3704,10 @@ lpfc_get_node_by_target(struct scsi_targ
1980 return NULL;
1981 }
1982
1983+/**
1984+ * lpfc_get_starget_port_id: Set the target port id to the ndlp DID or -1.
1985+ * @starget: kernel scsi target pointer.
1986+ **/
1987 static void
1988 lpfc_get_starget_port_id(struct scsi_target *starget)
1989 {
1990@@ -2440,6 +3716,12 @@ lpfc_get_starget_port_id(struct scsi_tar
1991 fc_starget_port_id(starget) = ndlp ? ndlp->nlp_DID : -1;
1992 }
1993
1994+/**
1995+ * lpfc_get_starget_node_name: Set the target node name.
1996+ * @starget: kernel scsi target pointer.
1997+ *
1998+ * Description: Set the target node name to the ndlp node name wwn or zero.
1999+ **/
2000 static void
2001 lpfc_get_starget_node_name(struct scsi_target *starget)
2002 {
2003@@ -2449,6 +3731,12 @@ lpfc_get_starget_node_name(struct scsi_t
2004 ndlp ? wwn_to_u64(ndlp->nlp_nodename.u.wwn) : 0;
2005 }
2006
2007+/**
2008+ * lpfc_get_starget_port_name: Set the target port name.
2009+ * @starget: kernel scsi target pointer.
2010+ *
2011+ * Description: set the target port name to the ndlp port name wwn or zero.
2012+ **/
2013 static void
2014 lpfc_get_starget_port_name(struct scsi_target *starget)
2015 {
2016@@ -2458,6 +3746,15 @@ lpfc_get_starget_port_name(struct scsi_t
2017 ndlp ? wwn_to_u64(ndlp->nlp_portname.u.wwn) : 0;
2018 }
2019
2020+/**
2021+ * lpfc_set_rport_loss_tmo: Set the rport dev loss tmo.
2022+ * @rport: fc rport address.
2023+ * @timeout: new value for dev loss tmo.
2024+ *
2025+ * Description:
2026+ * If timeout is non zero set the dev_loss_tmo to timeout, else set
2027+ * dev_loss_tmo to one.
2028+ **/
2029 static void
2030 lpfc_set_rport_loss_tmo(struct fc_rport *rport, uint32_t timeout)
2031 {
2032@@ -2467,7 +3764,18 @@ lpfc_set_rport_loss_tmo(struct fc_rport
2033 rport->dev_loss_tmo = 1;
2034 }
2035
2036-
2037+/**
2038+ * lpfc_rport_show_function: Return rport target information.
2039+ *
2040+ * Description:
2041+ * Macro that uses field to generate a function with the name lpfc_show_rport_
2042+ *
2043+ * lpfc_show_rport_##field: returns the bytes formatted in buf
2044+ * @cdev: class converted to an fc_rport.
2045+ * @buf: on return contains the target_field or zero.
2046+ *
2047+ * Returns: size of formatted string.
2048+ **/
2049 #define lpfc_rport_show_function(field, format_string, sz, cast) \
2050 static ssize_t \
2051 lpfc_show_rport_##field (struct device *dev, \
2052@@ -2602,6 +3910,10 @@ struct fc_function_template lpfc_vport_t
2053 .vport_disable = lpfc_vport_disable,
2054 };
2055
2056+/**
2057+ * lpfc_get_cfgparam: Used during probe_one to init the adapter structure.
2058+ * @phba: lpfc_hba pointer.
2059+ **/
2060 void
2061 lpfc_get_cfgparam(struct lpfc_hba *phba)
2062 {
2063@@ -2637,6 +3949,10 @@ lpfc_get_cfgparam(struct lpfc_hba *phba)
2064 return;
2065 }
2066
2067+/**
2068+ * lpfc_get_vport_cfgparam: Used during port create, init the vport structure.
2069+ * @vport: lpfc_vport pointer.
2070+ **/
2071 void
2072 lpfc_get_vport_cfgparam(struct lpfc_vport *vport)
2073 {
2074@@ -2648,6 +3964,7 @@ lpfc_get_vport_cfgparam(struct lpfc_vpor
2075 lpfc_restrict_login_init(vport, lpfc_restrict_login);
2076 lpfc_fcp_class_init(vport, lpfc_fcp_class);
2077 lpfc_use_adisc_init(vport, lpfc_use_adisc);
2078+ lpfc_max_scsicmpl_time_init(vport, lpfc_max_scsicmpl_time);
2079 lpfc_fdmi_on_init(vport, lpfc_fdmi_on);
2080 lpfc_discovery_threads_init(vport, lpfc_discovery_threads);
2081 lpfc_max_luns_init(vport, lpfc_max_luns);
2082--- a/drivers/scsi/lpfc/lpfc_crtn.h
2083+++ b/drivers/scsi/lpfc/lpfc_crtn.h
2084@@ -18,7 +18,7 @@
2085 * included with this package. *
2086 *******************************************************************/
2087
2088-typedef int (*node_filter)(struct lpfc_nodelist *ndlp, void *param);
2089+typedef int (*node_filter)(struct lpfc_nodelist *, void *);
2090
2091 struct fc_rport;
2092 void lpfc_dump_mem(struct lpfc_hba *, LPFC_MBOXQ_t *, uint16_t);
2093@@ -26,11 +26,11 @@ void lpfc_read_nv(struct lpfc_hba *, LPF
2094 void lpfc_config_async(struct lpfc_hba *, LPFC_MBOXQ_t *, uint32_t);
2095
2096 void lpfc_heart_beat(struct lpfc_hba *, LPFC_MBOXQ_t *);
2097-int lpfc_read_la(struct lpfc_hba * phba, LPFC_MBOXQ_t * pmb,
2098- struct lpfc_dmabuf *mp);
2099+int lpfc_read_la(struct lpfc_hba *, LPFC_MBOXQ_t *, struct lpfc_dmabuf *);
2100 void lpfc_clear_la(struct lpfc_hba *, LPFC_MBOXQ_t *);
2101-void lpfc_issue_clear_la(struct lpfc_hba *phba, struct lpfc_vport *vport);
2102+void lpfc_issue_clear_la(struct lpfc_hba *, struct lpfc_vport *);
2103 void lpfc_config_link(struct lpfc_hba *, LPFC_MBOXQ_t *);
2104+int lpfc_config_msi(struct lpfc_hba *, LPFC_MBOXQ_t *);
2105 int lpfc_read_sparam(struct lpfc_hba *, LPFC_MBOXQ_t *, int);
2106 void lpfc_read_config(struct lpfc_hba *, LPFC_MBOXQ_t *);
2107 void lpfc_read_lnk_stat(struct lpfc_hba *, LPFC_MBOXQ_t *);
2108@@ -43,7 +43,7 @@ void lpfc_unreg_vpi(struct lpfc_hba *, u
2109 void lpfc_init_link(struct lpfc_hba *, LPFC_MBOXQ_t *, uint32_t, uint32_t);
2110
2111 struct lpfc_vport *lpfc_find_vport_by_did(struct lpfc_hba *, uint32_t);
2112-void lpfc_cleanup_rpis(struct lpfc_vport *vport, int remove);
2113+void lpfc_cleanup_rpis(struct lpfc_vport *, int);
2114 int lpfc_linkdown(struct lpfc_hba *);
2115 void lpfc_port_link_failure(struct lpfc_vport *);
2116 void lpfc_mbx_cmpl_read_la(struct lpfc_hba *, LPFC_MBOXQ_t *);
2117@@ -135,7 +135,7 @@ void lpfc_ct_unsol_event(struct lpfc_hba
2118 int lpfc_ns_cmd(struct lpfc_vport *, int, uint8_t, uint32_t);
2119 int lpfc_fdmi_cmd(struct lpfc_vport *, struct lpfc_nodelist *, int);
2120 void lpfc_fdmi_tmo(unsigned long);
2121-void lpfc_fdmi_timeout_handler(struct lpfc_vport *vport);
2122+void lpfc_fdmi_timeout_handler(struct lpfc_vport *);
2123
2124 int lpfc_config_port_prep(struct lpfc_hba *);
2125 int lpfc_config_port_post(struct lpfc_hba *);
2126@@ -155,6 +155,8 @@ int lpfc_sli_queue_setup(struct lpfc_hba
2127 void lpfc_handle_eratt(struct lpfc_hba *);
2128 void lpfc_handle_latt(struct lpfc_hba *);
2129 irqreturn_t lpfc_intr_handler(int, void *);
2130+irqreturn_t lpfc_sp_intr_handler(int, void *);
2131+irqreturn_t lpfc_fp_intr_handler(int, void *);
2132
2133 void lpfc_read_rev(struct lpfc_hba *, LPFC_MBOXQ_t *);
2134 void lpfc_config_ring(struct lpfc_hba *, int, LPFC_MBOXQ_t *);
2135@@ -175,11 +177,12 @@ void lpfc_mem_free(struct lpfc_hba *);
2136 void lpfc_stop_vport_timers(struct lpfc_vport *);
2137
2138 void lpfc_poll_timeout(unsigned long ptr);
2139-void lpfc_poll_start_timer(struct lpfc_hba * phba);
2140-void lpfc_sli_poll_fcp_ring(struct lpfc_hba * hba);
2141+void lpfc_poll_start_timer(struct lpfc_hba *);
2142+void lpfc_poll_eratt(unsigned long);
2143+void lpfc_sli_poll_fcp_ring(struct lpfc_hba *);
2144 struct lpfc_iocbq * lpfc_sli_get_iocbq(struct lpfc_hba *);
2145-void lpfc_sli_release_iocbq(struct lpfc_hba * phba, struct lpfc_iocbq * iocb);
2146-uint16_t lpfc_sli_next_iotag(struct lpfc_hba * phba, struct lpfc_iocbq * iocb);
2147+void lpfc_sli_release_iocbq(struct lpfc_hba *, struct lpfc_iocbq *);
2148+uint16_t lpfc_sli_next_iotag(struct lpfc_hba *, struct lpfc_iocbq *);
2149
2150 void lpfc_reset_barrier(struct lpfc_hba * phba);
2151 int lpfc_sli_brdready(struct lpfc_hba *, uint32_t);
2152@@ -187,11 +190,13 @@ int lpfc_sli_brdkill(struct lpfc_hba *);
2153 int lpfc_sli_brdreset(struct lpfc_hba *);
2154 int lpfc_sli_brdrestart(struct lpfc_hba *);
2155 int lpfc_sli_hba_setup(struct lpfc_hba *);
2156+int lpfc_sli_config_port(struct lpfc_hba *, int);
2157 int lpfc_sli_host_down(struct lpfc_vport *);
2158 int lpfc_sli_hba_down(struct lpfc_hba *);
2159 int lpfc_sli_issue_mbox(struct lpfc_hba *, LPFC_MBOXQ_t *, uint32_t);
2160 int lpfc_sli_handle_mb_event(struct lpfc_hba *);
2161 int lpfc_sli_flush_mbox_queue(struct lpfc_hba *);
2162+int lpfc_sli_check_eratt(struct lpfc_hba *);
2163 int lpfc_sli_handle_slow_ring_event(struct lpfc_hba *,
2164 struct lpfc_sli_ring *, uint32_t);
2165 void lpfc_sli_def_mbox_cmpl(struct lpfc_hba *, LPFC_MBOXQ_t *);
2166@@ -199,6 +204,7 @@ int lpfc_sli_issue_iocb(struct lpfc_hba
2167 struct lpfc_iocbq *, uint32_t);
2168 void lpfc_sli_pcimem_bcopy(void *, void *, uint32_t);
2169 void lpfc_sli_abort_iocb_ring(struct lpfc_hba *, struct lpfc_sli_ring *);
2170+void lpfc_sli_flush_fcp_rings(struct lpfc_hba *);
2171 int lpfc_sli_ringpostbuf_put(struct lpfc_hba *, struct lpfc_sli_ring *,
2172 struct lpfc_dmabuf *);
2173 struct lpfc_dmabuf *lpfc_sli_ringpostbuf_get(struct lpfc_hba *,
2174@@ -226,17 +232,13 @@ struct lpfc_nodelist *lpfc_findnode_did(
2175 struct lpfc_nodelist *lpfc_findnode_wwpn(struct lpfc_vport *,
2176 struct lpfc_name *);
2177
2178-int lpfc_sli_issue_mbox_wait(struct lpfc_hba * phba, LPFC_MBOXQ_t * pmboxq,
2179- uint32_t timeout);
2180+int lpfc_sli_issue_mbox_wait(struct lpfc_hba *, LPFC_MBOXQ_t *, uint32_t);
2181
2182-int lpfc_sli_issue_iocb_wait(struct lpfc_hba * phba,
2183- struct lpfc_sli_ring * pring,
2184- struct lpfc_iocbq * piocb,
2185- struct lpfc_iocbq * prspiocbq,
2186- uint32_t timeout);
2187-void lpfc_sli_abort_fcp_cmpl(struct lpfc_hba * phba,
2188- struct lpfc_iocbq * cmdiocb,
2189- struct lpfc_iocbq * rspiocb);
2190+int lpfc_sli_issue_iocb_wait(struct lpfc_hba *, struct lpfc_sli_ring *,
2191+ struct lpfc_iocbq *, struct lpfc_iocbq *,
2192+ uint32_t);
2193+void lpfc_sli_abort_fcp_cmpl(struct lpfc_hba *, struct lpfc_iocbq *,
2194+ struct lpfc_iocbq *);
2195
2196 void lpfc_sli_free_hbq(struct lpfc_hba *, struct hbq_dmabuf *);
2197
2198@@ -269,7 +271,7 @@ void lpfc_dev_loss_tmo_callbk(struct fc_
2199
2200 struct lpfc_vport *lpfc_create_port(struct lpfc_hba *, int, struct device *);
2201 int lpfc_vport_disable(struct fc_vport *fc_vport, bool disable);
2202-void lpfc_mbx_unreg_vpi(struct lpfc_vport *);
2203+int lpfc_mbx_unreg_vpi(struct lpfc_vport *);
2204 void destroy_port(struct lpfc_vport *);
2205 int lpfc_get_instance(void);
2206 void lpfc_host_attrib_init(struct Scsi_Host *);
2207@@ -290,6 +292,13 @@ void lpfc_unblock_fabric_iocbs(struct lp
2208 void lpfc_adjust_queue_depth(struct lpfc_hba *);
2209 void lpfc_ramp_down_queue_handler(struct lpfc_hba *);
2210 void lpfc_ramp_up_queue_handler(struct lpfc_hba *);
2211+void lpfc_scsi_dev_block(struct lpfc_hba *);
2212+
2213+void
2214+lpfc_send_els_failure_event(struct lpfc_hba *, struct lpfc_iocbq *,
2215+ struct lpfc_iocbq *);
2216+struct lpfc_fast_path_event *lpfc_alloc_fast_evt(struct lpfc_hba *);
2217+void lpfc_free_fast_evt(struct lpfc_hba *, struct lpfc_fast_path_event *);
2218
2219 #define ScsiResult(host_code, scsi_code) (((host_code) << 16) | scsi_code)
2220 #define HBA_EVENT_RSCN 5
2221--- a/drivers/scsi/lpfc/lpfc_ct.c
2222+++ b/drivers/scsi/lpfc/lpfc_ct.c
2223@@ -34,6 +34,7 @@
2224
2225 #include "lpfc_hw.h"
2226 #include "lpfc_sli.h"
2227+#include "lpfc_nl.h"
2228 #include "lpfc_disc.h"
2229 #include "lpfc_scsi.h"
2230 #include "lpfc.h"
2231@@ -134,25 +135,24 @@ lpfc_ct_unsol_event(struct lpfc_hba *phb
2232 }
2233 list_del(&head);
2234 } else {
2235- struct lpfc_iocbq *next;
2236-
2237- list_for_each_entry_safe(iocbq, next, &piocbq->list, list) {
2238+ INIT_LIST_HEAD(&head);
2239+ list_add_tail(&head, &piocbq->list);
2240+ list_for_each_entry(iocbq, &head, list) {
2241 icmd = &iocbq->iocb;
2242 if (icmd->ulpBdeCount == 0)
2243- lpfc_ct_unsol_buffer(phba, piocbq, NULL, 0);
2244+ lpfc_ct_unsol_buffer(phba, iocbq, NULL, 0);
2245 for (i = 0; i < icmd->ulpBdeCount; i++) {
2246 paddr = getPaddr(icmd->un.cont64[i].addrHigh,
2247 icmd->un.cont64[i].addrLow);
2248 mp = lpfc_sli_ringpostbuf_get(phba, pring,
2249 paddr);
2250 size = icmd->un.cont64[i].tus.f.bdeSize;
2251- lpfc_ct_unsol_buffer(phba, piocbq, mp, size);
2252+ lpfc_ct_unsol_buffer(phba, iocbq, mp, size);
2253 lpfc_in_buf_free(phba, mp);
2254 }
2255- list_del(&iocbq->list);
2256- lpfc_sli_release_iocbq(phba, iocbq);
2257 lpfc_post_buffer(phba, pring, i);
2258 }
2259+ list_del(&head);
2260 }
2261 }
2262
2263@@ -212,7 +212,7 @@ lpfc_alloc_ct_rsp(struct lpfc_hba *phba,
2264 else
2265 list_add_tail(&mp->list, &mlist->list);
2266
2267- bpl->tus.f.bdeFlags = BUFF_USE_RCV;
2268+ bpl->tus.f.bdeFlags = BUFF_TYPE_BDE_64I;
2269 /* build buffer ptr list for IOCB */
2270 bpl->addrLow = le32_to_cpu(putPaddrLow(mp->phys) );
2271 bpl->addrHigh = le32_to_cpu(putPaddrHigh(mp->phys) );
2272@@ -283,7 +283,7 @@ lpfc_gen_req(struct lpfc_vport *vport, s
2273 icmd->un.genreq64.bdl.ulpIoTag32 = 0;
2274 icmd->un.genreq64.bdl.addrHigh = putPaddrHigh(bmp->phys);
2275 icmd->un.genreq64.bdl.addrLow = putPaddrLow(bmp->phys);
2276- icmd->un.genreq64.bdl.bdeFlags = BUFF_TYPE_BDL;
2277+ icmd->un.genreq64.bdl.bdeFlags = BUFF_TYPE_BLP_64;
2278 icmd->un.genreq64.bdl.bdeSize = (num_entry * sizeof (struct ulp_bde64));
2279
2280 if (usr_flg)
2281@@ -861,7 +861,7 @@ lpfc_cmpl_ct(struct lpfc_hba *phba, stru
2282
2283 retry++;
2284 lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
2285- "0216 Retrying NS cmd %x\n", cmdcode);
2286+ "0250 Retrying NS cmd %x\n", cmdcode);
2287 rc = lpfc_ns_cmd(vport, cmdcode, retry, 0);
2288 if (rc == 0)
2289 goto out;
2290--- a/drivers/scsi/lpfc/lpfc_debugfs.c
2291+++ b/drivers/scsi/lpfc/lpfc_debugfs.c
2292@@ -1,7 +1,7 @@
2293 /*******************************************************************
2294 * This file is part of the Emulex Linux Device Driver for *
2295 * Fibre Channel Host Bus Adapters. *
2296- * Copyright (C) 2007 Emulex. All rights reserved. *
2297+ * Copyright (C) 2007-2008 Emulex. All rights reserved. *
2298 * EMULEX and SLI are trademarks of Emulex. *
2299 * www.emulex.com *
2300 * *
2301@@ -35,6 +35,7 @@
2302
2303 #include "lpfc_hw.h"
2304 #include "lpfc_sli.h"
2305+#include "lpfc_nl.h"
2306 #include "lpfc_disc.h"
2307 #include "lpfc_scsi.h"
2308 #include "lpfc.h"
2309@@ -46,13 +47,14 @@
2310 #include "lpfc_debugfs.h"
2311
2312 #ifdef CONFIG_LPFC_DEBUG_FS
2313-/* debugfs interface
2314+/**
2315+ * debugfs interface
2316 *
2317 * To access this interface the user should:
2318 * # mkdir /debug
2319 * # mount -t debugfs none /debug
2320 *
2321- * The lpfc debugfs directory hierachy is:
2322+ * The lpfc debugfs directory hierarchy is:
2323 * lpfc/lpfcX/vportY
2324 * where X is the lpfc hba unique_id
2325 * where Y is the vport VPI on that hba
2326@@ -61,14 +63,21 @@
2327 * discovery_trace
2328 * This is an ACSII readable file that contains a trace of the last
2329 * lpfc_debugfs_max_disc_trc events that happened on a specific vport.
2330- * See lpfc_debugfs.h for different categories of
2331- * discovery events. To enable the discovery trace, the following
2332- * module parameters must be set:
2333+ * See lpfc_debugfs.h for different categories of discovery events.
2334+ * To enable the discovery trace, the following module parameters must be set:
2335 * lpfc_debugfs_enable=1 Turns on lpfc debugfs filesystem support
2336 * lpfc_debugfs_max_disc_trc=X Where X is the event trace depth for
2337 * EACH vport. X MUST also be a power of 2.
2338 * lpfc_debugfs_mask_disc_trc=Y Where Y is an event mask as defined in
2339 * lpfc_debugfs.h .
2340+ *
2341+ * slow_ring_trace
2342+ * This is an ACSII readable file that contains a trace of the last
2343+ * lpfc_debugfs_max_slow_ring_trc events that happened on a specific HBA.
2344+ * To enable the slow ring trace, the following module parameters must be set:
2345+ * lpfc_debugfs_enable=1 Turns on lpfc debugfs filesystem support
2346+ * lpfc_debugfs_max_slow_ring_trc=X Where X is the event trace depth for
2347+ * the HBA. X MUST also be a power of 2.
2348 */
2349 static int lpfc_debugfs_enable = 1;
2350 module_param(lpfc_debugfs_enable, int, 0);
2351@@ -117,6 +126,25 @@ struct lpfc_debug {
2352 static atomic_t lpfc_debugfs_seq_trc_cnt = ATOMIC_INIT(0);
2353 static unsigned long lpfc_debugfs_start_time = 0L;
2354
2355+/**
2356+ * lpfc_debugfs_disc_trc_data - Dump discovery logging to a buffer.
2357+ * @vport: The vport to gather the log info from.
2358+ * @buf: The buffer to dump log into.
2359+ * @size: The maximum amount of data to process.
2360+ *
2361+ * Description:
2362+ * This routine gathers the lpfc discovery debugfs data from the @vport and
2363+ * dumps it to @buf up to @size number of bytes. It will start at the next entry
2364+ * in the log and process the log until the end of the buffer. Then it will
2365+ * gather from the beginning of the log and process until the current entry.
2366+ *
2367+ * Notes:
2368+ * Discovery logging will be disabled while while this routine dumps the log.
2369+ *
2370+ * Return Value:
2371+ * This routine returns the amount of bytes that were dumped into @buf and will
2372+ * not exceed @size.
2373+ **/
2374 static int
2375 lpfc_debugfs_disc_trc_data(struct lpfc_vport *vport, char *buf, int size)
2376 {
2377@@ -125,7 +153,6 @@ lpfc_debugfs_disc_trc_data(struct lpfc_v
2378 struct lpfc_debugfs_trc *dtp;
2379 char buffer[LPFC_DEBUG_TRC_ENTRY_SIZE];
2380
2381-
2382 enable = lpfc_debugfs_enable;
2383 lpfc_debugfs_enable = 0;
2384
2385@@ -159,6 +186,25 @@ lpfc_debugfs_disc_trc_data(struct lpfc_v
2386 return len;
2387 }
2388
2389+/**
2390+ * lpfc_debugfs_slow_ring_trc_data - Dump slow ring logging to a buffer.
2391+ * @phba: The HBA to gather the log info from.
2392+ * @buf: The buffer to dump log into.
2393+ * @size: The maximum amount of data to process.
2394+ *
2395+ * Description:
2396+ * This routine gathers the lpfc slow ring debugfs data from the @phba and
2397+ * dumps it to @buf up to @size number of bytes. It will start at the next entry
2398+ * in the log and process the log until the end of the buffer. Then it will
2399+ * gather from the beginning of the log and process until the current entry.
2400+ *
2401+ * Notes:
2402+ * Slow ring logging will be disabled while while this routine dumps the log.
2403+ *
2404+ * Return Value:
2405+ * This routine returns the amount of bytes that were dumped into @buf and will
2406+ * not exceed @size.
2407+ **/
2408 static int
2409 lpfc_debugfs_slow_ring_trc_data(struct lpfc_hba *phba, char *buf, int size)
2410 {
2411@@ -203,6 +249,25 @@ lpfc_debugfs_slow_ring_trc_data(struct l
2412
2413 static int lpfc_debugfs_last_hbq = -1;
2414
2415+/**
2416+ * lpfc_debugfs_hbqinfo_data - Dump host buffer queue info to a buffer.
2417+ * @phba: The HBA to gather host buffer info from.
2418+ * @buf: The buffer to dump log into.
2419+ * @size: The maximum amount of data to process.
2420+ *
2421+ * Description:
2422+ * This routine dumps the host buffer queue info from the @phba to @buf up to
2423+ * @size number of bytes. A header that describes the current hbq state will be
2424+ * dumped to @buf first and then info on each hbq entry will be dumped to @buf
2425+ * until @size bytes have been dumped or all the hbq info has been dumped.
2426+ *
2427+ * Notes:
2428+ * This routine will rotate through each configured HBQ each time called.
2429+ *
2430+ * Return Value:
2431+ * This routine returns the amount of bytes that were dumped into @buf and will
2432+ * not exceed @size.
2433+ **/
2434 static int
2435 lpfc_debugfs_hbqinfo_data(struct lpfc_hba *phba, char *buf, int size)
2436 {
2437@@ -303,6 +368,24 @@ skipit:
2438
2439 static int lpfc_debugfs_last_hba_slim_off;
2440
2441+/**
2442+ * lpfc_debugfs_dumpHBASlim_data - Dump HBA SLIM info to a buffer.
2443+ * @phba: The HBA to gather SLIM info from.
2444+ * @buf: The buffer to dump log into.
2445+ * @size: The maximum amount of data to process.
2446+ *
2447+ * Description:
2448+ * This routine dumps the current contents of HBA SLIM for the HBA associated
2449+ * with @phba to @buf up to @size bytes of data. This is the raw HBA SLIM data.
2450+ *
2451+ * Notes:
2452+ * This routine will only dump up to 1024 bytes of data each time called and
2453+ * should be called multiple times to dump the entire HBA SLIM.
2454+ *
2455+ * Return Value:
2456+ * This routine returns the amount of bytes that were dumped into @buf and will
2457+ * not exceed @size.
2458+ **/
2459 static int
2460 lpfc_debugfs_dumpHBASlim_data(struct lpfc_hba *phba, char *buf, int size)
2461 {
2462@@ -342,6 +425,21 @@ lpfc_debugfs_dumpHBASlim_data(struct lpf
2463 return len;
2464 }
2465
2466+/**
2467+ * lpfc_debugfs_dumpHostSlim_data - Dump host SLIM info to a buffer.
2468+ * @phba: The HBA to gather Host SLIM info from.
2469+ * @buf: The buffer to dump log into.
2470+ * @size: The maximum amount of data to process.
2471+ *
2472+ * Description:
2473+ * This routine dumps the current contents of host SLIM for the host associated
2474+ * with @phba to @buf up to @size bytes of data. The dump will contain the
2475+ * Mailbox, PCB, Rings, and Registers that are located in host memory.
2476+ *
2477+ * Return Value:
2478+ * This routine returns the amount of bytes that were dumped into @buf and will
2479+ * not exceed @size.
2480+ **/
2481 static int
2482 lpfc_debugfs_dumpHostSlim_data(struct lpfc_hba *phba, char *buf, int size)
2483 {
2484@@ -357,7 +455,7 @@ lpfc_debugfs_dumpHostSlim_data(struct lp
2485 spin_lock_irq(&phba->hbalock);
2486
2487 len += snprintf(buf+len, size-len, "SLIM Mailbox\n");
2488- ptr = (uint32_t *)phba->slim2p;
2489+ ptr = (uint32_t *)phba->slim2p.virt;
2490 i = sizeof(MAILBOX_t);
2491 while (i > 0) {
2492 len += snprintf(buf+len, size-len,
2493@@ -370,7 +468,7 @@ lpfc_debugfs_dumpHostSlim_data(struct lp
2494 }
2495
2496 len += snprintf(buf+len, size-len, "SLIM PCB\n");
2497- ptr = (uint32_t *)&phba->slim2p->pcb;
2498+ ptr = (uint32_t *)phba->pcb;
2499 i = sizeof(PCB_t);
2500 while (i > 0) {
2501 len += snprintf(buf+len, size-len,
2502@@ -382,44 +480,16 @@ lpfc_debugfs_dumpHostSlim_data(struct lp
2503 off += (8 * sizeof(uint32_t));
2504 }
2505
2506- pgpp = (struct lpfc_pgp *)&phba->slim2p->mbx.us.s3_pgp.port;
2507- pring = &psli->ring[0];
2508- len += snprintf(buf+len, size-len,
2509- "Ring 0: CMD GetInx:%d (Max:%d Next:%d Local:%d flg:x%x) "
2510- "RSP PutInx:%d Max:%d\n",
2511- pgpp->cmdGetInx, pring->numCiocb,
2512- pring->next_cmdidx, pring->local_getidx, pring->flag,
2513- pgpp->rspPutInx, pring->numRiocb);
2514- pgpp++;
2515-
2516- pring = &psli->ring[1];
2517- len += snprintf(buf+len, size-len,
2518- "Ring 1: CMD GetInx:%d (Max:%d Next:%d Local:%d flg:x%x) "
2519- "RSP PutInx:%d Max:%d\n",
2520- pgpp->cmdGetInx, pring->numCiocb,
2521- pring->next_cmdidx, pring->local_getidx, pring->flag,
2522- pgpp->rspPutInx, pring->numRiocb);
2523- pgpp++;
2524-
2525- pring = &psli->ring[2];
2526- len += snprintf(buf+len, size-len,
2527- "Ring 2: CMD GetInx:%d (Max:%d Next:%d Local:%d flg:x%x) "
2528- "RSP PutInx:%d Max:%d\n",
2529- pgpp->cmdGetInx, pring->numCiocb,
2530- pring->next_cmdidx, pring->local_getidx, pring->flag,
2531- pgpp->rspPutInx, pring->numRiocb);
2532- pgpp++;
2533-
2534- pring = &psli->ring[3];
2535- len += snprintf(buf+len, size-len,
2536- "Ring 3: CMD GetInx:%d (Max:%d Next:%d Local:%d flg:x%x) "
2537- "RSP PutInx:%d Max:%d\n",
2538- pgpp->cmdGetInx, pring->numCiocb,
2539- pring->next_cmdidx, pring->local_getidx, pring->flag,
2540- pgpp->rspPutInx, pring->numRiocb);
2541-
2542-
2543- ptr = (uint32_t *)&phba->slim2p->mbx.us.s3_pgp.hbq_get;
2544+ for (i = 0; i < 4; i++) {
2545+ pgpp = &phba->port_gp[i];
2546+ pring = &psli->ring[i];
2547+ len += snprintf(buf+len, size-len,
2548+ "Ring %d: CMD GetInx:%d (Max:%d Next:%d "
2549+ "Local:%d flg:x%x) RSP PutInx:%d Max:%d\n",
2550+ i, pgpp->cmdGetInx, pring->numCiocb,
2551+ pring->next_cmdidx, pring->local_getidx,
2552+ pring->flag, pgpp->rspPutInx, pring->numRiocb);
2553+ }
2554 word0 = readl(phba->HAregaddr);
2555 word1 = readl(phba->CAregaddr);
2556 word2 = readl(phba->HSregaddr);
2557@@ -430,6 +500,21 @@ lpfc_debugfs_dumpHostSlim_data(struct lp
2558 return len;
2559 }
2560
2561+/**
2562+ * lpfc_debugfs_nodelist_data - Dump target node list to a buffer.
2563+ * @vport: The vport to gather target node info from.
2564+ * @buf: The buffer to dump log into.
2565+ * @size: The maximum amount of data to process.
2566+ *
2567+ * Description:
2568+ * This routine dumps the current target node list associated with @vport to
2569+ * @buf up to @size bytes of data. Each node entry in the dump will contain a
2570+ * node state, DID, WWPN, WWNN, RPI, flags, type, and other useful fields.
2571+ *
2572+ * Return Value:
2573+ * This routine returns the amount of bytes that were dumped into @buf and will
2574+ * not exceed @size.
2575+ **/
2576 static int
2577 lpfc_debugfs_nodelist_data(struct lpfc_vport *vport, char *buf, int size)
2578 {
2579@@ -513,7 +598,22 @@ lpfc_debugfs_nodelist_data(struct lpfc_v
2580 }
2581 #endif
2582
2583-
2584+/**
2585+ * lpfc_debugfs_disc_trc - Store discovery trace log.
2586+ * @vport: The vport to associate this trace string with for retrieval.
2587+ * @mask: Log entry classification.
2588+ * @fmt: Format string to be displayed when dumping the log.
2589+ * @data1: 1st data parameter to be applied to @fmt.
2590+ * @data2: 2nd data parameter to be applied to @fmt.
2591+ * @data3: 3rd data parameter to be applied to @fmt.
2592+ *
2593+ * Description:
2594+ * This routine is used by the driver code to add a debugfs log entry to the
2595+ * discovery trace buffer associated with @vport. Only entries with a @mask that
2596+ * match the current debugfs discovery mask will be saved. Entries that do not
2597+ * match will be thrown away. @fmt, @data1, @data2, and @data3 are used like
2598+ * printf when displaying the log.
2599+ **/
2600 inline void
2601 lpfc_debugfs_disc_trc(struct lpfc_vport *vport, int mask, char *fmt,
2602 uint32_t data1, uint32_t data2, uint32_t data3)
2603@@ -542,6 +642,19 @@ lpfc_debugfs_disc_trc(struct lpfc_vport
2604 return;
2605 }
2606
2607+/**
2608+ * lpfc_debugfs_slow_ring_trc - Store slow ring trace log.
2609+ * @phba: The phba to associate this trace string with for retrieval.
2610+ * @fmt: Format string to be displayed when dumping the log.
2611+ * @data1: 1st data parameter to be applied to @fmt.
2612+ * @data2: 2nd data parameter to be applied to @fmt.
2613+ * @data3: 3rd data parameter to be applied to @fmt.
2614+ *
2615+ * Description:
2616+ * This routine is used by the driver code to add a debugfs log entry to the
2617+ * discovery trace buffer associated with @vport. @fmt, @data1, @data2, and
2618+ * @data3 are used like printf when displaying the log.
2619+ **/
2620 inline void
2621 lpfc_debugfs_slow_ring_trc(struct lpfc_hba *phba, char *fmt,
2622 uint32_t data1, uint32_t data2, uint32_t data3)
2623@@ -568,6 +681,21 @@ lpfc_debugfs_slow_ring_trc(struct lpfc_h
2624 }
2625
2626 #ifdef CONFIG_LPFC_DEBUG_FS
2627+/**
2628+ * lpfc_debugfs_disc_trc_open - Open the discovery trace log.
2629+ * @inode: The inode pointer that contains a vport pointer.
2630+ * @file: The file pointer to attach the log output.
2631+ *
2632+ * Description:
2633+ * This routine is the entry point for the debugfs open file operation. It gets
2634+ * the vport from the i_private field in @inode, allocates the necessary buffer
2635+ * for the log, fills the buffer from the in-memory log for this vport, and then
2636+ * returns a pointer to that log in the private_data field in @file.
2637+ *
2638+ * Returns:
2639+ * This function returns zero if successful. On error it will return an negative
2640+ * error value.
2641+ **/
2642 static int
2643 lpfc_debugfs_disc_trc_open(struct inode *inode, struct file *file)
2644 {
2645@@ -585,7 +713,7 @@ lpfc_debugfs_disc_trc_open(struct inode
2646 if (!debug)
2647 goto out;
2648
2649- /* Round to page boundry */
2650+ /* Round to page boundary */
2651 size = (lpfc_debugfs_max_disc_trc * LPFC_DEBUG_TRC_ENTRY_SIZE);
2652 size = PAGE_ALIGN(size);
2653
2654@@ -603,6 +731,21 @@ out:
2655 return rc;
2656 }
2657
2658+/**
2659+ * lpfc_debugfs_slow_ring_trc_open - Open the Slow Ring trace log.
2660+ * @inode: The inode pointer that contains a vport pointer.
2661+ * @file: The file pointer to attach the log output.
2662+ *
2663+ * Description:
2664+ * This routine is the entry point for the debugfs open file operation. It gets
2665+ * the vport from the i_private field in @inode, allocates the necessary buffer
2666+ * for the log, fills the buffer from the in-memory log for this vport, and then
2667+ * returns a pointer to that log in the private_data field in @file.
2668+ *
2669+ * Returns:
2670+ * This function returns zero if successful. On error it will return an negative
2671+ * error value.
2672+ **/
2673 static int
2674 lpfc_debugfs_slow_ring_trc_open(struct inode *inode, struct file *file)
2675 {
2676@@ -620,7 +763,7 @@ lpfc_debugfs_slow_ring_trc_open(struct i
2677 if (!debug)
2678 goto out;
2679
2680- /* Round to page boundry */
2681+ /* Round to page boundary */
2682 size = (lpfc_debugfs_max_slow_ring_trc * LPFC_DEBUG_TRC_ENTRY_SIZE);
2683 size = PAGE_ALIGN(size);
2684
2685@@ -638,6 +781,21 @@ out:
2686 return rc;
2687 }
2688
2689+/**
2690+ * lpfc_debugfs_hbqinfo_open - Open the hbqinfo debugfs buffer.
2691+ * @inode: The inode pointer that contains a vport pointer.
2692+ * @file: The file pointer to attach the log output.
2693+ *
2694+ * Description:
2695+ * This routine is the entry point for the debugfs open file operation. It gets
2696+ * the vport from the i_private field in @inode, allocates the necessary buffer
2697+ * for the log, fills the buffer from the in-memory log for this vport, and then
2698+ * returns a pointer to that log in the private_data field in @file.
2699+ *
2700+ * Returns:
2701+ * This function returns zero if successful. On error it will return an negative
2702+ * error value.
2703+ **/
2704 static int
2705 lpfc_debugfs_hbqinfo_open(struct inode *inode, struct file *file)
2706 {
2707@@ -649,7 +807,7 @@ lpfc_debugfs_hbqinfo_open(struct inode *
2708 if (!debug)
2709 goto out;
2710
2711- /* Round to page boundry */
2712+ /* Round to page boundary */
2713 debug->buffer = kmalloc(LPFC_HBQINFO_SIZE, GFP_KERNEL);
2714 if (!debug->buffer) {
2715 kfree(debug);
2716@@ -665,6 +823,21 @@ out:
2717 return rc;
2718 }
2719
2720+/**
2721+ * lpfc_debugfs_dumpHBASlim_open - Open the Dump HBA SLIM debugfs buffer.
2722+ * @inode: The inode pointer that contains a vport pointer.
2723+ * @file: The file pointer to attach the log output.
2724+ *
2725+ * Description:
2726+ * This routine is the entry point for the debugfs open file operation. It gets
2727+ * the vport from the i_private field in @inode, allocates the necessary buffer
2728+ * for the log, fills the buffer from the in-memory log for this vport, and then
2729+ * returns a pointer to that log in the private_data field in @file.
2730+ *
2731+ * Returns:
2732+ * This function returns zero if successful. On error it will return an negative
2733+ * error value.
2734+ **/
2735 static int
2736 lpfc_debugfs_dumpHBASlim_open(struct inode *inode, struct file *file)
2737 {
2738@@ -676,7 +849,7 @@ lpfc_debugfs_dumpHBASlim_open(struct ino
2739 if (!debug)
2740 goto out;
2741
2742- /* Round to page boundry */
2743+ /* Round to page boundary */
2744 debug->buffer = kmalloc(LPFC_DUMPHBASLIM_SIZE, GFP_KERNEL);
2745 if (!debug->buffer) {
2746 kfree(debug);
2747@@ -692,6 +865,21 @@ out:
2748 return rc;
2749 }
2750
2751+/**
2752+ * lpfc_debugfs_dumpHostSlim_open - Open the Dump Host SLIM debugfs buffer.
2753+ * @inode: The inode pointer that contains a vport pointer.
2754+ * @file: The file pointer to attach the log output.
2755+ *
2756+ * Description:
2757+ * This routine is the entry point for the debugfs open file operation. It gets
2758+ * the vport from the i_private field in @inode, allocates the necessary buffer
2759+ * for the log, fills the buffer from the in-memory log for this vport, and then
2760+ * returns a pointer to that log in the private_data field in @file.
2761+ *
2762+ * Returns:
2763+ * This function returns zero if successful. On error it will return an negative
2764+ * error value.
2765+ **/
2766 static int
2767 lpfc_debugfs_dumpHostSlim_open(struct inode *inode, struct file *file)
2768 {
2769@@ -703,7 +891,7 @@ lpfc_debugfs_dumpHostSlim_open(struct in
2770 if (!debug)
2771 goto out;
2772
2773- /* Round to page boundry */
2774+ /* Round to page boundary */
2775 debug->buffer = kmalloc(LPFC_DUMPHOSTSLIM_SIZE, GFP_KERNEL);
2776 if (!debug->buffer) {
2777 kfree(debug);
2778@@ -719,6 +907,21 @@ out:
2779 return rc;
2780 }
2781
2782+/**
2783+ * lpfc_debugfs_nodelist_open - Open the nodelist debugfs file.
2784+ * @inode: The inode pointer that contains a vport pointer.
2785+ * @file: The file pointer to attach the log output.
2786+ *
2787+ * Description:
2788+ * This routine is the entry point for the debugfs open file operation. It gets
2789+ * the vport from the i_private field in @inode, allocates the necessary buffer
2790+ * for the log, fills the buffer from the in-memory log for this vport, and then
2791+ * returns a pointer to that log in the private_data field in @file.
2792+ *
2793+ * Returns:
2794+ * This function returns zero if successful. On error it will return an negative
2795+ * error value.
2796+ **/
2797 static int
2798 lpfc_debugfs_nodelist_open(struct inode *inode, struct file *file)
2799 {
2800@@ -730,7 +933,7 @@ lpfc_debugfs_nodelist_open(struct inode
2801 if (!debug)
2802 goto out;
2803
2804- /* Round to page boundry */
2805+ /* Round to page boundary */
2806 debug->buffer = kmalloc(LPFC_NODELIST_SIZE, GFP_KERNEL);
2807 if (!debug->buffer) {
2808 kfree(debug);
2809@@ -746,6 +949,23 @@ out:
2810 return rc;
2811 }
2812
2813+/**
2814+ * lpfc_debugfs_lseek - Seek through a debugfs file.
2815+ * @file: The file pointer to seek through.
2816+ * @off: The offset to seek to or the amount to seek by.
2817+ * @whence: Indicates how to seek.
2818+ *
2819+ * Description:
2820+ * This routine is the entry point for the debugfs lseek file operation. The
2821+ * @whence parameter indicates whether @off is the offset to directly seek to,
2822+ * or if it is a value to seek forward or reverse by. This function figures out
2823+ * what the new offset of the debugfs file will be and assigns that value to the
2824+ * f_pos field of @file.
2825+ *
2826+ * Returns:
2827+ * This function returns the new offset if successful and returns a negative
2828+ * error if unable to process the seek.
2829+ **/
2830 static loff_t
2831 lpfc_debugfs_lseek(struct file *file, loff_t off, int whence)
2832 {
2833@@ -767,6 +987,22 @@ lpfc_debugfs_lseek(struct file *file, lo
2834 return (pos < 0 || pos > debug->len) ? -EINVAL : (file->f_pos = pos);
2835 }
2836
2837+/**
2838+ * lpfc_debugfs_read - Read a debugfs file.
2839+ * @file: The file pointer to read from.
2840+ * @buf: The buffer to copy the data to.
2841+ * @nbytes: The number of bytes to read.
2842+ * @ppos: The position in the file to start reading from.
2843+ *
2844+ * Description:
2845+ * This routine reads data from from the buffer indicated in the private_data
2846+ * field of @file. It will start reading at @ppos and copy up to @nbytes of
2847+ * data to @buf.
2848+ *
2849+ * Returns:
2850+ * This function returns the amount of data that was read (this could be less
2851+ * than @nbytes if the end of the file was reached) or a negative error value.
2852+ **/
2853 static ssize_t
2854 lpfc_debugfs_read(struct file *file, char __user *buf,
2855 size_t nbytes, loff_t *ppos)
2856@@ -776,6 +1012,18 @@ lpfc_debugfs_read(struct file *file, cha
2857 debug->len);
2858 }
2859
2860+/**
2861+ * lpfc_debugfs_release - Release the buffer used to store debugfs file data.
2862+ * @inode: The inode pointer that contains a vport pointer. (unused)
2863+ * @file: The file pointer that contains the buffer to release.
2864+ *
2865+ * Description:
2866+ * This routine frees the buffer that was allocated when the debugfs file was
2867+ * opened.
2868+ *
2869+ * Returns:
2870+ * This function returns zero.
2871+ **/
2872 static int
2873 lpfc_debugfs_release(struct inode *inode, struct file *file)
2874 {
2875@@ -845,6 +1093,16 @@ static struct dentry *lpfc_debugfs_root
2876 static atomic_t lpfc_debugfs_hba_count;
2877 #endif
2878
2879+/**
2880+ * lpfc_debugfs_initialize - Initialize debugfs for a vport.
2881+ * @vport: The vport pointer to initialize.
2882+ *
2883+ * Description:
2884+ * When Debugfs is configured this routine sets up the lpfc debugfs file system.
2885+ * If not already created, this routine will create the lpfc directory, and
2886+ * lpfcX directory (for this HBA), and vportX directory for this vport. It will
2887+ * also create each file used to access lpfc specific debugfs information.
2888+ **/
2889 inline void
2890 lpfc_debugfs_initialize(struct lpfc_vport *vport)
2891 {
2892@@ -862,7 +1120,7 @@ lpfc_debugfs_initialize(struct lpfc_vpor
2893 atomic_set(&lpfc_debugfs_hba_count, 0);
2894 if (!lpfc_debugfs_root) {
2895 lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT,
2896- "0409 Cannot create debugfs root\n");
2897+ "0408 Cannot create debugfs root\n");
2898 goto debug_failed;
2899 }
2900 }
2901@@ -876,7 +1134,7 @@ lpfc_debugfs_initialize(struct lpfc_vpor
2902 debugfs_create_dir(name, lpfc_debugfs_root);
2903 if (!phba->hba_debugfs_root) {
2904 lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT,
2905- "0409 Cannot create debugfs hba\n");
2906+ "0412 Cannot create debugfs hba\n");
2907 goto debug_failed;
2908 }
2909 atomic_inc(&lpfc_debugfs_hba_count);
2910@@ -890,7 +1148,7 @@ lpfc_debugfs_initialize(struct lpfc_vpor
2911 phba, &lpfc_debugfs_op_hbqinfo);
2912 if (!phba->debug_hbqinfo) {
2913 lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT,
2914- "0409 Cannot create debugfs hbqinfo\n");
2915+ "0411 Cannot create debugfs hbqinfo\n");
2916 goto debug_failed;
2917 }
2918
2919@@ -902,7 +1160,7 @@ lpfc_debugfs_initialize(struct lpfc_vpor
2920 phba, &lpfc_debugfs_op_dumpHBASlim);
2921 if (!phba->debug_dumpHBASlim) {
2922 lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT,
2923- "0409 Cannot create debugfs dumpHBASlim\n");
2924+ "0413 Cannot create debugfs dumpHBASlim\n");
2925 goto debug_failed;
2926 }
2927
2928@@ -914,7 +1172,7 @@ lpfc_debugfs_initialize(struct lpfc_vpor
2929 phba, &lpfc_debugfs_op_dumpHostSlim);
2930 if (!phba->debug_dumpHostSlim) {
2931 lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT,
2932- "0409 Cannot create debugfs dumpHostSlim\n");
2933+ "0414 Cannot create debugfs dumpHostSlim\n");
2934 goto debug_failed;
2935 }
2936
2937@@ -944,7 +1202,7 @@ lpfc_debugfs_initialize(struct lpfc_vpor
2938 phba, &lpfc_debugfs_op_slow_ring_trc);
2939 if (!phba->debug_slow_ring_trc) {
2940 lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT,
2941- "0409 Cannot create debugfs "
2942+ "0415 Cannot create debugfs "
2943 "slow_ring_trace\n");
2944 goto debug_failed;
2945 }
2946@@ -955,7 +1213,7 @@ lpfc_debugfs_initialize(struct lpfc_vpor
2947 GFP_KERNEL);
2948 if (!phba->slow_ring_trc) {
2949 lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT,
2950- "0409 Cannot create debugfs "
2951+ "0416 Cannot create debugfs "
2952 "slow_ring buffer\n");
2953 goto debug_failed;
2954 }
2955@@ -972,7 +1230,7 @@ lpfc_debugfs_initialize(struct lpfc_vpor
2956 debugfs_create_dir(name, phba->hba_debugfs_root);
2957 if (!vport->vport_debugfs_root) {
2958 lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT,
2959- "0409 Cant create debugfs");
2960+ "0417 Cant create debugfs");
2961 goto debug_failed;
2962 }
2963 atomic_inc(&phba->debugfs_vport_count);
2964@@ -1001,7 +1259,7 @@ lpfc_debugfs_initialize(struct lpfc_vpor
2965
2966 if (!vport->disc_trc) {
2967 lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT,
2968- "0409 Cannot create debugfs disc trace "
2969+ "0418 Cannot create debugfs disc trace "
2970 "buffer\n");
2971 goto debug_failed;
2972 }
2973@@ -1014,7 +1272,7 @@ lpfc_debugfs_initialize(struct lpfc_vpor
2974 vport, &lpfc_debugfs_op_disc_trc);
2975 if (!vport->debug_disc_trc) {
2976 lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT,
2977- "0409 Cannot create debugfs "
2978+ "0419 Cannot create debugfs "
2979 "discovery_trace\n");
2980 goto debug_failed;
2981 }
2982@@ -1033,7 +1291,17 @@ debug_failed:
2983 #endif
2984 }
2985
2986-
2987+/**
2988+ * lpfc_debugfs_terminate - Tear down debugfs infrastructure for this vport.
2989+ * @vport: The vport pointer to remove from debugfs.
2990+ *
2991+ * Description:
2992+ * When Debugfs is configured this routine removes debugfs file system elements
2993+ * that are specific to this vport. It also checks to see if there are any
2994+ * users left for the debugfs directories associated with the HBA and driver. If
2995+ * this is the last user of the HBA directory or driver directory then it will
2996+ * remove those from the debugfs infrastructure as well.
2997+ **/
2998 inline void
2999 lpfc_debugfs_terminate(struct lpfc_vport *vport)
3000 {
3001@@ -1096,5 +1364,3 @@ lpfc_debugfs_terminate(struct lpfc_vport
3002 #endif
3003 return;
3004 }
3005-
3006-
3007--- a/drivers/scsi/lpfc/lpfc_disc.h
3008+++ b/drivers/scsi/lpfc/lpfc_disc.h
3009@@ -37,6 +37,7 @@ enum lpfc_work_type {
3010 LPFC_EVT_KILL,
3011 LPFC_EVT_ELS_RETRY,
3012 LPFC_EVT_DEV_LOSS,
3013+ LPFC_EVT_FASTPATH_MGMT_EVT,
3014 };
3015
3016 /* structure used to queue event to the discovery tasklet */
3017@@ -47,6 +48,24 @@ struct lpfc_work_evt {
3018 enum lpfc_work_type evt;
3019 };
3020
3021+struct lpfc_scsi_check_condition_event;
3022+struct lpfc_scsi_varqueuedepth_event;
3023+struct lpfc_scsi_event_header;
3024+struct lpfc_fabric_event_header;
3025+struct lpfc_fcprdchkerr_event;
3026+
3027+/* structure used for sending events from fast path */
3028+struct lpfc_fast_path_event {
3029+ struct lpfc_work_evt work_evt;
3030+ struct lpfc_vport *vport;
3031+ union {
3032+ struct lpfc_scsi_check_condition_event check_cond_evt;
3033+ struct lpfc_scsi_varqueuedepth_event queue_depth_evt;
3034+ struct lpfc_scsi_event_header scsi_evt;
3035+ struct lpfc_fabric_event_header fabric_evt;
3036+ struct lpfc_fcprdchkerr_event read_check_error;
3037+ } un;
3038+};
3039
3040 struct lpfc_nodelist {
3041 struct list_head nlp_listp;
3042@@ -88,6 +107,10 @@ struct lpfc_nodelist {
3043 unsigned long last_ramp_up_time; /* jiffy of last ramp up */
3044 unsigned long last_q_full_time; /* jiffy of last queue full */
3045 struct kref kref;
3046+ atomic_t cmd_pending;
3047+ uint32_t cmd_qdepth;
3048+ unsigned long last_change_time;
3049+ struct lpfc_scsicmd_bkt *lat_data; /* Latency data */
3050 };
3051
3052 /* Defines for nlp_flag (uint32) */
3053--- a/drivers/scsi/lpfc/lpfc_els.c
3054+++ b/drivers/scsi/lpfc/lpfc_els.c
3055@@ -30,6 +30,7 @@
3056
3057 #include "lpfc_hw.h"
3058 #include "lpfc_sli.h"
3059+#include "lpfc_nl.h"
3060 #include "lpfc_disc.h"
3061 #include "lpfc_scsi.h"
3062 #include "lpfc.h"
3063@@ -53,6 +54,28 @@ static void lpfc_register_new_vport(stru
3064
3065 static int lpfc_max_els_tries = 3;
3066
3067+/**
3068+ * lpfc_els_chk_latt: Check host link attention event for a vport.
3069+ * @vport: pointer to a host virtual N_Port data structure.
3070+ *
3071+ * This routine checks whether there is an outstanding host link
3072+ * attention event during the discovery process with the @vport. It is done
3073+ * by reading the HBA's Host Attention (HA) register. If there is any host
3074+ * link attention events during this @vport's discovery process, the @vport
3075+ * shall be marked as FC_ABORT_DISCOVERY, a host link attention clear shall
3076+ * be issued if the link state is not already in host link cleared state,
3077+ * and a return code shall indicate whether the host link attention event
3078+ * had happened.
3079+ *
3080+ * Note that, if either the host link is in state LPFC_LINK_DOWN or @vport
3081+ * state in LPFC_VPORT_READY, the request for checking host link attention
3082+ * event will be ignored and a return code shall indicate no host link
3083+ * attention event had happened.
3084+ *
3085+ * Return codes
3086+ * 0 - no host link attention event happened
3087+ * 1 - host link attention event happened
3088+ **/
3089 int
3090 lpfc_els_chk_latt(struct lpfc_vport *vport)
3091 {
3092@@ -92,6 +115,34 @@ lpfc_els_chk_latt(struct lpfc_vport *vpo
3093 return 1;
3094 }
3095
3096+/**
3097+ * lpfc_prep_els_iocb: Allocate and prepare a lpfc iocb data structure.
3098+ * @vport: pointer to a host virtual N_Port data structure.
3099+ * @expectRsp: flag indicating whether response is expected.
3100+ * @cmdSize: size of the ELS command.
3101+ * @retry: number of retries to the command IOCB when it fails.
3102+ * @ndlp: pointer to a node-list data structure.
3103+ * @did: destination identifier.
3104+ * @elscmd: the ELS command code.
3105+ *
3106+ * This routine is used for allocating a lpfc-IOCB data structure from
3107+ * the driver lpfc-IOCB free-list and prepare the IOCB with the parameters
3108+ * passed into the routine for discovery state machine to issue an Extended
3109+ * Link Service (ELS) commands. It is a generic lpfc-IOCB allocation
3110+ * and preparation routine that is used by all the discovery state machine
3111+ * routines and the ELS command-specific fields will be later set up by
3112+ * the individual discovery machine routines after calling this routine
3113+ * allocating and preparing a generic IOCB data structure. It fills in the
3114+ * Buffer Descriptor Entries (BDEs), allocates buffers for both command
3115+ * payload and response payload (if expected). The reference count on the
3116+ * ndlp is incremented by 1 and the reference to the ndlp is put into
3117+ * context1 of the IOCB data structure for this IOCB to hold the ndlp
3118+ * reference for the command's callback function to access later.
3119+ *
3120+ * Return code
3121+ * Pointer to the newly allocated/prepared els iocb data structure
3122+ * NULL - when els iocb data structure allocation/preparation failed
3123+ **/
3124 static struct lpfc_iocbq *
3125 lpfc_prep_els_iocb(struct lpfc_vport *vport, uint8_t expectRsp,
3126 uint16_t cmdSize, uint8_t retry,
3127@@ -150,7 +201,7 @@ lpfc_prep_els_iocb(struct lpfc_vport *vp
3128
3129 icmd->un.elsreq64.bdl.addrHigh = putPaddrHigh(pbuflist->phys);
3130 icmd->un.elsreq64.bdl.addrLow = putPaddrLow(pbuflist->phys);
3131- icmd->un.elsreq64.bdl.bdeFlags = BUFF_TYPE_BDL;
3132+ icmd->un.elsreq64.bdl.bdeFlags = BUFF_TYPE_BLP_64;
3133 icmd->un.elsreq64.remoteID = did; /* DID */
3134 if (expectRsp) {
3135 icmd->un.elsreq64.bdl.bdeSize = (2 * sizeof(struct ulp_bde64));
3136@@ -185,7 +236,7 @@ lpfc_prep_els_iocb(struct lpfc_vport *vp
3137 bpl->addrLow = le32_to_cpu(putPaddrLow(prsp->phys));
3138 bpl->addrHigh = le32_to_cpu(putPaddrHigh(prsp->phys));
3139 bpl->tus.f.bdeSize = FCELSSIZE;
3140- bpl->tus.f.bdeFlags = BUFF_USE_RCV;
3141+ bpl->tus.f.bdeFlags = BUFF_TYPE_BDE_64;
3142 bpl->tus.w = le32_to_cpu(bpl->tus.w);
3143 }
3144
3145@@ -233,6 +284,22 @@ els_iocb_free_pcmb_exit:
3146 return NULL;
3147 }
3148
3149+/**
3150+ * lpfc_issue_fabric_reglogin: Issue fabric registration login for a vport.
3151+ * @vport: pointer to a host virtual N_Port data structure.
3152+ *
3153+ * This routine issues a fabric registration login for a @vport. An
3154+ * active ndlp node with Fabric_DID must already exist for this @vport.
3155+ * The routine invokes two mailbox commands to carry out fabric registration
3156+ * login through the HBA firmware: the first mailbox command requests the
3157+ * HBA to perform link configuration for the @vport; and the second mailbox
3158+ * command requests the HBA to perform the actual fabric registration login
3159+ * with the @vport.
3160+ *
3161+ * Return code
3162+ * 0 - successfully issued fabric registration login for @vport
3163+ * -ENXIO -- failed to issue fabric registration login for @vport
3164+ **/
3165 static int
3166 lpfc_issue_fabric_reglogin(struct lpfc_vport *vport)
3167 {
3168@@ -313,6 +380,26 @@ fail:
3169 return -ENXIO;
3170 }
3171
3172+/**
3173+ * lpfc_cmpl_els_flogi_fabric: Completion function for flogi to a fabric port.
3174+ * @vport: pointer to a host virtual N_Port data structure.
3175+ * @ndlp: pointer to a node-list data structure.
3176+ * @sp: pointer to service parameter data structure.
3177+ * @irsp: pointer to the IOCB within the lpfc response IOCB.
3178+ *
3179+ * This routine is invoked by the lpfc_cmpl_els_flogi() completion callback
3180+ * function to handle the completion of a Fabric Login (FLOGI) into a fabric
3181+ * port in a fabric topology. It properly sets up the parameters to the @ndlp
3182+ * from the IOCB response. It also check the newly assigned N_Port ID to the
3183+ * @vport against the previously assigned N_Port ID. If it is different from
3184+ * the previously assigned Destination ID (DID), the lpfc_unreg_rpi() routine
3185+ * is invoked on all the remaining nodes with the @vport to unregister the
3186+ * Remote Port Indicators (RPIs). Finally, the lpfc_issue_fabric_reglogin()
3187+ * is invoked to register login to the fabric.
3188+ *
3189+ * Return code
3190+ * 0 - Success (currently, always return 0)
3191+ **/
3192 static int
3193 lpfc_cmpl_els_flogi_fabric(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
3194 struct serv_parm *sp, IOCB_t *irsp)
3195@@ -387,7 +474,7 @@ lpfc_cmpl_els_flogi_fabric(struct lpfc_v
3196 */
3197 list_for_each_entry_safe(np, next_np,
3198 &vport->fc_nodes, nlp_listp) {
3199- if (!NLP_CHK_NODE_ACT(ndlp))
3200+ if (!NLP_CHK_NODE_ACT(np))
3201 continue;
3202 if ((np->nlp_state != NLP_STE_NPR_NODE) ||
3203 !(np->nlp_flag & NLP_NPR_ADISC))
3204@@ -416,9 +503,26 @@ lpfc_cmpl_els_flogi_fabric(struct lpfc_v
3205 return 0;
3206 }
3207
3208-/*
3209- * We FLOGIed into an NPort, initiate pt2pt protocol
3210- */
3211+/**
3212+ * lpfc_cmpl_els_flogi_nport: Completion function for flogi to an N_Port.
3213+ * @vport: pointer to a host virtual N_Port data structure.
3214+ * @ndlp: pointer to a node-list data structure.
3215+ * @sp: pointer to service parameter data structure.
3216+ *
3217+ * This routine is invoked by the lpfc_cmpl_els_flogi() completion callback
3218+ * function to handle the completion of a Fabric Login (FLOGI) into an N_Port
3219+ * in a point-to-point topology. First, the @vport's N_Port Name is compared
3220+ * with the received N_Port Name: if the @vport's N_Port Name is greater than
3221+ * the received N_Port Name lexicographically, this node shall assign local
3222+ * N_Port ID (PT2PT_LocalID: 1) and remote N_Port ID (PT2PT_RemoteID: 2) and
3223+ * will send out Port Login (PLOGI) with the N_Port IDs assigned. Otherwise,
3224+ * this node shall just wait for the remote node to issue PLOGI and assign
3225+ * N_Port IDs.
3226+ *
3227+ * Return code
3228+ * 0 - Success
3229+ * -ENXIO - Fail
3230+ **/
3231 static int
3232 lpfc_cmpl_els_flogi_nport(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
3233 struct serv_parm *sp)
3234@@ -516,6 +620,29 @@ fail:
3235 return -ENXIO;
3236 }
3237
3238+/**
3239+ * lpfc_cmpl_els_flogi: Completion callback function for flogi.
3240+ * @phba: pointer to lpfc hba data structure.
3241+ * @cmdiocb: pointer to lpfc command iocb data structure.
3242+ * @rspiocb: pointer to lpfc response iocb data structure.
3243+ *
3244+ * This routine is the top-level completion callback function for issuing
3245+ * a Fabric Login (FLOGI) command. If the response IOCB reported error,
3246+ * the lpfc_els_retry() routine shall be invoked to retry the FLOGI. If
3247+ * retry has been made (either immediately or delayed with lpfc_els_retry()
3248+ * returning 1), the command IOCB will be released and function returned.
3249+ * If the retry attempt has been given up (possibly reach the maximum
3250+ * number of retries), one additional decrement of ndlp reference shall be
3251+ * invoked before going out after releasing the command IOCB. This will
3252+ * actually release the remote node (Note, lpfc_els_free_iocb() will also
3253+ * invoke one decrement of ndlp reference count). If no error reported in
3254+ * the IOCB status, the command Port ID field is used to determine whether
3255+ * this is a point-to-point topology or a fabric topology: if the Port ID
3256+ * field is assigned, it is a fabric topology; otherwise, it is a
3257+ * point-to-point topology. The routine lpfc_cmpl_els_flogi_fabric() or
3258+ * lpfc_cmpl_els_flogi_nport() shall be invoked accordingly to handle the
3259+ * specific topology completion conditions.
3260+ **/
3261 static void
3262 lpfc_cmpl_els_flogi(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
3263 struct lpfc_iocbq *rspiocb)
3264@@ -618,6 +745,28 @@ out:
3265 lpfc_els_free_iocb(phba, cmdiocb);
3266 }
3267
3268+/**
3269+ * lpfc_issue_els_flogi: Issue an flogi iocb command for a vport.
3270+ * @vport: pointer to a host virtual N_Port data structure.
3271+ * @ndlp: pointer to a node-list data structure.
3272+ * @retry: number of retries to the command IOCB.
3273+ *
3274+ * This routine issues a Fabric Login (FLOGI) Request ELS command
3275+ * for a @vport. The initiator service parameters are put into the payload
3276+ * of the FLOGI Request IOCB and the top-level callback function pointer
3277+ * to lpfc_cmpl_els_flogi() routine is put to the IOCB completion callback
3278+ * function field. The lpfc_issue_fabric_iocb routine is invoked to send
3279+ * out FLOGI ELS command with one outstanding fabric IOCB at a time.
3280+ *
3281+ * Note that, in lpfc_prep_els_iocb() routine, the reference count of ndlp
3282+ * will be incremented by 1 for holding the ndlp and the reference to ndlp
3283+ * will be stored into the context1 field of the IOCB for the completion
3284+ * callback function to the FLOGI ELS command.
3285+ *
3286+ * Return code
3287+ * 0 - successfully issued flogi iocb for @vport
3288+ * 1 - failed to issue flogi iocb for @vport
3289+ **/
3290 static int
3291 lpfc_issue_els_flogi(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
3292 uint8_t retry)
3293@@ -694,6 +843,20 @@ lpfc_issue_els_flogi(struct lpfc_vport *
3294 return 0;
3295 }
3296
3297+/**
3298+ * lpfc_els_abort_flogi: Abort all outstanding flogi iocbs.
3299+ * @phba: pointer to lpfc hba data structure.
3300+ *
3301+ * This routine aborts all the outstanding Fabric Login (FLOGI) IOCBs
3302+ * with a @phba. This routine walks all the outstanding IOCBs on the txcmplq
3303+ * list and issues an abort IOCB commond on each outstanding IOCB that
3304+ * contains a active Fabric_DID ndlp. Note that this function is to issue
3305+ * the abort IOCB command on all the outstanding IOCBs, thus when this
3306+ * function returns, it does not guarantee all the IOCBs are actually aborted.
3307+ *
3308+ * Return code
3309+ * 0 - Sucessfully issued abort iocb on all outstanding flogis (Always 0)
3310+ **/
3311 int
3312 lpfc_els_abort_flogi(struct lpfc_hba *phba)
3313 {
3314@@ -729,6 +892,22 @@ lpfc_els_abort_flogi(struct lpfc_hba *ph
3315 return 0;
3316 }
3317
3318+/**
3319+ * lpfc_initial_flogi: Issue an initial fabric login for a vport.
3320+ * @vport: pointer to a host virtual N_Port data structure.
3321+ *
3322+ * This routine issues an initial Fabric Login (FLOGI) for the @vport
3323+ * specified. It first searches the ndlp with the Fabric_DID (0xfffffe) from
3324+ * the @vport's ndlp list. If no such ndlp found, it will create an ndlp and
3325+ * put it into the @vport's ndlp list. If an inactive ndlp found on the list,
3326+ * it will just be enabled and made active. The lpfc_issue_els_flogi() routine
3327+ * is then invoked with the @vport and the ndlp to perform the FLOGI for the
3328+ * @vport.
3329+ *
3330+ * Return code
3331+ * 0 - failed to issue initial flogi for @vport
3332+ * 1 - successfully issued initial flogi for @vport
3333+ **/
3334 int
3335 lpfc_initial_flogi(struct lpfc_vport *vport)
3336 {
3337@@ -764,6 +943,22 @@ lpfc_initial_flogi(struct lpfc_vport *vp
3338 return 1;
3339 }
3340
3341+/**
3342+ * lpfc_initial_fdisc: Issue an initial fabric discovery for a vport.
3343+ * @vport: pointer to a host virtual N_Port data structure.
3344+ *
3345+ * This routine issues an initial Fabric Discover (FDISC) for the @vport
3346+ * specified. It first searches the ndlp with the Fabric_DID (0xfffffe) from
3347+ * the @vport's ndlp list. If no such ndlp found, it will create an ndlp and
3348+ * put it into the @vport's ndlp list. If an inactive ndlp found on the list,
3349+ * it will just be enabled and made active. The lpfc_issue_els_fdisc() routine
3350+ * is then invoked with the @vport and the ndlp to perform the FDISC for the
3351+ * @vport.
3352+ *
3353+ * Return code
3354+ * 0 - failed to issue initial fdisc for @vport
3355+ * 1 - successfully issued initial fdisc for @vport
3356+ **/
3357 int
3358 lpfc_initial_fdisc(struct lpfc_vport *vport)
3359 {
3360@@ -797,6 +992,17 @@ lpfc_initial_fdisc(struct lpfc_vport *vp
3361 return 1;
3362 }
3363
3364+/**
3365+ * lpfc_more_plogi: Check and issue remaining plogis for a vport.
3366+ * @vport: pointer to a host virtual N_Port data structure.
3367+ *
3368+ * This routine checks whether there are more remaining Port Logins
3369+ * (PLOGI) to be issued for the @vport. If so, it will invoke the routine
3370+ * lpfc_els_disc_plogi() to go through the Node Port Recovery (NPR) nodes
3371+ * to issue ELS PLOGIs up to the configured discover threads with the
3372+ * @vport (@vport->cfg_discovery_threads). The function also decrement
3373+ * the @vport's num_disc_node by 1 if it is not already 0.
3374+ **/
3375 void
3376 lpfc_more_plogi(struct lpfc_vport *vport)
3377 {
3378@@ -819,6 +1025,37 @@ lpfc_more_plogi(struct lpfc_vport *vport
3379 return;
3380 }
3381
3382+/**
3383+ * lpfc_plogi_confirm_nport: Confirm pologi wwpn matches stored ndlp.
3384+ * @phba: pointer to lpfc hba data structure.
3385+ * @prsp: pointer to response IOCB payload.
3386+ * @ndlp: pointer to a node-list data structure.
3387+ *
3388+ * This routine checks and indicates whether the WWPN of an N_Port, retrieved
3389+ * from a PLOGI, matches the WWPN that is stored in the @ndlp for that N_POrt.
3390+ * The following cases are considered N_Port confirmed:
3391+ * 1) The N_Port is a Fabric ndlp; 2) The @ndlp is on vport list and matches
3392+ * the WWPN of the N_Port logged into; 3) The @ndlp is not on vport list but
3393+ * it does not have WWPN assigned either. If the WWPN is confirmed, the
3394+ * pointer to the @ndlp will be returned. If the WWPN is not confirmed:
3395+ * 1) if there is a node on vport list other than the @ndlp with the same
3396+ * WWPN of the N_Port PLOGI logged into, the lpfc_unreg_rpi() will be invoked
3397+ * on that node to release the RPI associated with the node; 2) if there is
3398+ * no node found on vport list with the same WWPN of the N_Port PLOGI logged
3399+ * into, a new node shall be allocated (or activated). In either case, the
3400+ * parameters of the @ndlp shall be copied to the new_ndlp, the @ndlp shall
3401+ * be released and the new_ndlp shall be put on to the vport node list and
3402+ * its pointer returned as the confirmed node.
3403+ *
3404+ * Note that before the @ndlp got "released", the keepDID from not-matching
3405+ * or inactive "new_ndlp" on the vport node list is assigned to the nlp_DID
3406+ * of the @ndlp. This is because the release of @ndlp is actually to put it
3407+ * into an inactive state on the vport node list and the vport node list
3408+ * management algorithm does not allow two node with a same DID.
3409+ *
3410+ * Return code
3411+ * pointer to the PLOGI N_Port @ndlp
3412+ **/
3413 static struct lpfc_nodelist *
3414 lpfc_plogi_confirm_nport(struct lpfc_hba *phba, uint32_t *prsp,
3415 struct lpfc_nodelist *ndlp)
3416@@ -922,6 +1159,17 @@ lpfc_plogi_confirm_nport(struct lpfc_hba
3417 return new_ndlp;
3418 }
3419
3420+/**
3421+ * lpfc_end_rscn: Check and handle more rscn for a vport.
3422+ * @vport: pointer to a host virtual N_Port data structure.
3423+ *
3424+ * This routine checks whether more Registration State Change
3425+ * Notifications (RSCNs) came in while the discovery state machine was in
3426+ * the FC_RSCN_MODE. If so, the lpfc_els_handle_rscn() routine will be
3427+ * invoked to handle the additional RSCNs for the @vport. Otherwise, the
3428+ * FC_RSCN_MODE bit will be cleared with the @vport to mark as the end of
3429+ * handling the RSCNs.
3430+ **/
3431 void
3432 lpfc_end_rscn(struct lpfc_vport *vport)
3433 {
3434@@ -943,6 +1191,26 @@ lpfc_end_rscn(struct lpfc_vport *vport)
3435 }
3436 }
3437
3438+/**
3439+ * lpfc_cmpl_els_plogi: Completion callback function for plogi.
3440+ * @phba: pointer to lpfc hba data structure.
3441+ * @cmdiocb: pointer to lpfc command iocb data structure.
3442+ * @rspiocb: pointer to lpfc response iocb data structure.
3443+ *
3444+ * This routine is the completion callback function for issuing the Port
3445+ * Login (PLOGI) command. For PLOGI completion, there must be an active
3446+ * ndlp on the vport node list that matches the remote node ID from the
3447+ * PLOGI reponse IOCB. If such ndlp does not exist, the PLOGI is simply
3448+ * ignored and command IOCB released. The PLOGI response IOCB status is
3449+ * checked for error conditons. If there is error status reported, PLOGI
3450+ * retry shall be attempted by invoking the lpfc_els_retry() routine.
3451+ * Otherwise, the lpfc_plogi_confirm_nport() routine shall be invoked on
3452+ * the ndlp and the NLP_EVT_CMPL_PLOGI state to the Discover State Machine
3453+ * (DSM) is set for this PLOGI completion. Finally, it checks whether
3454+ * there are additional N_Port nodes with the vport that need to perform
3455+ * PLOGI. If so, the lpfc_more_plogi() routine is invoked to issue addition
3456+ * PLOGIs.
3457+ **/
3458 static void
3459 lpfc_cmpl_els_plogi(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
3460 struct lpfc_iocbq *rspiocb)
3461@@ -1048,6 +1316,27 @@ out:
3462 return;
3463 }
3464
3465+/**
3466+ * lpfc_issue_els_plogi: Issue an plogi iocb command for a vport.
3467+ * @vport: pointer to a host virtual N_Port data structure.
3468+ * @did: destination port identifier.
3469+ * @retry: number of retries to the command IOCB.
3470+ *
3471+ * This routine issues a Port Login (PLOGI) command to a remote N_Port
3472+ * (with the @did) for a @vport. Before issuing a PLOGI to a remote N_Port,
3473+ * the ndlp with the remote N_Port DID must exist on the @vport's ndlp list.
3474+ * This routine constructs the proper feilds of the PLOGI IOCB and invokes
3475+ * the lpfc_sli_issue_iocb() routine to send out PLOGI ELS command.
3476+ *
3477+ * Note that, in lpfc_prep_els_iocb() routine, the reference count of ndlp
3478+ * will be incremented by 1 for holding the ndlp and the reference to ndlp
3479+ * will be stored into the context1 field of the IOCB for the completion
3480+ * callback function to the PLOGI ELS command.
3481+ *
3482+ * Return code
3483+ * 0 - Successfully issued a plogi for @vport
3484+ * 1 - failed to issue a plogi for @vport
3485+ **/
3486 int
3487 lpfc_issue_els_plogi(struct lpfc_vport *vport, uint32_t did, uint8_t retry)
3488 {
3489@@ -1106,6 +1395,19 @@ lpfc_issue_els_plogi(struct lpfc_vport *
3490 return 0;
3491 }
3492
3493+/**
3494+ * lpfc_cmpl_els_prli: Completion callback function for prli.
3495+ * @phba: pointer to lpfc hba data structure.
3496+ * @cmdiocb: pointer to lpfc command iocb data structure.
3497+ * @rspiocb: pointer to lpfc response iocb data structure.
3498+ *
3499+ * This routine is the completion callback function for a Process Login
3500+ * (PRLI) ELS command. The PRLI response IOCB status is checked for error
3501+ * status. If there is error status reported, PRLI retry shall be attempted
3502+ * by invoking the lpfc_els_retry() routine. Otherwise, the state
3503+ * NLP_EVT_CMPL_PRLI is sent to the Discover State Machine (DSM) for this
3504+ * ndlp to mark the PRLI completion.
3505+ **/
3506 static void
3507 lpfc_cmpl_els_prli(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
3508 struct lpfc_iocbq *rspiocb)
3509@@ -1164,6 +1466,27 @@ out:
3510 return;
3511 }
3512
3513+/**
3514+ * lpfc_issue_els_prli: Issue a prli iocb command for a vport.
3515+ * @vport: pointer to a host virtual N_Port data structure.
3516+ * @ndlp: pointer to a node-list data structure.
3517+ * @retry: number of retries to the command IOCB.
3518+ *
3519+ * This routine issues a Process Login (PRLI) ELS command for the
3520+ * @vport. The PRLI service parameters are set up in the payload of the
3521+ * PRLI Request command and the pointer to lpfc_cmpl_els_prli() routine
3522+ * is put to the IOCB completion callback func field before invoking the
3523+ * routine lpfc_sli_issue_iocb() to send out PRLI command.
3524+ *
3525+ * Note that, in lpfc_prep_els_iocb() routine, the reference count of ndlp
3526+ * will be incremented by 1 for holding the ndlp and the reference to ndlp
3527+ * will be stored into the context1 field of the IOCB for the completion
3528+ * callback function to the PRLI ELS command.
3529+ *
3530+ * Return code
3531+ * 0 - successfully issued prli iocb command for @vport
3532+ * 1 - failed to issue prli iocb command for @vport
3533+ **/
3534 int
3535 lpfc_issue_els_prli(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
3536 uint8_t retry)
3537@@ -1233,6 +1556,92 @@ lpfc_issue_els_prli(struct lpfc_vport *v
3538 return 0;
3539 }
3540
3541+/**
3542+ * lpfc_rscn_disc: Perform rscn discovery for a vport.
3543+ * @vport: pointer to a host virtual N_Port data structure.
3544+ *
3545+ * This routine performs Registration State Change Notification (RSCN)
3546+ * discovery for a @vport. If the @vport's node port recovery count is not
3547+ * zero, it will invoke the lpfc_els_disc_plogi() to perform PLOGI for all
3548+ * the nodes that need recovery. If none of the PLOGI were needed through
3549+ * the lpfc_els_disc_plogi() routine, the lpfc_end_rscn() routine shall be
3550+ * invoked to check and handle possible more RSCN came in during the period
3551+ * of processing the current ones.
3552+ **/
3553+static void
3554+lpfc_rscn_disc(struct lpfc_vport *vport)
3555+{
3556+ lpfc_can_disctmo(vport);
3557+
3558+ /* RSCN discovery */
3559+ /* go thru NPR nodes and issue ELS PLOGIs */
3560+ if (vport->fc_npr_cnt)
3561+ if (lpfc_els_disc_plogi(vport))
3562+ return;
3563+
3564+ lpfc_end_rscn(vport);
3565+}
3566+
3567+/**
3568+ * lpfc_adisc_done: Complete the adisc phase of discovery.
3569+ * @vport: pointer to lpfc_vport hba data structure that finished all ADISCs.
3570+ *
3571+ * This function is called when the final ADISC is completed during discovery.
3572+ * This function handles clearing link attention or issuing reg_vpi depending
3573+ * on whether npiv is enabled. This function also kicks off the PLOGI phase of
3574+ * discovery.
3575+ * This function is called with no locks held.
3576+ **/
3577+static void
3578+lpfc_adisc_done(struct lpfc_vport *vport)
3579+{
3580+ struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
3581+ struct lpfc_hba *phba = vport->phba;
3582+
3583+ /*
3584+ * For NPIV, cmpl_reg_vpi will set port_state to READY,
3585+ * and continue discovery.
3586+ */
3587+ if ((phba->sli3_options & LPFC_SLI3_NPIV_ENABLED) &&
3588+ !(vport->fc_flag & FC_RSCN_MODE)) {
3589+ lpfc_issue_reg_vpi(phba, vport);
3590+ return;
3591+ }
3592+ /*
3593+ * For SLI2, we need to set port_state to READY
3594+ * and continue discovery.
3595+ */
3596+ if (vport->port_state < LPFC_VPORT_READY) {
3597+ /* If we get here, there is nothing to ADISC */
3598+ if (vport->port_type == LPFC_PHYSICAL_PORT)
3599+ lpfc_issue_clear_la(phba, vport);
3600+ if (!(vport->fc_flag & FC_ABORT_DISCOVERY)) {
3601+ vport->num_disc_nodes = 0;
3602+ /* go thru NPR list, issue ELS PLOGIs */
3603+ if (vport->fc_npr_cnt)
3604+ lpfc_els_disc_plogi(vport);
3605+ if (!vport->num_disc_nodes) {
3606+ spin_lock_irq(shost->host_lock);
3607+ vport->fc_flag &= ~FC_NDISC_ACTIVE;
3608+ spin_unlock_irq(shost->host_lock);
3609+ lpfc_can_disctmo(vport);
3610+ lpfc_end_rscn(vport);
3611+ }
3612+ }
3613+ vport->port_state = LPFC_VPORT_READY;
3614+ } else
3615+ lpfc_rscn_disc(vport);
3616+}
3617+
3618+/**
3619+ * lpfc_more_adisc: Issue more adisc as needed.
3620+ * @vport: pointer to a host virtual N_Port data structure.
3621+ *
3622+ * This routine determines whether there are more ndlps on a @vport
3623+ * node list need to have Address Discover (ADISC) issued. If so, it will
3624+ * invoke the lpfc_els_disc_adisc() routine to issue ADISC on the @vport's
3625+ * remaining nodes which need to have ADISC sent.
3626+ **/
3627 void
3628 lpfc_more_adisc(struct lpfc_vport *vport)
3629 {
3630@@ -1252,23 +1661,27 @@ lpfc_more_adisc(struct lpfc_vport *vport
3631 /* go thru NPR nodes and issue any remaining ELS ADISCs */
3632 sentadisc = lpfc_els_disc_adisc(vport);
3633 }
3634+ if (!vport->num_disc_nodes)
3635+ lpfc_adisc_done(vport);
3636 return;
3637 }
3638
3639-static void
3640-lpfc_rscn_disc(struct lpfc_vport *vport)
3641-{
3642- lpfc_can_disctmo(vport);
3643-
3644- /* RSCN discovery */
3645- /* go thru NPR nodes and issue ELS PLOGIs */
3646- if (vport->fc_npr_cnt)
3647- if (lpfc_els_disc_plogi(vport))
3648- return;
3649-
3650- lpfc_end_rscn(vport);
3651-}
3652-
3653+/**
3654+ * lpfc_cmpl_els_adisc: Completion callback function for adisc.
3655+ * @phba: pointer to lpfc hba data structure.
3656+ * @cmdiocb: pointer to lpfc command iocb data structure.
3657+ * @rspiocb: pointer to lpfc response iocb data structure.
3658+ *
3659+ * This routine is the completion function for issuing the Address Discover
3660+ * (ADISC) command. It first checks to see whether link went down during
3661+ * the discovery process. If so, the node will be marked as node port
3662+ * recovery for issuing discover IOCB by the link attention handler and
3663+ * exit. Otherwise, the response status is checked. If error was reported
3664+ * in the response status, the ADISC command shall be retried by invoking
3665+ * the lpfc_els_retry() routine. Otherwise, if no error was reported in
3666+ * the response status, the state machine is invoked to set transition
3667+ * with respect to NLP_EVT_CMPL_ADISC event.
3668+ **/
3669 static void
3670 lpfc_cmpl_els_adisc(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
3671 struct lpfc_iocbq *rspiocb)
3672@@ -1333,57 +1746,34 @@ lpfc_cmpl_els_adisc(struct lpfc_hba *phb
3673 lpfc_disc_state_machine(vport, ndlp, cmdiocb,
3674 NLP_EVT_CMPL_ADISC);
3675
3676- if (disc && vport->num_disc_nodes) {
3677- /* Check to see if there are more ADISCs to be sent */
3678+ /* Check to see if there are more ADISCs to be sent */
3679+ if (disc && vport->num_disc_nodes)
3680 lpfc_more_adisc(vport);
3681-
3682- /* Check to see if we are done with ADISC authentication */
3683- if (vport->num_disc_nodes == 0) {
3684- /* If we get here, there is nothing left to ADISC */
3685- /*
3686- * For NPIV, cmpl_reg_vpi will set port_state to READY,
3687- * and continue discovery.
3688- */
3689- if ((phba->sli3_options & LPFC_SLI3_NPIV_ENABLED) &&
3690- !(vport->fc_flag & FC_RSCN_MODE)) {
3691- lpfc_issue_reg_vpi(phba, vport);
3692- goto out;
3693- }
3694- /*
3695- * For SLI2, we need to set port_state to READY
3696- * and continue discovery.
3697- */
3698- if (vport->port_state < LPFC_VPORT_READY) {
3699- /* If we get here, there is nothing to ADISC */
3700- if (vport->port_type == LPFC_PHYSICAL_PORT)
3701- lpfc_issue_clear_la(phba, vport);
3702-
3703- if (!(vport->fc_flag & FC_ABORT_DISCOVERY)) {
3704- vport->num_disc_nodes = 0;
3705- /* go thru NPR list, issue ELS PLOGIs */
3706- if (vport->fc_npr_cnt)
3707- lpfc_els_disc_plogi(vport);
3708-
3709- if (!vport->num_disc_nodes) {
3710- spin_lock_irq(shost->host_lock);
3711- vport->fc_flag &=
3712- ~FC_NDISC_ACTIVE;
3713- spin_unlock_irq(
3714- shost->host_lock);
3715- lpfc_can_disctmo(vport);
3716- }
3717- }
3718- vport->port_state = LPFC_VPORT_READY;
3719- } else {
3720- lpfc_rscn_disc(vport);
3721- }
3722- }
3723- }
3724 out:
3725 lpfc_els_free_iocb(phba, cmdiocb);
3726 return;
3727 }
3728
3729+/**
3730+ * lpfc_issue_els_adisc: Issue an address discover iocb to an node on a vport.
3731+ * @vport: pointer to a virtual N_Port data structure.
3732+ * @ndlp: pointer to a node-list data structure.
3733+ * @retry: number of retries to the command IOCB.
3734+ *
3735+ * This routine issues an Address Discover (ADISC) for an @ndlp on a
3736+ * @vport. It prepares the payload of the ADISC ELS command, updates the
3737+ * and states of the ndlp, and invokes the lpfc_sli_issue_iocb() routine
3738+ * to issue the ADISC ELS command.
3739+ *
3740+ * Note that, in lpfc_prep_els_iocb() routine, the reference count of ndlp
3741+ * will be incremented by 1 for holding the ndlp and the reference to ndlp
3742+ * will be stored into the context1 field of the IOCB for the completion
3743+ * callback function to the ADISC ELS command.
3744+ *
3745+ * Return code
3746+ * 0 - successfully issued adisc
3747+ * 1 - failed to issue adisc
3748+ **/
3749 int
3750 lpfc_issue_els_adisc(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
3751 uint8_t retry)
3752@@ -1437,6 +1827,18 @@ lpfc_issue_els_adisc(struct lpfc_vport *
3753 return 0;
3754 }
3755
3756+/**
3757+ * lpfc_cmpl_els_logo: Completion callback function for logo.
3758+ * @phba: pointer to lpfc hba data structure.
3759+ * @cmdiocb: pointer to lpfc command iocb data structure.
3760+ * @rspiocb: pointer to lpfc response iocb data structure.
3761+ *
3762+ * This routine is the completion function for issuing the ELS Logout (LOGO)
3763+ * command. If no error status was reported from the LOGO response, the
3764+ * state machine of the associated ndlp shall be invoked for transition with
3765+ * respect to NLP_EVT_CMPL_LOGO event. Otherwise, if error status was reported,
3766+ * the lpfc_els_retry() routine will be invoked to retry the LOGO command.
3767+ **/
3768 static void
3769 lpfc_cmpl_els_logo(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
3770 struct lpfc_iocbq *rspiocb)
3771@@ -1502,6 +1904,26 @@ out:
3772 return;
3773 }
3774
3775+/**
3776+ * lpfc_issue_els_logo: Issue a logo to an node on a vport.
3777+ * @vport: pointer to a virtual N_Port data structure.
3778+ * @ndlp: pointer to a node-list data structure.
3779+ * @retry: number of retries to the command IOCB.
3780+ *
3781+ * This routine constructs and issues an ELS Logout (LOGO) iocb command
3782+ * to a remote node, referred by an @ndlp on a @vport. It constructs the
3783+ * payload of the IOCB, properly sets up the @ndlp state, and invokes the
3784+ * lpfc_sli_issue_iocb() routine to send out the LOGO ELS command.
3785+ *
3786+ * Note that, in lpfc_prep_els_iocb() routine, the reference count of ndlp
3787+ * will be incremented by 1 for holding the ndlp and the reference to ndlp
3788+ * will be stored into the context1 field of the IOCB for the completion
3789+ * callback function to the LOGO ELS command.
3790+ *
3791+ * Return code
3792+ * 0 - successfully issued logo
3793+ * 1 - failed to issue logo
3794+ **/
3795 int
3796 lpfc_issue_els_logo(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
3797 uint8_t retry)
3798@@ -1563,6 +1985,22 @@ lpfc_issue_els_logo(struct lpfc_vport *v
3799 return 0;
3800 }
3801
3802+/**
3803+ * lpfc_cmpl_els_cmd: Completion callback function for generic els command.
3804+ * @phba: pointer to lpfc hba data structure.
3805+ * @cmdiocb: pointer to lpfc command iocb data structure.
3806+ * @rspiocb: pointer to lpfc response iocb data structure.
3807+ *
3808+ * This routine is a generic completion callback function for ELS commands.
3809+ * Specifically, it is the callback function which does not need to perform
3810+ * any command specific operations. It is currently used by the ELS command
3811+ * issuing routines for the ELS State Change Request (SCR),
3812+ * lpfc_issue_els_scr(), and the ELS Fibre Channel Address Resolution
3813+ * Protocol Response (FARPR) routine, lpfc_issue_els_farpr(). Other than
3814+ * certain debug loggings, this callback function simply invokes the
3815+ * lpfc_els_chk_latt() routine to check whether link went down during the
3816+ * discovery process.
3817+ **/
3818 static void
3819 lpfc_cmpl_els_cmd(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
3820 struct lpfc_iocbq *rspiocb)
3821@@ -1587,6 +2025,28 @@ lpfc_cmpl_els_cmd(struct lpfc_hba *phba,
3822 return;
3823 }
3824
3825+/**
3826+ * lpfc_issue_els_scr: Issue a scr to an node on a vport.
3827+ * @vport: pointer to a host virtual N_Port data structure.
3828+ * @nportid: N_Port identifier to the remote node.
3829+ * @retry: number of retries to the command IOCB.
3830+ *
3831+ * This routine issues a State Change Request (SCR) to a fabric node
3832+ * on a @vport. The remote node @nportid is passed into the function. It
3833+ * first search the @vport node list to find the matching ndlp. If no such
3834+ * ndlp is found, a new ndlp shall be created for this (SCR) purpose. An
3835+ * IOCB is allocated, payload prepared, and the lpfc_sli_issue_iocb()
3836+ * routine is invoked to send the SCR IOCB.
3837+ *
3838+ * Note that, in lpfc_prep_els_iocb() routine, the reference count of ndlp
3839+ * will be incremented by 1 for holding the ndlp and the reference to ndlp
3840+ * will be stored into the context1 field of the IOCB for the completion
3841+ * callback function to the SCR ELS command.
3842+ *
3843+ * Return code
3844+ * 0 - Successfully issued scr command
3845+ * 1 - Failed to issue scr command
3846+ **/
3847 int
3848 lpfc_issue_els_scr(struct lpfc_vport *vport, uint32_t nportid, uint8_t retry)
3849 {
3850@@ -1659,6 +2119,28 @@ lpfc_issue_els_scr(struct lpfc_vport *vp
3851 return 0;
3852 }
3853
3854+/**
3855+ * lpfc_issue_els_farpr: Issue a farp to an node on a vport.
3856+ * @vport: pointer to a host virtual N_Port data structure.
3857+ * @nportid: N_Port identifier to the remote node.
3858+ * @retry: number of retries to the command IOCB.
3859+ *
3860+ * This routine issues a Fibre Channel Address Resolution Response
3861+ * (FARPR) to a node on a vport. The remote node N_Port identifier (@nportid)
3862+ * is passed into the function. It first search the @vport node list to find
3863+ * the matching ndlp. If no such ndlp is found, a new ndlp shall be created
3864+ * for this (FARPR) purpose. An IOCB is allocated, payload prepared, and the
3865+ * lpfc_sli_issue_iocb() routine is invoked to send the FARPR ELS command.
3866+ *
3867+ * Note that, in lpfc_prep_els_iocb() routine, the reference count of ndlp
3868+ * will be incremented by 1 for holding the ndlp and the reference to ndlp
3869+ * will be stored into the context1 field of the IOCB for the completion
3870+ * callback function to the PARPR ELS command.
3871+ *
3872+ * Return code
3873+ * 0 - Successfully issued farpr command
3874+ * 1 - Failed to issue farpr command
3875+ **/
3876 static int
3877 lpfc_issue_els_farpr(struct lpfc_vport *vport, uint32_t nportid, uint8_t retry)
3878 {
3879@@ -1748,6 +2230,18 @@ lpfc_issue_els_farpr(struct lpfc_vport *
3880 return 0;
3881 }
3882
3883+/**
3884+ * lpfc_cancel_retry_delay_tmo: Cancel the timer with delayed iocb-cmd retry.
3885+ * @vport: pointer to a host virtual N_Port data structure.
3886+ * @nlp: pointer to a node-list data structure.
3887+ *
3888+ * This routine cancels the timer with a delayed IOCB-command retry for
3889+ * a @vport's @ndlp. It stops the timer for the delayed function retrial and
3890+ * removes the ELS retry event if it presents. In addition, if the
3891+ * NLP_NPR_2B_DISC bit is set in the @nlp's nlp_flag bitmap, ADISC IOCB
3892+ * commands are sent for the @vport's nodes that require issuing discovery
3893+ * ADISC.
3894+ **/
3895 void
3896 lpfc_cancel_retry_delay_tmo(struct lpfc_vport *vport, struct lpfc_nodelist *nlp)
3897 {
3898@@ -1775,25 +2269,36 @@ lpfc_cancel_retry_delay_tmo(struct lpfc_
3899 if (vport->port_state < LPFC_VPORT_READY) {
3900 /* Check if there are more ADISCs to be sent */
3901 lpfc_more_adisc(vport);
3902- if ((vport->num_disc_nodes == 0) &&
3903- (vport->fc_npr_cnt))
3904- lpfc_els_disc_plogi(vport);
3905 } else {
3906 /* Check if there are more PLOGIs to be sent */
3907 lpfc_more_plogi(vport);
3908- }
3909- if (vport->num_disc_nodes == 0) {
3910- spin_lock_irq(shost->host_lock);
3911- vport->fc_flag &= ~FC_NDISC_ACTIVE;
3912- spin_unlock_irq(shost->host_lock);
3913- lpfc_can_disctmo(vport);
3914- lpfc_end_rscn(vport);
3915+ if (vport->num_disc_nodes == 0) {
3916+ spin_lock_irq(shost->host_lock);
3917+ vport->fc_flag &= ~FC_NDISC_ACTIVE;
3918+ spin_unlock_irq(shost->host_lock);
3919+ lpfc_can_disctmo(vport);
3920+ lpfc_end_rscn(vport);
3921+ }
3922 }
3923 }
3924 }
3925 return;
3926 }
3927
3928+/**
3929+ * lpfc_els_retry_delay: Timer function with a ndlp delayed function timer.
3930+ * @ptr: holder for the pointer to the timer function associated data (ndlp).
3931+ *
3932+ * This routine is invoked by the ndlp delayed-function timer to check
3933+ * whether there is any pending ELS retry event(s) with the node. If not, it
3934+ * simply returns. Otherwise, if there is at least one ELS delayed event, it
3935+ * adds the delayed events to the HBA work list and invokes the
3936+ * lpfc_worker_wake_up() routine to wake up worker thread to process the
3937+ * event. Note that lpfc_nlp_get() is called before posting the event to
3938+ * the work list to hold reference count of ndlp so that it guarantees the
3939+ * reference to ndlp will still be available when the worker thread gets
3940+ * to the event associated with the ndlp.
3941+ **/
3942 void
3943 lpfc_els_retry_delay(unsigned long ptr)
3944 {
3945@@ -1822,6 +2327,15 @@ lpfc_els_retry_delay(unsigned long ptr)
3946 return;
3947 }
3948
3949+/**
3950+ * lpfc_els_retry_delay_handler: Work thread handler for ndlp delayed function.
3951+ * @ndlp: pointer to a node-list data structure.
3952+ *
3953+ * This routine is the worker-thread handler for processing the @ndlp delayed
3954+ * event(s), posted by the lpfc_els_retry_delay() routine. It simply retrieves
3955+ * the last ELS command from the associated ndlp and invokes the proper ELS
3956+ * function according to the delayed ELS command to retry the command.
3957+ **/
3958 void
3959 lpfc_els_retry_delay_handler(struct lpfc_nodelist *ndlp)
3960 {
3961@@ -1884,6 +2398,27 @@ lpfc_els_retry_delay_handler(struct lpfc
3962 return;
3963 }
3964
3965+/**
3966+ * lpfc_els_retry: Make retry decision on an els command iocb.
3967+ * @phba: pointer to lpfc hba data structure.
3968+ * @cmdiocb: pointer to lpfc command iocb data structure.
3969+ * @rspiocb: pointer to lpfc response iocb data structure.
3970+ *
3971+ * This routine makes a retry decision on an ELS command IOCB, which has
3972+ * failed. The following ELS IOCBs use this function for retrying the command
3973+ * when previously issued command responsed with error status: FLOGI, PLOGI,
3974+ * PRLI, ADISC, LOGO, and FDISC. Based on the ELS command type and the
3975+ * returned error status, it makes the decision whether a retry shall be
3976+ * issued for the command, and whether a retry shall be made immediately or
3977+ * delayed. In the former case, the corresponding ELS command issuing-function
3978+ * is called to retry the command. In the later case, the ELS command shall
3979+ * be posted to the ndlp delayed event and delayed function timer set to the
3980+ * ndlp for the delayed command issusing.
3981+ *
3982+ * Return code
3983+ * 0 - No retry of els command is made
3984+ * 1 - Immediate or delayed retry of els command is made
3985+ **/
3986 static int
3987 lpfc_els_retry(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
3988 struct lpfc_iocbq *rspiocb)
3989@@ -2051,7 +2586,7 @@ lpfc_els_retry(struct lpfc_hba *phba, st
3990 (stat.un.b.lsRjtRsnCodeExp == LSEXP_INVALID_NPORT_ID))
3991 ) {
3992 lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS,
3993- "0123 FDISC Failed (x%x). "
3994+ "0122 FDISC Failed (x%x). "
3995 "Fabric Detected Bad WWN\n",
3996 stat.un.lsRjtError);
3997 lpfc_vport_set_state(vport,
3998@@ -2182,12 +2717,26 @@ lpfc_els_retry(struct lpfc_hba *phba, st
3999 return 0;
4000 }
4001
4002+/**
4003+ * lpfc_els_free_data: Free lpfc dma buffer and data structure with an iocb.
4004+ * @phba: pointer to lpfc hba data structure.
4005+ * @buf_ptr1: pointer to the lpfc DMA buffer data structure.
4006+ *
4007+ * This routine releases the lpfc DMA (Direct Memory Access) buffer(s)
4008+ * associated with a command IOCB back to the lpfc DMA buffer pool. It first
4009+ * checks to see whether there is a lpfc DMA buffer associated with the
4010+ * response of the command IOCB. If so, it will be released before releasing
4011+ * the lpfc DMA buffer associated with the IOCB itself.
4012+ *
4013+ * Return code
4014+ * 0 - Successfully released lpfc DMA buffer (currently, always return 0)
4015+ **/
4016 static int
4017 lpfc_els_free_data(struct lpfc_hba *phba, struct lpfc_dmabuf *buf_ptr1)
4018 {
4019 struct lpfc_dmabuf *buf_ptr;
4020
4021- /* Free the response before processing the command. */
4022+ /* Free the response before processing the command. */
4023 if (!list_empty(&buf_ptr1->list)) {
4024 list_remove_head(&buf_ptr1->list, buf_ptr,
4025 struct lpfc_dmabuf,
4026@@ -2200,6 +2749,18 @@ lpfc_els_free_data(struct lpfc_hba *phba
4027 return 0;
4028 }
4029
4030+/**
4031+ * lpfc_els_free_bpl: Free lpfc dma buffer and data structure with bpl.
4032+ * @phba: pointer to lpfc hba data structure.
4033+ * @buf_ptr: pointer to the lpfc dma buffer data structure.
4034+ *
4035+ * This routine releases the lpfc Direct Memory Access (DMA) buffer
4036+ * associated with a Buffer Pointer List (BPL) back to the lpfc DMA buffer
4037+ * pool.
4038+ *
4039+ * Return code
4040+ * 0 - Successfully released lpfc DMA buffer (currently, always return 0)
4041+ **/
4042 static int
4043 lpfc_els_free_bpl(struct lpfc_hba *phba, struct lpfc_dmabuf *buf_ptr)
4044 {
4045@@ -2208,6 +2769,33 @@ lpfc_els_free_bpl(struct lpfc_hba *phba,
4046 return 0;
4047 }
4048
4049+/**
4050+ * lpfc_els_free_iocb: Free a command iocb and its associated resources.
4051+ * @phba: pointer to lpfc hba data structure.
4052+ * @elsiocb: pointer to lpfc els command iocb data structure.
4053+ *
4054+ * This routine frees a command IOCB and its associated resources. The
4055+ * command IOCB data structure contains the reference to various associated
4056+ * resources, these fields must be set to NULL if the associated reference
4057+ * not present:
4058+ * context1 - reference to ndlp
4059+ * context2 - reference to cmd
4060+ * context2->next - reference to rsp
4061+ * context3 - reference to bpl
4062+ *
4063+ * It first properly decrements the reference count held on ndlp for the
4064+ * IOCB completion callback function. If LPFC_DELAY_MEM_FREE flag is not
4065+ * set, it invokes the lpfc_els_free_data() routine to release the Direct
4066+ * Memory Access (DMA) buffers associated with the IOCB. Otherwise, it
4067+ * adds the DMA buffer the @phba data structure for the delayed release.
4068+ * If reference to the Buffer Pointer List (BPL) is present, the
4069+ * lpfc_els_free_bpl() routine is invoked to release the DMA memory
4070+ * associated with BPL. Finally, the lpfc_sli_release_iocbq() routine is
4071+ * invoked to release the IOCB data structure back to @phba IOCBQ list.
4072+ *
4073+ * Return code
4074+ * 0 - Success (currently, always return 0)
4075+ **/
4076 int
4077 lpfc_els_free_iocb(struct lpfc_hba *phba, struct lpfc_iocbq *elsiocb)
4078 {
4079@@ -2274,6 +2862,23 @@ lpfc_els_free_iocb(struct lpfc_hba *phba
4080 return 0;
4081 }
4082
4083+/**
4084+ * lpfc_cmpl_els_logo_acc: Completion callback function to logo acc response.
4085+ * @phba: pointer to lpfc hba data structure.
4086+ * @cmdiocb: pointer to lpfc command iocb data structure.
4087+ * @rspiocb: pointer to lpfc response iocb data structure.
4088+ *
4089+ * This routine is the completion callback function to the Logout (LOGO)
4090+ * Accept (ACC) Response ELS command. This routine is invoked to indicate
4091+ * the completion of the LOGO process. It invokes the lpfc_nlp_not_used() to
4092+ * release the ndlp if it has the last reference remaining (reference count
4093+ * is 1). If succeeded (meaning ndlp released), it sets the IOCB context1
4094+ * field to NULL to inform the following lpfc_els_free_iocb() routine no
4095+ * ndlp reference count needs to be decremented. Otherwise, the ndlp
4096+ * reference use-count shall be decremented by the lpfc_els_free_iocb()
4097+ * routine. Finally, the lpfc_els_free_iocb() is invoked to release the
4098+ * IOCB data structure.
4099+ **/
4100 static void
4101 lpfc_cmpl_els_logo_acc(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
4102 struct lpfc_iocbq *rspiocb)
4103@@ -2311,6 +2916,19 @@ lpfc_cmpl_els_logo_acc(struct lpfc_hba *
4104 return;
4105 }
4106
4107+/**
4108+ * lpfc_mbx_cmpl_dflt_rpi: Completion callbk func for unreg dflt rpi mbox cmd.
4109+ * @phba: pointer to lpfc hba data structure.
4110+ * @pmb: pointer to the driver internal queue element for mailbox command.
4111+ *
4112+ * This routine is the completion callback function for unregister default
4113+ * RPI (Remote Port Index) mailbox command to the @phba. It simply releases
4114+ * the associated lpfc Direct Memory Access (DMA) buffer back to the pool and
4115+ * decrements the ndlp reference count held for this completion callback
4116+ * function. After that, it invokes the lpfc_nlp_not_used() to check
4117+ * whether there is only one reference left on the ndlp. If so, it will
4118+ * perform one more decrement and trigger the release of the ndlp.
4119+ **/
4120 void
4121 lpfc_mbx_cmpl_dflt_rpi(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)
4122 {
4123@@ -2332,6 +2950,22 @@ lpfc_mbx_cmpl_dflt_rpi(struct lpfc_hba *
4124 return;
4125 }
4126
4127+/**
4128+ * lpfc_cmpl_els_rsp: Completion callback function for els response iocb cmd.
4129+ * @phba: pointer to lpfc hba data structure.
4130+ * @cmdiocb: pointer to lpfc command iocb data structure.
4131+ * @rspiocb: pointer to lpfc response iocb data structure.
4132+ *
4133+ * This routine is the completion callback function for ELS Response IOCB
4134+ * command. In normal case, this callback function just properly sets the
4135+ * nlp_flag bitmap in the ndlp data structure, if the mbox command reference
4136+ * field in the command IOCB is not NULL, the referred mailbox command will
4137+ * be send out, and then invokes the lpfc_els_free_iocb() routine to release
4138+ * the IOCB. Under error conditions, such as when a LS_RJT is returned or a
4139+ * link down event occurred during the discovery, the lpfc_nlp_not_used()
4140+ * routine shall be invoked trying to release the ndlp if no other threads
4141+ * are currently referring it.
4142+ **/
4143 static void
4144 lpfc_cmpl_els_rsp(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
4145 struct lpfc_iocbq *rspiocb)
4146@@ -2487,6 +3121,31 @@ out:
4147 return;
4148 }
4149
4150+/**
4151+ * lpfc_els_rsp_acc: Prepare and issue an acc response iocb command.
4152+ * @vport: pointer to a host virtual N_Port data structure.
4153+ * @flag: the els command code to be accepted.
4154+ * @oldiocb: pointer to the original lpfc command iocb data structure.
4155+ * @ndlp: pointer to a node-list data structure.
4156+ * @mbox: pointer to the driver internal queue element for mailbox command.
4157+ *
4158+ * This routine prepares and issues an Accept (ACC) response IOCB
4159+ * command. It uses the @flag to properly set up the IOCB field for the
4160+ * specific ACC response command to be issued and invokes the
4161+ * lpfc_sli_issue_iocb() routine to send out ACC response IOCB. If a
4162+ * @mbox pointer is passed in, it will be put into the context_un.mbox
4163+ * field of the IOCB for the completion callback function to issue the
4164+ * mailbox command to the HBA later when callback is invoked.
4165+ *
4166+ * Note that, in lpfc_prep_els_iocb() routine, the reference count of ndlp
4167+ * will be incremented by 1 for holding the ndlp and the reference to ndlp
4168+ * will be stored into the context1 field of the IOCB for the completion
4169+ * callback function to the corresponding response ELS IOCB command.
4170+ *
4171+ * Return code
4172+ * 0 - Successfully issued acc response
4173+ * 1 - Failed to issue acc response
4174+ **/
4175 int
4176 lpfc_els_rsp_acc(struct lpfc_vport *vport, uint32_t flag,
4177 struct lpfc_iocbq *oldiocb, struct lpfc_nodelist *ndlp,
4178@@ -2601,6 +3260,28 @@ lpfc_els_rsp_acc(struct lpfc_vport *vpor
4179 return 0;
4180 }
4181
4182+/**
4183+ * lpfc_els_rsp_reject: Propare and issue a rjt response iocb command.
4184+ * @vport: pointer to a virtual N_Port data structure.
4185+ * @rejectError:
4186+ * @oldiocb: pointer to the original lpfc command iocb data structure.
4187+ * @ndlp: pointer to a node-list data structure.
4188+ * @mbox: pointer to the driver internal queue element for mailbox command.
4189+ *
4190+ * This routine prepares and issue an Reject (RJT) response IOCB
4191+ * command. If a @mbox pointer is passed in, it will be put into the
4192+ * context_un.mbox field of the IOCB for the completion callback function
4193+ * to issue to the HBA later.
4194+ *
4195+ * Note that, in lpfc_prep_els_iocb() routine, the reference count of ndlp
4196+ * will be incremented by 1 for holding the ndlp and the reference to ndlp
4197+ * will be stored into the context1 field of the IOCB for the completion
4198+ * callback function to the reject response ELS IOCB command.
4199+ *
4200+ * Return code
4201+ * 0 - Successfully issued reject response
4202+ * 1 - Failed to issue reject response
4203+ **/
4204 int
4205 lpfc_els_rsp_reject(struct lpfc_vport *vport, uint32_t rejectError,
4206 struct lpfc_iocbq *oldiocb, struct lpfc_nodelist *ndlp,
4207@@ -2660,6 +3341,25 @@ lpfc_els_rsp_reject(struct lpfc_vport *v
4208 return 0;
4209 }
4210
4211+/**
4212+ * lpfc_els_rsp_adisc_acc: Prepare and issue acc response to adisc iocb cmd.
4213+ * @vport: pointer to a virtual N_Port data structure.
4214+ * @oldiocb: pointer to the original lpfc command iocb data structure.
4215+ * @ndlp: pointer to a node-list data structure.
4216+ *
4217+ * This routine prepares and issues an Accept (ACC) response to Address
4218+ * Discover (ADISC) ELS command. It simply prepares the payload of the IOCB
4219+ * and invokes the lpfc_sli_issue_iocb() routine to send out the command.
4220+ *
4221+ * Note that, in lpfc_prep_els_iocb() routine, the reference count of ndlp
4222+ * will be incremented by 1 for holding the ndlp and the reference to ndlp
4223+ * will be stored into the context1 field of the IOCB for the completion
4224+ * callback function to the ADISC Accept response ELS IOCB command.
4225+ *
4226+ * Return code
4227+ * 0 - Successfully issued acc adisc response
4228+ * 1 - Failed to issue adisc acc response
4229+ **/
4230 int
4231 lpfc_els_rsp_adisc_acc(struct lpfc_vport *vport, struct lpfc_iocbq *oldiocb,
4232 struct lpfc_nodelist *ndlp)
4233@@ -2716,6 +3416,25 @@ lpfc_els_rsp_adisc_acc(struct lpfc_vport
4234 return 0;
4235 }
4236
4237+/**
4238+ * lpfc_els_rsp_prli_acc: Prepare and issue acc response to prli iocb cmd.
4239+ * @vport: pointer to a virtual N_Port data structure.
4240+ * @oldiocb: pointer to the original lpfc command iocb data structure.
4241+ * @ndlp: pointer to a node-list data structure.
4242+ *
4243+ * This routine prepares and issues an Accept (ACC) response to Process
4244+ * Login (PRLI) ELS command. It simply prepares the payload of the IOCB
4245+ * and invokes the lpfc_sli_issue_iocb() routine to send out the command.
4246+ *
4247+ * Note that, in lpfc_prep_els_iocb() routine, the reference count of ndlp
4248+ * will be incremented by 1 for holding the ndlp and the reference to ndlp
4249+ * will be stored into the context1 field of the IOCB for the completion
4250+ * callback function to the PRLI Accept response ELS IOCB command.
4251+ *
4252+ * Return code
4253+ * 0 - Successfully issued acc prli response
4254+ * 1 - Failed to issue acc prli response
4255+ **/
4256 int
4257 lpfc_els_rsp_prli_acc(struct lpfc_vport *vport, struct lpfc_iocbq *oldiocb,
4258 struct lpfc_nodelist *ndlp)
4259@@ -2795,6 +3514,32 @@ lpfc_els_rsp_prli_acc(struct lpfc_vport
4260 return 0;
4261 }
4262
4263+/**
4264+ * lpfc_els_rsp_rnid_acc: Issue rnid acc response iocb command.
4265+ * @vport: pointer to a virtual N_Port data structure.
4266+ * @format: rnid command format.
4267+ * @oldiocb: pointer to the original lpfc command iocb data structure.
4268+ * @ndlp: pointer to a node-list data structure.
4269+ *
4270+ * This routine issues a Request Node Identification Data (RNID) Accept
4271+ * (ACC) response. It constructs the RNID ACC response command according to
4272+ * the proper @format and then calls the lpfc_sli_issue_iocb() routine to
4273+ * issue the response. Note that this command does not need to hold the ndlp
4274+ * reference count for the callback. So, the ndlp reference count taken by
4275+ * the lpfc_prep_els_iocb() routine is put back and the context1 field of
4276+ * IOCB is set to NULL to indicate to the lpfc_els_free_iocb() routine that
4277+ * there is no ndlp reference available.
4278+ *
4279+ * Note that, in lpfc_prep_els_iocb() routine, the reference count of ndlp
4280+ * will be incremented by 1 for holding the ndlp and the reference to ndlp
4281+ * will be stored into the context1 field of the IOCB for the completion
4282+ * callback function. However, for the RNID Accept Response ELS command,
4283+ * this is undone later by this routine after the IOCB is allocated.
4284+ *
4285+ * Return code
4286+ * 0 - Successfully issued acc rnid response
4287+ * 1 - Failed to issue acc rnid response
4288+ **/
4289 static int
4290 lpfc_els_rsp_rnid_acc(struct lpfc_vport *vport, uint8_t format,
4291 struct lpfc_iocbq *oldiocb, struct lpfc_nodelist *ndlp)
4292@@ -2875,6 +3620,25 @@ lpfc_els_rsp_rnid_acc(struct lpfc_vport
4293 return 0;
4294 }
4295
4296+/**
4297+ * lpfc_els_disc_adisc: Issue remaining adisc iocbs to npr nodes of a vport.
4298+ * @vport: pointer to a host virtual N_Port data structure.
4299+ *
4300+ * This routine issues Address Discover (ADISC) ELS commands to those
4301+ * N_Ports which are in node port recovery state and ADISC has not been issued
4302+ * for the @vport. Each time an ELS ADISC IOCB is issued by invoking the
4303+ * lpfc_issue_els_adisc() routine, the per @vport number of discover count
4304+ * (num_disc_nodes) shall be incremented. If the num_disc_nodes reaches a
4305+ * pre-configured threshold (cfg_discovery_threads), the @vport fc_flag will
4306+ * be marked with FC_NLP_MORE bit and the process of issuing remaining ADISC
4307+ * IOCBs quit for later pick up. On the other hand, after walking through
4308+ * all the ndlps with the @vport and there is none ADISC IOCB issued, the
4309+ * @vport fc_flag shall be cleared with FC_NLP_MORE bit indicating there is
4310+ * no more ADISC need to be sent.
4311+ *
4312+ * Return code
4313+ * The number of N_Ports with adisc issued.
4314+ **/
4315 int
4316 lpfc_els_disc_adisc(struct lpfc_vport *vport)
4317 {
4318@@ -2914,6 +3678,25 @@ lpfc_els_disc_adisc(struct lpfc_vport *v
4319 return sentadisc;
4320 }
4321
4322+/**
4323+ * lpfc_els_disc_plogi: Issue plogi for all npr nodes of a vport before adisc.
4324+ * @vport: pointer to a host virtual N_Port data structure.
4325+ *
4326+ * This routine issues Port Login (PLOGI) ELS commands to all the N_Ports
4327+ * which are in node port recovery state, with a @vport. Each time an ELS
4328+ * ADISC PLOGI IOCB is issued by invoking the lpfc_issue_els_plogi() routine,
4329+ * the per @vport number of discover count (num_disc_nodes) shall be
4330+ * incremented. If the num_disc_nodes reaches a pre-configured threshold
4331+ * (cfg_discovery_threads), the @vport fc_flag will be marked with FC_NLP_MORE
4332+ * bit set and quit the process of issuing remaining ADISC PLOGIN IOCBs for
4333+ * later pick up. On the other hand, after walking through all the ndlps with
4334+ * the @vport and there is none ADISC PLOGI IOCB issued, the @vport fc_flag
4335+ * shall be cleared with the FC_NLP_MORE bit indicating there is no more ADISC
4336+ * PLOGI need to be sent.
4337+ *
4338+ * Return code
4339+ * The number of N_Ports with plogi issued.
4340+ **/
4341 int
4342 lpfc_els_disc_plogi(struct lpfc_vport *vport)
4343 {
4344@@ -2954,6 +3737,15 @@ lpfc_els_disc_plogi(struct lpfc_vport *v
4345 return sentplogi;
4346 }
4347
4348+/**
4349+ * lpfc_els_flush_rscn: Clean up any rscn activities with a vport.
4350+ * @vport: pointer to a host virtual N_Port data structure.
4351+ *
4352+ * This routine cleans up any Registration State Change Notification
4353+ * (RSCN) activity with a @vport. Note that the fc_rscn_flush flag of the
4354+ * @vport together with the host_lock is used to prevent multiple thread
4355+ * trying to access the RSCN array on a same @vport at the same time.
4356+ **/
4357 void
4358 lpfc_els_flush_rscn(struct lpfc_vport *vport)
4359 {
4360@@ -2984,6 +3776,18 @@ lpfc_els_flush_rscn(struct lpfc_vport *v
4361 vport->fc_rscn_flush = 0;
4362 }
4363
4364+/**
4365+ * lpfc_rscn_payload_check: Check whether there is a pending rscn to a did.
4366+ * @vport: pointer to a host virtual N_Port data structure.
4367+ * @did: remote destination port identifier.
4368+ *
4369+ * This routine checks whether there is any pending Registration State
4370+ * Configuration Notification (RSCN) to a @did on @vport.
4371+ *
4372+ * Return code
4373+ * None zero - The @did matched with a pending rscn
4374+ * 0 - not able to match @did with a pending rscn
4375+ **/
4376 int
4377 lpfc_rscn_payload_check(struct lpfc_vport *vport, uint32_t did)
4378 {
4379@@ -3053,6 +3857,17 @@ return_did_out:
4380 return did;
4381 }
4382
4383+/**
4384+ * lpfc_rscn_recovery_check: Send recovery event to vport nodes matching rscn
4385+ * @vport: pointer to a host virtual N_Port data structure.
4386+ *
4387+ * This routine sends recovery (NLP_EVT_DEVICE_RECOVERY) event to the
4388+ * state machine for a @vport's nodes that are with pending RSCN (Registration
4389+ * State Change Notification).
4390+ *
4391+ * Return code
4392+ * 0 - Successful (currently alway return 0)
4393+ **/
4394 static int
4395 lpfc_rscn_recovery_check(struct lpfc_vport *vport)
4396 {
4397@@ -3071,6 +3886,28 @@ lpfc_rscn_recovery_check(struct lpfc_vpo
4398 return 0;
4399 }
4400
4401+/**
4402+ * lpfc_els_rcv_rscn: Process an unsolicited rscn iocb.
4403+ * @vport: pointer to a host virtual N_Port data structure.
4404+ * @cmdiocb: pointer to lpfc command iocb data structure.
4405+ * @ndlp: pointer to a node-list data structure.
4406+ *
4407+ * This routine processes an unsolicited RSCN (Registration State Change
4408+ * Notification) IOCB. First, the payload of the unsolicited RSCN is walked
4409+ * to invoke fc_host_post_event() routine to the FC transport layer. If the
4410+ * discover state machine is about to begin discovery, it just accepts the
4411+ * RSCN and the discovery process will satisfy the RSCN. If this RSCN only
4412+ * contains N_Port IDs for other vports on this HBA, it just accepts the
4413+ * RSCN and ignore processing it. If the state machine is in the recovery
4414+ * state, the fc_rscn_id_list of this @vport is walked and the
4415+ * lpfc_rscn_recovery_check() routine is invoked to send recovery event for
4416+ * all nodes that match RSCN payload. Otherwise, the lpfc_els_handle_rscn()
4417+ * routine is invoked to handle the RSCN event.
4418+ *
4419+ * Return code
4420+ * 0 - Just sent the acc response
4421+ * 1 - Sent the acc response and waited for name server completion
4422+ **/
4423 static int
4424 lpfc_els_rcv_rscn(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb,
4425 struct lpfc_nodelist *ndlp)
4426@@ -3130,7 +3967,7 @@ lpfc_els_rcv_rscn(struct lpfc_vport *vpo
4427 if (rscn_id == hba_id) {
4428 /* ALL NPortIDs in RSCN are on HBA */
4429 lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
4430- "0214 Ignore RSCN "
4431+ "0219 Ignore RSCN "
4432 "Data: x%x x%x x%x x%x\n",
4433 vport->fc_flag, payload_len,
4434 *lp, vport->fc_rscn_id_cnt);
4435@@ -3241,6 +4078,22 @@ lpfc_els_rcv_rscn(struct lpfc_vport *vpo
4436 return lpfc_els_handle_rscn(vport);
4437 }
4438
4439+/**
4440+ * lpfc_els_handle_rscn: Handle rscn for a vport.
4441+ * @vport: pointer to a host virtual N_Port data structure.
4442+ *
4443+ * This routine handles the Registration State Configuration Notification
4444+ * (RSCN) for a @vport. If login to NameServer does not exist, a new ndlp shall
4445+ * be created and a Port Login (PLOGI) to the NameServer is issued. Otherwise,
4446+ * if the ndlp to NameServer exists, a Common Transport (CT) command to the
4447+ * NameServer shall be issued. If CT command to the NameServer fails to be
4448+ * issued, the lpfc_els_flush_rscn() routine shall be invoked to clean up any
4449+ * RSCN activities with the @vport.
4450+ *
4451+ * Return code
4452+ * 0 - Cleaned up rscn on the @vport
4453+ * 1 - Wait for plogi to name server before proceed
4454+ **/
4455 int
4456 lpfc_els_handle_rscn(struct lpfc_vport *vport)
4457 {
4458@@ -3313,6 +4166,31 @@ lpfc_els_handle_rscn(struct lpfc_vport *
4459 return 0;
4460 }
4461
4462+/**
4463+ * lpfc_els_rcv_flogi: Process an unsolicited flogi iocb.
4464+ * @vport: pointer to a host virtual N_Port data structure.
4465+ * @cmdiocb: pointer to lpfc command iocb data structure.
4466+ * @ndlp: pointer to a node-list data structure.
4467+ *
4468+ * This routine processes Fabric Login (FLOGI) IOCB received as an ELS
4469+ * unsolicited event. An unsolicited FLOGI can be received in a point-to-
4470+ * point topology. As an unsolicited FLOGI should not be received in a loop
4471+ * mode, any unsolicited FLOGI received in loop mode shall be ignored. The
4472+ * lpfc_check_sparm() routine is invoked to check the parameters in the
4473+ * unsolicited FLOGI. If parameters validation failed, the routine
4474+ * lpfc_els_rsp_reject() shall be called with reject reason code set to
4475+ * LSEXP_SPARM_OPTIONS to reject the FLOGI. Otherwise, the Port WWN in the
4476+ * FLOGI shall be compared with the Port WWN of the @vport to determine who
4477+ * will initiate PLOGI. The higher lexicographical value party shall has
4478+ * higher priority (as the winning port) and will initiate PLOGI and
4479+ * communicate Port_IDs (Addresses) for both nodes in PLOGI. The result
4480+ * of this will be marked in the @vport fc_flag field with FC_PT2PT_PLOGI
4481+ * and then the lpfc_els_rsp_acc() routine is invoked to accept the FLOGI.
4482+ *
4483+ * Return code
4484+ * 0 - Successfully processed the unsolicited flogi
4485+ * 1 - Failed to process the unsolicited flogi
4486+ **/
4487 static int
4488 lpfc_els_rcv_flogi(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb,
4489 struct lpfc_nodelist *ndlp)
4490@@ -3402,6 +4280,22 @@ lpfc_els_rcv_flogi(struct lpfc_vport *vp
4491 return 0;
4492 }
4493
4494+/**
4495+ * lpfc_els_rcv_rnid: Process an unsolicited rnid iocb.
4496+ * @vport: pointer to a host virtual N_Port data structure.
4497+ * @cmdiocb: pointer to lpfc command iocb data structure.
4498+ * @ndlp: pointer to a node-list data structure.
4499+ *
4500+ * This routine processes Request Node Identification Data (RNID) IOCB
4501+ * received as an ELS unsolicited event. Only when the RNID specified format
4502+ * 0x0 or 0xDF (Topology Discovery Specific Node Identification Data)
4503+ * present, this routine will invoke the lpfc_els_rsp_rnid_acc() routine to
4504+ * Accept (ACC) the RNID ELS command. All the other RNID formats are
4505+ * rejected by invoking the lpfc_els_rsp_reject() routine.
4506+ *
4507+ * Return code
4508+ * 0 - Successfully processed rnid iocb (currently always return 0)
4509+ **/
4510 static int
4511 lpfc_els_rcv_rnid(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb,
4512 struct lpfc_nodelist *ndlp)
4513@@ -3441,6 +4335,19 @@ lpfc_els_rcv_rnid(struct lpfc_vport *vpo
4514 return 0;
4515 }
4516
4517+/**
4518+ * lpfc_els_rcv_lirr: Process an unsolicited lirr iocb.
4519+ * @vport: pointer to a host virtual N_Port data structure.
4520+ * @cmdiocb: pointer to lpfc command iocb data structure.
4521+ * @ndlp: pointer to a node-list data structure.
4522+ *
4523+ * This routine processes a Link Incident Report Registration(LIRR) IOCB
4524+ * received as an ELS unsolicited event. Currently, this function just invokes
4525+ * the lpfc_els_rsp_reject() routine to reject the LIRR IOCB unconditionally.
4526+ *
4527+ * Return code
4528+ * 0 - Successfully processed lirr iocb (currently always return 0)
4529+ **/
4530 static int
4531 lpfc_els_rcv_lirr(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb,
4532 struct lpfc_nodelist *ndlp)
4533@@ -3456,6 +4363,25 @@ lpfc_els_rcv_lirr(struct lpfc_vport *vpo
4534 return 0;
4535 }
4536
4537+/**
4538+ * lpfc_els_rsp_rps_acc: Completion callbk func for MBX_READ_LNK_STAT mbox cmd.
4539+ * @phba: pointer to lpfc hba data structure.
4540+ * @pmb: pointer to the driver internal queue element for mailbox command.
4541+ *
4542+ * This routine is the completion callback function for the MBX_READ_LNK_STAT
4543+ * mailbox command. This callback function is to actually send the Accept
4544+ * (ACC) response to a Read Port Status (RPS) unsolicited IOCB event. It
4545+ * collects the link statistics from the completion of the MBX_READ_LNK_STAT
4546+ * mailbox command, constructs the RPS response with the link statistics
4547+ * collected, and then invokes the lpfc_sli_issue_iocb() routine to send ACC
4548+ * response to the RPS.
4549+ *
4550+ * Note that, in lpfc_prep_els_iocb() routine, the reference count of ndlp
4551+ * will be incremented by 1 for holding the ndlp and the reference to ndlp
4552+ * will be stored into the context1 field of the IOCB for the completion
4553+ * callback function to the RPS Accept Response ELS IOCB command.
4554+ *
4555+ **/
4556 static void
4557 lpfc_els_rsp_rps_acc(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)
4558 {
4559@@ -3531,6 +4457,24 @@ lpfc_els_rsp_rps_acc(struct lpfc_hba *ph
4560 return;
4561 }
4562
4563+/**
4564+ * lpfc_els_rcv_rps: Process an unsolicited rps iocb.
4565+ * @vport: pointer to a host virtual N_Port data structure.
4566+ * @cmdiocb: pointer to lpfc command iocb data structure.
4567+ * @ndlp: pointer to a node-list data structure.
4568+ *
4569+ * This routine processes Read Port Status (RPS) IOCB received as an
4570+ * ELS unsolicited event. It first checks the remote port state. If the
4571+ * remote port is not in NLP_STE_UNMAPPED_NODE state or NLP_STE_MAPPED_NODE
4572+ * state, it invokes the lpfc_els_rsp_reject() routine to send the reject
4573+ * response. Otherwise, it issue the MBX_READ_LNK_STAT mailbox command
4574+ * for reading the HBA link statistics. It is for the callback function,
4575+ * lpfc_els_rsp_rps_acc(), set to the MBX_READ_LNK_STAT mailbox command
4576+ * to actually sending out RPS Accept (ACC) response.
4577+ *
4578+ * Return codes
4579+ * 0 - Successfully processed rps iocb (currently always return 0)
4580+ **/
4581 static int
4582 lpfc_els_rcv_rps(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb,
4583 struct lpfc_nodelist *ndlp)
4584@@ -3544,14 +4488,9 @@ lpfc_els_rcv_rps(struct lpfc_vport *vpor
4585 struct ls_rjt stat;
4586
4587 if ((ndlp->nlp_state != NLP_STE_UNMAPPED_NODE) &&
4588- (ndlp->nlp_state != NLP_STE_MAPPED_NODE)) {
4589- stat.un.b.lsRjtRsvd0 = 0;
4590- stat.un.b.lsRjtRsnCode = LSRJT_UNABLE_TPC;
4591- stat.un.b.lsRjtRsnCodeExp = LSEXP_CANT_GIVE_DATA;
4592- stat.un.b.vendorUnique = 0;
4593- lpfc_els_rsp_reject(vport, stat.un.lsRjtError, cmdiocb, ndlp,
4594- NULL);
4595- }
4596+ (ndlp->nlp_state != NLP_STE_MAPPED_NODE))
4597+ /* reject the unsolicited RPS request and done with it */
4598+ goto reject_out;
4599
4600 pcmd = (struct lpfc_dmabuf *) cmdiocb->context2;
4601 lp = (uint32_t *) pcmd->virt;
4602@@ -3584,6 +4523,9 @@ lpfc_els_rcv_rps(struct lpfc_vport *vpor
4603 mempool_free(mbox, phba->mbox_mem_pool);
4604 }
4605 }
4606+
4607+reject_out:
4608+ /* issue rejection response */
4609 stat.un.b.lsRjtRsvd0 = 0;
4610 stat.un.b.lsRjtRsnCode = LSRJT_UNABLE_TPC;
4611 stat.un.b.lsRjtRsnCodeExp = LSEXP_CANT_GIVE_DATA;
4612@@ -3592,6 +4534,25 @@ lpfc_els_rcv_rps(struct lpfc_vport *vpor
4613 return 0;
4614 }
4615
4616+/**
4617+ * lpfc_els_rsp_rpl_acc: Issue an accept rpl els command.
4618+ * @vport: pointer to a host virtual N_Port data structure.
4619+ * @cmdsize: size of the ELS command.
4620+ * @oldiocb: pointer to the original lpfc command iocb data structure.
4621+ * @ndlp: pointer to a node-list data structure.
4622+ *
4623+ * This routine issuees an Accept (ACC) Read Port List (RPL) ELS command.
4624+ * It is to be called by the lpfc_els_rcv_rpl() routine to accept the RPL.
4625+ *
4626+ * Note that, in lpfc_prep_els_iocb() routine, the reference count of ndlp
4627+ * will be incremented by 1 for holding the ndlp and the reference to ndlp
4628+ * will be stored into the context1 field of the IOCB for the completion
4629+ * callback function to the RPL Accept Response ELS command.
4630+ *
4631+ * Return code
4632+ * 0 - Successfully issued ACC RPL ELS command
4633+ * 1 - Failed to issue ACC RPL ELS command
4634+ **/
4635 static int
4636 lpfc_els_rsp_rpl_acc(struct lpfc_vport *vport, uint16_t cmdsize,
4637 struct lpfc_iocbq *oldiocb, struct lpfc_nodelist *ndlp)
4638@@ -3645,6 +4606,22 @@ lpfc_els_rsp_rpl_acc(struct lpfc_vport *
4639 return 0;
4640 }
4641
4642+/**
4643+ * lpfc_els_rcv_rpl: Process an unsolicited rpl iocb.
4644+ * @vport: pointer to a host virtual N_Port data structure.
4645+ * @cmdiocb: pointer to lpfc command iocb data structure.
4646+ * @ndlp: pointer to a node-list data structure.
4647+ *
4648+ * This routine processes Read Port List (RPL) IOCB received as an ELS
4649+ * unsolicited event. It first checks the remote port state. If the remote
4650+ * port is not in NLP_STE_UNMAPPED_NODE and NLP_STE_MAPPED_NODE states, it
4651+ * invokes the lpfc_els_rsp_reject() routine to send reject response.
4652+ * Otherwise, this routine then invokes the lpfc_els_rsp_rpl_acc() routine
4653+ * to accept the RPL.
4654+ *
4655+ * Return code
4656+ * 0 - Successfully processed rpl iocb (currently always return 0)
4657+ **/
4658 static int
4659 lpfc_els_rcv_rpl(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb,
4660 struct lpfc_nodelist *ndlp)
4661@@ -3658,12 +4635,15 @@ lpfc_els_rcv_rpl(struct lpfc_vport *vpor
4662
4663 if ((ndlp->nlp_state != NLP_STE_UNMAPPED_NODE) &&
4664 (ndlp->nlp_state != NLP_STE_MAPPED_NODE)) {
4665+ /* issue rejection response */
4666 stat.un.b.lsRjtRsvd0 = 0;
4667 stat.un.b.lsRjtRsnCode = LSRJT_UNABLE_TPC;
4668 stat.un.b.lsRjtRsnCodeExp = LSEXP_CANT_GIVE_DATA;
4669 stat.un.b.vendorUnique = 0;
4670 lpfc_els_rsp_reject(vport, stat.un.lsRjtError, cmdiocb, ndlp,
4671 NULL);
4672+ /* rejected the unsolicited RPL request and done with it */
4673+ return 0;
4674 }
4675
4676 pcmd = (struct lpfc_dmabuf *) cmdiocb->context2;
4677@@ -3685,6 +4665,30 @@ lpfc_els_rcv_rpl(struct lpfc_vport *vpor
4678 return 0;
4679 }
4680
4681+/**
4682+ * lpfc_els_rcv_farp: Process an unsolicited farp request els command.
4683+ * @vport: pointer to a virtual N_Port data structure.
4684+ * @cmdiocb: pointer to lpfc command iocb data structure.
4685+ * @ndlp: pointer to a node-list data structure.
4686+ *
4687+ * This routine processes Fibre Channel Address Resolution Protocol
4688+ * (FARP) Request IOCB received as an ELS unsolicited event. Currently,
4689+ * the lpfc driver only supports matching on WWPN or WWNN for FARP. As such,
4690+ * FARP_MATCH_PORT flag and FARP_MATCH_NODE flag are checked against the
4691+ * Match Flag in the FARP request IOCB: if FARP_MATCH_PORT flag is set, the
4692+ * remote PortName is compared against the FC PortName stored in the @vport
4693+ * data structure; if FARP_MATCH_NODE flag is set, the remote NodeName is
4694+ * compared against the FC NodeName stored in the @vport data structure.
4695+ * If any of these matches and the FARP_REQUEST_FARPR flag is set in the
4696+ * FARP request IOCB Response Flag, the lpfc_issue_els_farpr() routine is
4697+ * invoked to send out FARP Response to the remote node. Before sending the
4698+ * FARP Response, however, the FARP_REQUEST_PLOGI flag is check in the FARP
4699+ * request IOCB Response Flag and, if it is set, the lpfc_issue_els_plogi()
4700+ * routine is invoked to log into the remote port first.
4701+ *
4702+ * Return code
4703+ * 0 - Either the FARP Match Mode not supported or successfully processed
4704+ **/
4705 static int
4706 lpfc_els_rcv_farp(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb,
4707 struct lpfc_nodelist *ndlp)
4708@@ -3744,6 +4748,20 @@ lpfc_els_rcv_farp(struct lpfc_vport *vpo
4709 return 0;
4710 }
4711
4712+/**
4713+ * lpfc_els_rcv_farpr: Process an unsolicited farp response iocb.
4714+ * @vport: pointer to a host virtual N_Port data structure.
4715+ * @cmdiocb: pointer to lpfc command iocb data structure.
4716+ * @ndlp: pointer to a node-list data structure.
4717+ *
4718+ * This routine processes Fibre Channel Address Resolution Protocol
4719+ * Response (FARPR) IOCB received as an ELS unsolicited event. It simply
4720+ * invokes the lpfc_els_rsp_acc() routine to the remote node to accept
4721+ * the FARP response request.
4722+ *
4723+ * Return code
4724+ * 0 - Successfully processed FARPR IOCB (currently always return 0)
4725+ **/
4726 static int
4727 lpfc_els_rcv_farpr(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb,
4728 struct lpfc_nodelist *ndlp)
4729@@ -3768,6 +4786,25 @@ lpfc_els_rcv_farpr(struct lpfc_vport *vp
4730 return 0;
4731 }
4732
4733+/**
4734+ * lpfc_els_rcv_fan: Process an unsolicited fan iocb command.
4735+ * @vport: pointer to a host virtual N_Port data structure.
4736+ * @cmdiocb: pointer to lpfc command iocb data structure.
4737+ * @fan_ndlp: pointer to a node-list data structure.
4738+ *
4739+ * This routine processes a Fabric Address Notification (FAN) IOCB
4740+ * command received as an ELS unsolicited event. The FAN ELS command will
4741+ * only be processed on a physical port (i.e., the @vport represents the
4742+ * physical port). The fabric NodeName and PortName from the FAN IOCB are
4743+ * compared against those in the phba data structure. If any of those is
4744+ * different, the lpfc_initial_flogi() routine is invoked to initialize
4745+ * Fabric Login (FLOGI) to the fabric to start the discover over. Otherwise,
4746+ * if both of those are identical, the lpfc_issue_fabric_reglogin() routine
4747+ * is invoked to register login to the fabric.
4748+ *
4749+ * Return code
4750+ * 0 - Successfully processed fan iocb (currently always return 0).
4751+ **/
4752 static int
4753 lpfc_els_rcv_fan(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb,
4754 struct lpfc_nodelist *fan_ndlp)
4755@@ -3797,6 +4834,16 @@ lpfc_els_rcv_fan(struct lpfc_vport *vpor
4756 return 0;
4757 }
4758
4759+/**
4760+ * lpfc_els_timeout: Handler funciton to the els timer.
4761+ * @ptr: holder for the timer function associated data.
4762+ *
4763+ * This routine is invoked by the ELS timer after timeout. It posts the ELS
4764+ * timer timeout event by setting the WORKER_ELS_TMO bit to the work port
4765+ * event bitmap and then invokes the lpfc_worker_wake_up() routine to wake
4766+ * up the worker thread. It is for the worker thread to invoke the routine
4767+ * lpfc_els_timeout_handler() to work on the posted event WORKER_ELS_TMO.
4768+ **/
4769 void
4770 lpfc_els_timeout(unsigned long ptr)
4771 {
4772@@ -3816,6 +4863,15 @@ lpfc_els_timeout(unsigned long ptr)
4773 return;
4774 }
4775
4776+/**
4777+ * lpfc_els_timeout_handler: Process an els timeout event.
4778+ * @vport: pointer to a virtual N_Port data structure.
4779+ *
4780+ * This routine is the actual handler function that processes an ELS timeout
4781+ * event. It walks the ELS ring to get and abort all the IOCBs (except the
4782+ * ABORT/CLOSE/FARP/FARPR/FDISC), which are associated with the @vport by
4783+ * invoking the lpfc_sli_issue_abort_iotag() routine.
4784+ **/
4785 void
4786 lpfc_els_timeout_handler(struct lpfc_vport *vport)
4787 {
4788@@ -3886,6 +4942,26 @@ lpfc_els_timeout_handler(struct lpfc_vpo
4789 mod_timer(&vport->els_tmofunc, jiffies + HZ * timeout);
4790 }
4791
4792+/**
4793+ * lpfc_els_flush_cmd: Clean up the outstanding els commands to a vport.
4794+ * @vport: pointer to a host virtual N_Port data structure.
4795+ *
4796+ * This routine is used to clean up all the outstanding ELS commands on a
4797+ * @vport. It first aborts the @vport by invoking lpfc_fabric_abort_vport()
4798+ * routine. After that, it walks the ELS transmit queue to remove all the
4799+ * IOCBs with the @vport other than the QUE_RING and ABORT/CLOSE IOCBs. For
4800+ * the IOCBs with a non-NULL completion callback function, the callback
4801+ * function will be invoked with the status set to IOSTAT_LOCAL_REJECT and
4802+ * un.ulpWord[4] set to IOERR_SLI_ABORTED. For IOCBs with a NULL completion
4803+ * callback function, the IOCB will simply be released. Finally, it walks
4804+ * the ELS transmit completion queue to issue an abort IOCB to any transmit
4805+ * completion queue IOCB that is associated with the @vport and is not
4806+ * an IOCB from libdfc (i.e., the management plane IOCBs that are not
4807+ * part of the discovery state machine) out to HBA by invoking the
4808+ * lpfc_sli_issue_abort_iotag() routine. Note that this function issues the
4809+ * abort IOCB to any transmit completion queueed IOCB, it does not guarantee
4810+ * the IOCBs are aborted when this function returns.
4811+ **/
4812 void
4813 lpfc_els_flush_cmd(struct lpfc_vport *vport)
4814 {
4815@@ -3948,6 +5024,23 @@ lpfc_els_flush_cmd(struct lpfc_vport *vp
4816 return;
4817 }
4818
4819+/**
4820+ * lpfc_els_flush_all_cmd: Clean up all the outstanding els commands to a HBA.
4821+ * @phba: pointer to lpfc hba data structure.
4822+ *
4823+ * This routine is used to clean up all the outstanding ELS commands on a
4824+ * @phba. It first aborts the @phba by invoking the lpfc_fabric_abort_hba()
4825+ * routine. After that, it walks the ELS transmit queue to remove all the
4826+ * IOCBs to the @phba other than the QUE_RING and ABORT/CLOSE IOCBs. For
4827+ * the IOCBs with the completion callback function associated, the callback
4828+ * function will be invoked with the status set to IOSTAT_LOCAL_REJECT and
4829+ * un.ulpWord[4] set to IOERR_SLI_ABORTED. For IOCBs without the completion
4830+ * callback function associated, the IOCB will simply be released. Finally,
4831+ * it walks the ELS transmit completion queue to issue an abort IOCB to any
4832+ * transmit completion queue IOCB that is not an IOCB from libdfc (i.e., the
4833+ * management plane IOCBs that are not part of the discovery state machine)
4834+ * out to HBA by invoking the lpfc_sli_issue_abort_iotag() routine.
4835+ **/
4836 void
4837 lpfc_els_flush_all_cmd(struct lpfc_hba *phba)
4838 {
4839@@ -3992,6 +5085,130 @@ lpfc_els_flush_all_cmd(struct lpfc_hba
4840 return;
4841 }
4842
4843+/**
4844+ * lpfc_send_els_failure_event: Posts an ELS command failure event.
4845+ * @phba: Pointer to hba context object.
4846+ * @cmdiocbp: Pointer to command iocb which reported error.
4847+ * @rspiocbp: Pointer to response iocb which reported error.
4848+ *
4849+ * This function sends an event when there is an ELS command
4850+ * failure.
4851+ **/
4852+void
4853+lpfc_send_els_failure_event(struct lpfc_hba *phba,
4854+ struct lpfc_iocbq *cmdiocbp,
4855+ struct lpfc_iocbq *rspiocbp)
4856+{
4857+ struct lpfc_vport *vport = cmdiocbp->vport;
4858+ struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
4859+ struct lpfc_lsrjt_event lsrjt_event;
4860+ struct lpfc_fabric_event_header fabric_event;
4861+ struct ls_rjt stat;
4862+ struct lpfc_nodelist *ndlp;
4863+ uint32_t *pcmd;
4864+
4865+ ndlp = cmdiocbp->context1;
4866+ if (!ndlp || !NLP_CHK_NODE_ACT(ndlp))
4867+ return;
4868+
4869+ if (rspiocbp->iocb.ulpStatus == IOSTAT_LS_RJT) {
4870+ lsrjt_event.header.event_type = FC_REG_ELS_EVENT;
4871+ lsrjt_event.header.subcategory = LPFC_EVENT_LSRJT_RCV;
4872+ memcpy(lsrjt_event.header.wwpn, &ndlp->nlp_portname,
4873+ sizeof(struct lpfc_name));
4874+ memcpy(lsrjt_event.header.wwnn, &ndlp->nlp_nodename,
4875+ sizeof(struct lpfc_name));
4876+ pcmd = (uint32_t *) (((struct lpfc_dmabuf *)
4877+ cmdiocbp->context2)->virt);
4878+ lsrjt_event.command = *pcmd;
4879+ stat.un.lsRjtError = be32_to_cpu(rspiocbp->iocb.un.ulpWord[4]);
4880+ lsrjt_event.reason_code = stat.un.b.lsRjtRsnCode;
4881+ lsrjt_event.explanation = stat.un.b.lsRjtRsnCodeExp;
4882+ fc_host_post_vendor_event(shost,
4883+ fc_get_event_number(),
4884+ sizeof(lsrjt_event),
4885+ (char *)&lsrjt_event,
4886+ SCSI_NL_VID_TYPE_PCI | PCI_VENDOR_ID_EMULEX);
4887+ return;
4888+ }
4889+ if ((rspiocbp->iocb.ulpStatus == IOSTAT_NPORT_BSY) ||
4890+ (rspiocbp->iocb.ulpStatus == IOSTAT_FABRIC_BSY)) {
4891+ fabric_event.event_type = FC_REG_FABRIC_EVENT;
4892+ if (rspiocbp->iocb.ulpStatus == IOSTAT_NPORT_BSY)
4893+ fabric_event.subcategory = LPFC_EVENT_PORT_BUSY;
4894+ else
4895+ fabric_event.subcategory = LPFC_EVENT_FABRIC_BUSY;
4896+ memcpy(fabric_event.wwpn, &ndlp->nlp_portname,
4897+ sizeof(struct lpfc_name));
4898+ memcpy(fabric_event.wwnn, &ndlp->nlp_nodename,
4899+ sizeof(struct lpfc_name));
4900+ fc_host_post_vendor_event(shost,
4901+ fc_get_event_number(),
4902+ sizeof(fabric_event),
4903+ (char *)&fabric_event,
4904+ SCSI_NL_VID_TYPE_PCI | PCI_VENDOR_ID_EMULEX);
4905+ return;
4906+ }
4907+
4908+}
4909+
4910+/**
4911+ * lpfc_send_els_event: Posts unsolicited els event.
4912+ * @vport: Pointer to vport object.
4913+ * @ndlp: Pointer FC node object.
4914+ * @cmd: ELS command code.
4915+ *
4916+ * This function posts an event when there is an incoming
4917+ * unsolicited ELS command.
4918+ **/
4919+static void
4920+lpfc_send_els_event(struct lpfc_vport *vport,
4921+ struct lpfc_nodelist *ndlp,
4922+ uint32_t cmd)
4923+{
4924+ struct lpfc_els_event_header els_data;
4925+ struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
4926+
4927+ els_data.event_type = FC_REG_ELS_EVENT;
4928+ switch (cmd) {
4929+ case ELS_CMD_PLOGI:
4930+ els_data.subcategory = LPFC_EVENT_PLOGI_RCV;
4931+ break;
4932+ case ELS_CMD_PRLO:
4933+ els_data.subcategory = LPFC_EVENT_PRLO_RCV;
4934+ break;
4935+ case ELS_CMD_ADISC:
4936+ els_data.subcategory = LPFC_EVENT_ADISC_RCV;
4937+ break;
4938+ default:
4939+ return;
4940+ }
4941+ memcpy(els_data.wwpn, &ndlp->nlp_portname, sizeof(struct lpfc_name));
4942+ memcpy(els_data.wwnn, &ndlp->nlp_nodename, sizeof(struct lpfc_name));
4943+ fc_host_post_vendor_event(shost,
4944+ fc_get_event_number(),
4945+ sizeof(els_data),
4946+ (char *)&els_data,
4947+ SCSI_NL_VID_TYPE_PCI | PCI_VENDOR_ID_EMULEX);
4948+
4949+ return;
4950+}
4951+
4952+
4953+/**
4954+ * lpfc_els_unsol_buffer: Process an unsolicited event data buffer.
4955+ * @phba: pointer to lpfc hba data structure.
4956+ * @pring: pointer to a SLI ring.
4957+ * @vport: pointer to a host virtual N_Port data structure.
4958+ * @elsiocb: pointer to lpfc els command iocb data structure.
4959+ *
4960+ * This routine is used for processing the IOCB associated with a unsolicited
4961+ * event. It first determines whether there is an existing ndlp that matches
4962+ * the DID from the unsolicited IOCB. If not, it will create a new one with
4963+ * the DID from the unsolicited IOCB. The ELS command from the unsolicited
4964+ * IOCB is then used to invoke the proper routine and to set up proper state
4965+ * of the discovery state machine.
4966+ **/
4967 static void
4968 lpfc_els_unsol_buffer(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,
4969 struct lpfc_vport *vport, struct lpfc_iocbq *elsiocb)
4970@@ -4059,8 +5276,6 @@ lpfc_els_unsol_buffer(struct lpfc_hba *p
4971 }
4972
4973 phba->fc_stat.elsRcvFrame++;
4974- if (elsiocb->context1)
4975- lpfc_nlp_put(elsiocb->context1);
4976
4977 elsiocb->context1 = lpfc_nlp_get(ndlp);
4978 elsiocb->vport = vport;
4979@@ -4081,6 +5296,7 @@ lpfc_els_unsol_buffer(struct lpfc_hba *p
4980 phba->fc_stat.elsRcvPLOGI++;
4981 ndlp = lpfc_plogi_confirm_nport(phba, payload, ndlp);
4982
4983+ lpfc_send_els_event(vport, ndlp, cmd);
4984 if (vport->port_state < LPFC_DISC_AUTH) {
4985 if (!(phba->pport->fc_flag & FC_PT2PT) ||
4986 (phba->pport->fc_flag & FC_PT2PT_PLOGI)) {
4987@@ -4130,6 +5346,7 @@ lpfc_els_unsol_buffer(struct lpfc_hba *p
4988 did, vport->port_state, ndlp->nlp_flag);
4989
4990 phba->fc_stat.elsRcvPRLO++;
4991+ lpfc_send_els_event(vport, ndlp, cmd);
4992 if (vport->port_state < LPFC_DISC_AUTH) {
4993 rjt_err = LSRJT_UNABLE_TPC;
4994 break;
4995@@ -4147,6 +5364,7 @@ lpfc_els_unsol_buffer(struct lpfc_hba *p
4996 "RCV ADISC: did:x%x/ste:x%x flg:x%x",
4997 did, vport->port_state, ndlp->nlp_flag);
4998
4999+ lpfc_send_els_event(vport, ndlp, cmd);
5000 phba->fc_stat.elsRcvADISC++;
5001 if (vport->port_state < LPFC_DISC_AUTH) {
5002 rjt_err = LSRJT_UNABLE_TPC;
5003@@ -4270,6 +5488,8 @@ lpfc_els_unsol_buffer(struct lpfc_hba *p
5004 NULL);
5005 }
5006
5007+ lpfc_nlp_put(elsiocb->context1);
5008+ elsiocb->context1 = NULL;
5009 return;
5010
5011 dropit:
5012@@ -4282,6 +5502,19 @@ dropit:
5013 phba->fc_stat.elsRcvDrop++;
5014 }
5015
5016+/**
5017+ * lpfc_find_vport_by_vpid: Find a vport on a HBA through vport identifier.
5018+ * @phba: pointer to lpfc hba data structure.
5019+ * @vpi: host virtual N_Port identifier.
5020+ *
5021+ * This routine finds a vport on a HBA (referred by @phba) through a
5022+ * @vpi. The function walks the HBA's vport list and returns the address
5023+ * of the vport with the matching @vpi.
5024+ *
5025+ * Return code
5026+ * NULL - No vport with the matching @vpi found
5027+ * Otherwise - Address to the vport with the matching @vpi.
5028+ **/
5029 static struct lpfc_vport *
5030 lpfc_find_vport_by_vpid(struct lpfc_hba *phba, uint16_t vpi)
5031 {
5032@@ -4299,6 +5532,18 @@ lpfc_find_vport_by_vpid(struct lpfc_hba
5033 return NULL;
5034 }
5035
5036+/**
5037+ * lpfc_els_unsol_event: Process an unsolicited event from an els sli ring.
5038+ * @phba: pointer to lpfc hba data structure.
5039+ * @pring: pointer to a SLI ring.
5040+ * @elsiocb: pointer to lpfc els iocb data structure.
5041+ *
5042+ * This routine is used to process an unsolicited event received from a SLI
5043+ * (Service Level Interface) ring. The actual processing of the data buffer
5044+ * associated with the unsolicited event is done by invoking the routine
5045+ * lpfc_els_unsol_buffer() after properly set up the iocb buffer from the
5046+ * SLI ring on which the unsolicited event was received.
5047+ **/
5048 void
5049 lpfc_els_unsol_event(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,
5050 struct lpfc_iocbq *elsiocb)
5051@@ -4309,6 +5554,7 @@ lpfc_els_unsol_event(struct lpfc_hba *ph
5052 struct lpfc_dmabuf *bdeBuf1 = elsiocb->context2;
5053 struct lpfc_dmabuf *bdeBuf2 = elsiocb->context3;
5054
5055+ elsiocb->context1 = NULL;
5056 elsiocb->context2 = NULL;
5057 elsiocb->context3 = NULL;
5058
5059@@ -4356,8 +5602,6 @@ lpfc_els_unsol_event(struct lpfc_hba *ph
5060 * The different unsolicited event handlers would tell us
5061 * if they are done with "mp" by setting context2 to NULL.
5062 */
5063- lpfc_nlp_put(elsiocb->context1);
5064- elsiocb->context1 = NULL;
5065 if (elsiocb->context2) {
5066 lpfc_in_buf_free(phba, (struct lpfc_dmabuf *)elsiocb->context2);
5067 elsiocb->context2 = NULL;
5068@@ -4376,6 +5620,19 @@ lpfc_els_unsol_event(struct lpfc_hba *ph
5069 }
5070 }
5071
5072+/**
5073+ * lpfc_do_scr_ns_plogi: Issue a plogi to the name server for scr.
5074+ * @phba: pointer to lpfc hba data structure.
5075+ * @vport: pointer to a virtual N_Port data structure.
5076+ *
5077+ * This routine issues a Port Login (PLOGI) to the Name Server with
5078+ * State Change Request (SCR) for a @vport. This routine will create an
5079+ * ndlp for the Name Server associated to the @vport if such node does
5080+ * not already exist. The PLOGI to Name Server is issued by invoking the
5081+ * lpfc_issue_els_plogi() routine. If Fabric-Device Management Interface
5082+ * (FDMI) is configured to the @vport, a FDMI node will be created and
5083+ * the PLOGI to FDMI is issued by invoking lpfc_issue_els_plogi() routine.
5084+ **/
5085 void
5086 lpfc_do_scr_ns_plogi(struct lpfc_hba *phba, struct lpfc_vport *vport)
5087 {
5088@@ -4434,6 +5691,18 @@ lpfc_do_scr_ns_plogi(struct lpfc_hba *ph
5089 return;
5090 }
5091
5092+/**
5093+ * lpfc_cmpl_reg_new_vport: Completion callback function to register new vport.
5094+ * @phba: pointer to lpfc hba data structure.
5095+ * @pmb: pointer to the driver internal queue element for mailbox command.
5096+ *
5097+ * This routine is the completion callback function to register new vport
5098+ * mailbox command. If the new vport mailbox command completes successfully,
5099+ * the fabric registration login shall be performed on physical port (the
5100+ * new vport created is actually a physical port, with VPI 0) or the port
5101+ * login to Name Server for State Change Request (SCR) will be performed
5102+ * on virtual port (real virtual port, with VPI greater than 0).
5103+ **/
5104 static void
5105 lpfc_cmpl_reg_new_vport(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)
5106 {
5107@@ -4491,6 +5760,15 @@ lpfc_cmpl_reg_new_vport(struct lpfc_hba
5108 return;
5109 }
5110
5111+/**
5112+ * lpfc_register_new_vport: Register a new vport with a HBA.
5113+ * @phba: pointer to lpfc hba data structure.
5114+ * @vport: pointer to a host virtual N_Port data structure.
5115+ * @ndlp: pointer to a node-list data structure.
5116+ *
5117+ * This routine registers the @vport as a new virtual port with a HBA.
5118+ * It is done through a registering vpi mailbox command.
5119+ **/
5120 static void
5121 lpfc_register_new_vport(struct lpfc_hba *phba, struct lpfc_vport *vport,
5122 struct lpfc_nodelist *ndlp)
5123@@ -4531,6 +5809,26 @@ mbox_err_exit:
5124 return;
5125 }
5126
5127+/**
5128+ * lpfc_cmpl_els_fdisc: Completion function for fdisc iocb command.
5129+ * @phba: pointer to lpfc hba data structure.
5130+ * @cmdiocb: pointer to lpfc command iocb data structure.
5131+ * @rspiocb: pointer to lpfc response iocb data structure.
5132+ *
5133+ * This routine is the completion callback function to a Fabric Discover
5134+ * (FDISC) ELS command. Since all the FDISC ELS commands are issued
5135+ * single threaded, each FDISC completion callback function will reset
5136+ * the discovery timer for all vports such that the timers will not get
5137+ * unnecessary timeout. The function checks the FDISC IOCB status. If error
5138+ * detected, the vport will be set to FC_VPORT_FAILED state. Otherwise,the
5139+ * vport will set to FC_VPORT_ACTIVE state. It then checks whether the DID
5140+ * assigned to the vport has been changed with the completion of the FDISC
5141+ * command. If so, both RPI (Remote Port Index) and VPI (Virtual Port Index)
5142+ * are unregistered from the HBA, and then the lpfc_register_new_vport()
5143+ * routine is invoked to register new vport with the HBA. Otherwise, the
5144+ * lpfc_do_scr_ns_plogi() routine is invoked to issue a PLOGI to the Name
5145+ * Server for State Change Request (SCR).
5146+ **/
5147 static void
5148 lpfc_cmpl_els_fdisc(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
5149 struct lpfc_iocbq *rspiocb)
5150@@ -4565,58 +5863,80 @@ lpfc_cmpl_els_fdisc(struct lpfc_hba *phb
5151 goto out;
5152 /* FDISC failed */
5153 lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS,
5154- "0124 FDISC failed. (%d/%d)\n",
5155+ "0126 FDISC failed. (%d/%d)\n",
5156 irsp->ulpStatus, irsp->un.ulpWord[4]);
5157+ goto fdisc_failed;
5158+ }
5159 if (vport->fc_vport->vport_state == FC_VPORT_INITIALIZING)
5160 lpfc_vport_set_state(vport, FC_VPORT_FAILED);
5161 lpfc_nlp_put(ndlp);
5162 /* giving up on FDISC. Cancel discovery timer */
5163 lpfc_can_disctmo(vport);
5164- } else {
5165- spin_lock_irq(shost->host_lock);
5166- vport->fc_flag |= FC_FABRIC;
5167- if (vport->phba->fc_topology == TOPOLOGY_LOOP)
5168- vport->fc_flag |= FC_PUBLIC_LOOP;
5169- spin_unlock_irq(shost->host_lock);
5170+ spin_lock_irq(shost->host_lock);
5171+ vport->fc_flag |= FC_FABRIC;
5172+ if (vport->phba->fc_topology == TOPOLOGY_LOOP)
5173+ vport->fc_flag |= FC_PUBLIC_LOOP;
5174+ spin_unlock_irq(shost->host_lock);
5175
5176- vport->fc_myDID = irsp->un.ulpWord[4] & Mask_DID;
5177- lpfc_vport_set_state(vport, FC_VPORT_ACTIVE);
5178- if ((vport->fc_prevDID != vport->fc_myDID) &&
5179- !(vport->fc_flag & FC_VPORT_NEEDS_REG_VPI)) {
5180- /* If our NportID changed, we need to ensure all
5181- * remaining NPORTs get unreg_login'ed so we can
5182- * issue unreg_vpi.
5183- */
5184- list_for_each_entry_safe(np, next_np,
5185- &vport->fc_nodes, nlp_listp) {
5186- if (!NLP_CHK_NODE_ACT(ndlp) ||
5187- (np->nlp_state != NLP_STE_NPR_NODE) ||
5188- !(np->nlp_flag & NLP_NPR_ADISC))
5189- continue;
5190- spin_lock_irq(shost->host_lock);
5191- np->nlp_flag &= ~NLP_NPR_ADISC;
5192- spin_unlock_irq(shost->host_lock);
5193- lpfc_unreg_rpi(vport, np);
5194- }
5195- lpfc_mbx_unreg_vpi(vport);
5196+ vport->fc_myDID = irsp->un.ulpWord[4] & Mask_DID;
5197+ lpfc_vport_set_state(vport, FC_VPORT_ACTIVE);
5198+ if ((vport->fc_prevDID != vport->fc_myDID) &&
5199+ !(vport->fc_flag & FC_VPORT_NEEDS_REG_VPI)) {
5200+ /* If our NportID changed, we need to ensure all
5201+ * remaining NPORTs get unreg_login'ed so we can
5202+ * issue unreg_vpi.
5203+ */
5204+ list_for_each_entry_safe(np, next_np,
5205+ &vport->fc_nodes, nlp_listp) {
5206+ if (!NLP_CHK_NODE_ACT(ndlp) ||
5207+ (np->nlp_state != NLP_STE_NPR_NODE) ||
5208+ !(np->nlp_flag & NLP_NPR_ADISC))
5209+ continue;
5210 spin_lock_irq(shost->host_lock);
5211- vport->fc_flag |= FC_VPORT_NEEDS_REG_VPI;
5212+ np->nlp_flag &= ~NLP_NPR_ADISC;
5213 spin_unlock_irq(shost->host_lock);
5214+ lpfc_unreg_rpi(vport, np);
5215 }
5216-
5217- if (vport->fc_flag & FC_VPORT_NEEDS_REG_VPI)
5218- lpfc_register_new_vport(phba, vport, ndlp);
5219- else
5220- lpfc_do_scr_ns_plogi(phba, vport);
5221-
5222- /* Unconditionaly kick off releasing fabric node for vports */
5223- lpfc_nlp_put(ndlp);
5224+ lpfc_mbx_unreg_vpi(vport);
5225+ spin_lock_irq(shost->host_lock);
5226+ vport->fc_flag |= FC_VPORT_NEEDS_REG_VPI;
5227+ spin_unlock_irq(shost->host_lock);
5228 }
5229
5230+ if (vport->fc_flag & FC_VPORT_NEEDS_REG_VPI)
5231+ lpfc_register_new_vport(phba, vport, ndlp);
5232+ else
5233+ lpfc_do_scr_ns_plogi(phba, vport);
5234+ goto out;
5235+fdisc_failed:
5236+ lpfc_vport_set_state(vport, FC_VPORT_FAILED);
5237+ /* Cancel discovery timer */
5238+ lpfc_can_disctmo(vport);
5239+ lpfc_nlp_put(ndlp);
5240 out:
5241 lpfc_els_free_iocb(phba, cmdiocb);
5242 }
5243
5244+/**
5245+ * lpfc_issue_els_fdisc: Issue a fdisc iocb command.
5246+ * @vport: pointer to a virtual N_Port data structure.
5247+ * @ndlp: pointer to a node-list data structure.
5248+ * @retry: number of retries to the command IOCB.
5249+ *
5250+ * This routine prepares and issues a Fabric Discover (FDISC) IOCB to
5251+ * a remote node (@ndlp) off a @vport. It uses the lpfc_issue_fabric_iocb()
5252+ * routine to issue the IOCB, which makes sure only one outstanding fabric
5253+ * IOCB will be sent off HBA at any given time.
5254+ *
5255+ * Note that, in lpfc_prep_els_iocb() routine, the reference count of ndlp
5256+ * will be incremented by 1 for holding the ndlp and the reference to ndlp
5257+ * will be stored into the context1 field of the IOCB for the completion
5258+ * callback function to the FDISC ELS command.
5259+ *
5260+ * Return code
5261+ * 0 - Successfully issued fdisc iocb command
5262+ * 1 - Failed to issue fdisc iocb command
5263+ **/
5264 static int
5265 lpfc_issue_els_fdisc(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
5266 uint8_t retry)
5267@@ -4691,6 +6011,20 @@ lpfc_issue_els_fdisc(struct lpfc_vport *
5268 return 0;
5269 }
5270
5271+/**
5272+ * lpfc_cmpl_els_npiv_logo: Completion function with vport logo.
5273+ * @phba: pointer to lpfc hba data structure.
5274+ * @cmdiocb: pointer to lpfc command iocb data structure.
5275+ * @rspiocb: pointer to lpfc response iocb data structure.
5276+ *
5277+ * This routine is the completion callback function to the issuing of a LOGO
5278+ * ELS command off a vport. It frees the command IOCB and then decrement the
5279+ * reference count held on ndlp for this completion function, indicating that
5280+ * the reference to the ndlp is no long needed. Note that the
5281+ * lpfc_els_free_iocb() routine decrements the ndlp reference held for this
5282+ * callback function and an additional explicit ndlp reference decrementation
5283+ * will trigger the actual release of the ndlp.
5284+ **/
5285 static void
5286 lpfc_cmpl_els_npiv_logo(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
5287 struct lpfc_iocbq *rspiocb)
5288@@ -4712,6 +6046,22 @@ lpfc_cmpl_els_npiv_logo(struct lpfc_hba
5289 lpfc_nlp_put(ndlp);
5290 }
5291
5292+/**
5293+ * lpfc_issue_els_npiv_logo: Issue a logo off a vport.
5294+ * @vport: pointer to a virtual N_Port data structure.
5295+ * @ndlp: pointer to a node-list data structure.
5296+ *
5297+ * This routine issues a LOGO ELS command to an @ndlp off a @vport.
5298+ *
5299+ * Note that, in lpfc_prep_els_iocb() routine, the reference count of ndlp
5300+ * will be incremented by 1 for holding the ndlp and the reference to ndlp
5301+ * will be stored into the context1 field of the IOCB for the completion
5302+ * callback function to the LOGO ELS command.
5303+ *
5304+ * Return codes
5305+ * 0 - Successfully issued logo off the @vport
5306+ * 1 - Failed to issue logo off the @vport
5307+ **/
5308 int
5309 lpfc_issue_els_npiv_logo(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp)
5310 {
5311@@ -4757,6 +6107,17 @@ lpfc_issue_els_npiv_logo(struct lpfc_vpo
5312 return 0;
5313 }
5314
5315+/**
5316+ * lpfc_fabric_block_timeout: Handler function to the fabric block timer.
5317+ * @ptr: holder for the timer function associated data.
5318+ *
5319+ * This routine is invoked by the fabric iocb block timer after
5320+ * timeout. It posts the fabric iocb block timeout event by setting the
5321+ * WORKER_FABRIC_BLOCK_TMO bit to work port event bitmap and then invokes
5322+ * lpfc_worker_wake_up() routine to wake up the worker thread. It is for
5323+ * the worker thread to invoke the lpfc_unblock_fabric_iocbs() on the
5324+ * posted event WORKER_FABRIC_BLOCK_TMO.
5325+ **/
5326 void
5327 lpfc_fabric_block_timeout(unsigned long ptr)
5328 {
5329@@ -4775,6 +6136,16 @@ lpfc_fabric_block_timeout(unsigned long
5330 return;
5331 }
5332
5333+/**
5334+ * lpfc_resume_fabric_iocbs: Issue a fabric iocb from driver internal list.
5335+ * @phba: pointer to lpfc hba data structure.
5336+ *
5337+ * This routine issues one fabric iocb from the driver internal list to
5338+ * the HBA. It first checks whether it's ready to issue one fabric iocb to
5339+ * the HBA (whether there is no outstanding fabric iocb). If so, it shall
5340+ * remove one pending fabric iocb from the driver internal list and invokes
5341+ * lpfc_sli_issue_iocb() routine to send the fabric iocb to the HBA.
5342+ **/
5343 static void
5344 lpfc_resume_fabric_iocbs(struct lpfc_hba *phba)
5345 {
5346@@ -4824,6 +6195,15 @@ repeat:
5347 return;
5348 }
5349
5350+/**
5351+ * lpfc_unblock_fabric_iocbs: Unblock issuing fabric iocb command.
5352+ * @phba: pointer to lpfc hba data structure.
5353+ *
5354+ * This routine unblocks the issuing fabric iocb command. The function
5355+ * will clear the fabric iocb block bit and then invoke the routine
5356+ * lpfc_resume_fabric_iocbs() to issue one of the pending fabric iocb
5357+ * from the driver internal fabric iocb list.
5358+ **/
5359 void
5360 lpfc_unblock_fabric_iocbs(struct lpfc_hba *phba)
5361 {
5362@@ -4833,6 +6213,15 @@ lpfc_unblock_fabric_iocbs(struct lpfc_hb
5363 return;
5364 }
5365
5366+/**
5367+ * lpfc_block_fabric_iocbs: Block issuing fabric iocb command.
5368+ * @phba: pointer to lpfc hba data structure.
5369+ *
5370+ * This routine blocks the issuing fabric iocb for a specified amount of
5371+ * time (currently 100 ms). This is done by set the fabric iocb block bit
5372+ * and set up a timeout timer for 100ms. When the block bit is set, no more
5373+ * fabric iocb will be issued out of the HBA.
5374+ **/
5375 static void
5376 lpfc_block_fabric_iocbs(struct lpfc_hba *phba)
5377 {
5378@@ -4846,6 +6235,19 @@ lpfc_block_fabric_iocbs(struct lpfc_hba
5379 return;
5380 }
5381
5382+/**
5383+ * lpfc_cmpl_fabric_iocb: Completion callback function for fabric iocb.
5384+ * @phba: pointer to lpfc hba data structure.
5385+ * @cmdiocb: pointer to lpfc command iocb data structure.
5386+ * @rspiocb: pointer to lpfc response iocb data structure.
5387+ *
5388+ * This routine is the callback function that is put to the fabric iocb's
5389+ * callback function pointer (iocb->iocb_cmpl). The original iocb's callback
5390+ * function pointer has been stored in iocb->fabric_iocb_cmpl. This callback
5391+ * function first restores and invokes the original iocb's callback function
5392+ * and then invokes the lpfc_resume_fabric_iocbs() routine to issue the next
5393+ * fabric bound iocb from the driver internal fabric iocb list onto the wire.
5394+ **/
5395 static void
5396 lpfc_cmpl_fabric_iocb(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
5397 struct lpfc_iocbq *rspiocb)
5398@@ -4892,6 +6294,30 @@ lpfc_cmpl_fabric_iocb(struct lpfc_hba *p
5399 }
5400 }
5401
5402+/**
5403+ * lpfc_issue_fabric_iocb: Issue a fabric iocb command.
5404+ * @phba: pointer to lpfc hba data structure.
5405+ * @iocb: pointer to lpfc command iocb data structure.
5406+ *
5407+ * This routine is used as the top-level API for issuing a fabric iocb command
5408+ * such as FLOGI and FDISC. To accommodate certain switch fabric, this driver
5409+ * function makes sure that only one fabric bound iocb will be outstanding at
5410+ * any given time. As such, this function will first check to see whether there
5411+ * is already an outstanding fabric iocb on the wire. If so, it will put the
5412+ * newly issued iocb onto the driver internal fabric iocb list, waiting to be
5413+ * issued later. Otherwise, it will issue the iocb on the wire and update the
5414+ * fabric iocb count it indicate that there is one fabric iocb on the wire.
5415+ *
5416+ * Note, this implementation has a potential sending out fabric IOCBs out of
5417+ * order. The problem is caused by the construction of the "ready" boolen does
5418+ * not include the condition that the internal fabric IOCB list is empty. As
5419+ * such, it is possible a fabric IOCB issued by this routine might be "jump"
5420+ * ahead of the fabric IOCBs in the internal list.
5421+ *
5422+ * Return code
5423+ * IOCB_SUCCESS - either fabric iocb put on the list or issued successfully
5424+ * IOCB_ERROR - failed to issue fabric iocb
5425+ **/
5426 static int
5427 lpfc_issue_fabric_iocb(struct lpfc_hba *phba, struct lpfc_iocbq *iocb)
5428 {
5429@@ -4937,7 +6363,17 @@ lpfc_issue_fabric_iocb(struct lpfc_hba *
5430 return ret;
5431 }
5432
5433-
5434+/**
5435+ * lpfc_fabric_abort_vport: Abort a vport's iocbs from driver fabric iocb list.
5436+ * @vport: pointer to a virtual N_Port data structure.
5437+ *
5438+ * This routine aborts all the IOCBs associated with a @vport from the
5439+ * driver internal fabric IOCB list. The list contains fabric IOCBs to be
5440+ * issued to the ELS IOCB ring. This abort function walks the fabric IOCB
5441+ * list, removes each IOCB associated with the @vport off the list, set the
5442+ * status feild to IOSTAT_LOCAL_REJECT, and invokes the callback function
5443+ * associated with the IOCB.
5444+ **/
5445 static void lpfc_fabric_abort_vport(struct lpfc_vport *vport)
5446 {
5447 LIST_HEAD(completions);
5448@@ -4967,6 +6403,17 @@ static void lpfc_fabric_abort_vport(stru
5449 }
5450 }
5451
5452+/**
5453+ * lpfc_fabric_abort_nport: Abort a ndlp's iocbs from driver fabric iocb list.
5454+ * @ndlp: pointer to a node-list data structure.
5455+ *
5456+ * This routine aborts all the IOCBs associated with an @ndlp from the
5457+ * driver internal fabric IOCB list. The list contains fabric IOCBs to be
5458+ * issued to the ELS IOCB ring. This abort function walks the fabric IOCB
5459+ * list, removes each IOCB associated with the @ndlp off the list, set the
5460+ * status feild to IOSTAT_LOCAL_REJECT, and invokes the callback function
5461+ * associated with the IOCB.
5462+ **/
5463 void lpfc_fabric_abort_nport(struct lpfc_nodelist *ndlp)
5464 {
5465 LIST_HEAD(completions);
5466@@ -4996,6 +6443,17 @@ void lpfc_fabric_abort_nport(struct lpfc
5467 }
5468 }
5469
5470+/**
5471+ * lpfc_fabric_abort_hba: Abort all iocbs on driver fabric iocb list.
5472+ * @phba: pointer to lpfc hba data structure.
5473+ *
5474+ * This routine aborts all the IOCBs currently on the driver internal
5475+ * fabric IOCB list. The list contains fabric IOCBs to be issued to the ELS
5476+ * IOCB ring. This function takes the entire IOCB list off the fabric IOCB
5477+ * list, removes IOCBs off the list, set the status feild to
5478+ * IOSTAT_LOCAL_REJECT, and invokes the callback function associated with
5479+ * the IOCB.
5480+ **/
5481 void lpfc_fabric_abort_hba(struct lpfc_hba *phba)
5482 {
5483 LIST_HEAD(completions);
5484--- a/drivers/scsi/lpfc/lpfc.h
5485+++ b/drivers/scsi/lpfc/lpfc.h
5486@@ -34,7 +34,14 @@ struct lpfc_sli2_slim;
5487 #define LPFC_IOCB_LIST_CNT 2250 /* list of IOCBs for fast-path usage. */
5488 #define LPFC_Q_RAMP_UP_INTERVAL 120 /* lun q_depth ramp up interval */
5489 #define LPFC_VNAME_LEN 100 /* vport symbolic name length */
5490+#define LPFC_TGTQ_INTERVAL 40000 /* Min amount of time between tgt
5491+ queue depth change in millisecs */
5492+#define LPFC_TGTQ_RAMPUP_PCENT 5 /* Target queue rampup in percentage */
5493+#define LPFC_MIN_TGT_QDEPTH 100
5494+#define LPFC_MAX_TGT_QDEPTH 0xFFFF
5495
5496+#define LPFC_MAX_BUCKET_COUNT 20 /* Maximum no. of buckets for stat data
5497+ collection. */
5498 /*
5499 * Following time intervals are used of adjusting SCSI device
5500 * queue depths when there are driver resource error or Firmware
5501@@ -49,6 +56,9 @@ struct lpfc_sli2_slim;
5502 #define LPFC_HB_MBOX_INTERVAL 5 /* Heart beat interval in seconds. */
5503 #define LPFC_HB_MBOX_TIMEOUT 30 /* Heart beat timeout in seconds. */
5504
5505+/* Error Attention event polling interval */
5506+#define LPFC_ERATT_POLL_INTERVAL 5 /* EATT poll interval in seconds */
5507+
5508 /* Define macros for 64 bit support */
5509 #define putPaddrLow(addr) ((uint32_t) (0xffffffff & (u64)(addr)))
5510 #define putPaddrHigh(addr) ((uint32_t) (0xffffffff & (((u64)(addr))>>32)))
5511@@ -60,6 +70,9 @@ struct lpfc_sli2_slim;
5512
5513 #define MAX_HBAEVT 32
5514
5515+/* Number of MSI-X vectors the driver uses */
5516+#define LPFC_MSIX_VECTORS 2
5517+
5518 /* lpfc wait event data ready flag */
5519 #define LPFC_DATA_READY (1<<0)
5520
5521@@ -357,6 +370,7 @@ struct lpfc_vport {
5522 uint32_t cfg_log_verbose;
5523 uint32_t cfg_max_luns;
5524 uint32_t cfg_enable_da_id;
5525+ uint32_t cfg_max_scsicmpl_time;
5526
5527 uint32_t dev_loss_tmo_changed;
5528
5529@@ -369,6 +383,8 @@ struct lpfc_vport {
5530 struct lpfc_debugfs_trc *disc_trc;
5531 atomic_t disc_trc_cnt;
5532 #endif
5533+ uint8_t stat_data_enabled;
5534+ uint8_t stat_data_blocked;
5535 };
5536
5537 struct hbq_s {
5538@@ -407,10 +423,11 @@ struct lpfc_hba {
5539 struct lpfc_sli sli;
5540 uint32_t sli_rev; /* SLI2 or SLI3 */
5541 uint32_t sli3_options; /* Mask of enabled SLI3 options */
5542-#define LPFC_SLI3_ENABLED 0x01
5543-#define LPFC_SLI3_HBQ_ENABLED 0x02
5544-#define LPFC_SLI3_NPIV_ENABLED 0x04
5545-#define LPFC_SLI3_VPORT_TEARDOWN 0x08
5546+#define LPFC_SLI3_HBQ_ENABLED 0x01
5547+#define LPFC_SLI3_NPIV_ENABLED 0x02
5548+#define LPFC_SLI3_VPORT_TEARDOWN 0x04
5549+#define LPFC_SLI3_CRP_ENABLED 0x08
5550+#define LPFC_SLI3_INB_ENABLED 0x10
5551 uint32_t iocb_cmd_size;
5552 uint32_t iocb_rsp_size;
5553
5554@@ -422,10 +439,20 @@ struct lpfc_hba {
5555 #define LS_NPIV_FAB_SUPPORTED 0x2 /* Fabric supports NPIV */
5556 #define LS_IGNORE_ERATT 0x4 /* intr handler should ignore ERATT */
5557
5558- struct lpfc_sli2_slim *slim2p;
5559- struct lpfc_dmabuf hbqslimp;
5560+ uint32_t hba_flag; /* hba generic flags */
5561+#define HBA_ERATT_HANDLED 0x1 /* This flag is set when eratt handled */
5562
5563- dma_addr_t slim2p_mapping;
5564+ struct lpfc_dmabuf slim2p;
5565+
5566+ MAILBOX_t *mbox;
5567+ uint32_t *inb_ha_copy;
5568+ uint32_t *inb_counter;
5569+ uint32_t inb_last_counter;
5570+ uint32_t ha_copy;
5571+ struct _PCB *pcb;
5572+ struct _IOCB *IOCBs;
5573+
5574+ struct lpfc_dmabuf hbqslimp;
5575
5576 uint16_t pci_cfg_value;
5577
5578@@ -492,7 +519,7 @@ struct lpfc_hba {
5579
5580 wait_queue_head_t work_waitq;
5581 struct task_struct *worker_thread;
5582- long data_flags;
5583+ unsigned long data_flags;
5584
5585 uint32_t hbq_in_use; /* HBQs in use flag */
5586 struct list_head hbqbuf_in_list; /* in-fly hbq buffer list */
5587@@ -514,6 +541,7 @@ struct lpfc_hba {
5588 void __iomem *HCregaddr; /* virtual address for host ctl reg */
5589
5590 struct lpfc_hgp __iomem *host_gp; /* Host side get/put pointers */
5591+ struct lpfc_pgp *port_gp;
5592 uint32_t __iomem *hbq_put; /* Address in SLIM to HBQ put ptrs */
5593 uint32_t *hbq_get; /* Host mem address of HBQ get ptrs */
5594
5595@@ -536,6 +564,7 @@ struct lpfc_hba {
5596 uint8_t soft_wwn_enable;
5597
5598 struct timer_list fcp_poll_timer;
5599+ struct timer_list eratt_poll;
5600
5601 /*
5602 * stat counters
5603@@ -565,7 +594,7 @@ struct lpfc_hba {
5604
5605 struct fc_host_statistics link_stats;
5606 enum intr_type_t intr_type;
5607- struct msix_entry msix_entries[1];
5608+ struct msix_entry msix_entries[LPFC_MSIX_VECTORS];
5609
5610 struct list_head port_list;
5611 struct lpfc_vport *pport; /* physical lpfc_vport pointer */
5612@@ -605,6 +634,7 @@ struct lpfc_hba {
5613 unsigned long last_completion_time;
5614 struct timer_list hb_tmofunc;
5615 uint8_t hb_outstanding;
5616+ enum hba_temp_state over_temp_state;
5617 /* ndlp reference management */
5618 spinlock_t ndlp_lock;
5619 /*
5620@@ -613,7 +643,19 @@ struct lpfc_hba {
5621 */
5622 #define QUE_BUFTAG_BIT (1<<31)
5623 uint32_t buffer_tag_count;
5624- enum hba_temp_state over_temp_state;
5625+ int wait_4_mlo_maint_flg;
5626+ wait_queue_head_t wait_4_mlo_m_q;
5627+ /* data structure used for latency data collection */
5628+#define LPFC_NO_BUCKET 0
5629+#define LPFC_LINEAR_BUCKET 1
5630+#define LPFC_POWER2_BUCKET 2
5631+ uint8_t bucket_type;
5632+ uint32_t bucket_base;
5633+ uint32_t bucket_step;
5634+
5635+/* Maximum number of events that can be outstanding at any time*/
5636+#define LPFC_MAX_EVT_COUNT 512
5637+ atomic_t fast_event_count;
5638 };
5639
5640 static inline struct Scsi_Host *
5641@@ -650,15 +692,25 @@ lpfc_worker_wake_up(struct lpfc_hba *phb
5642 return;
5643 }
5644
5645-#define FC_REG_DUMP_EVENT 0x10 /* Register for Dump events */
5646-#define FC_REG_TEMPERATURE_EVENT 0x20 /* Register for temperature
5647- event */
5648-
5649-struct temp_event {
5650- uint32_t event_type;
5651- uint32_t event_code;
5652- uint32_t data;
5653-};
5654-#define LPFC_CRIT_TEMP 0x1
5655-#define LPFC_THRESHOLD_TEMP 0x2
5656-#define LPFC_NORMAL_TEMP 0x3
5657+static inline void
5658+lpfc_sli_read_hs(struct lpfc_hba *phba)
5659+{
5660+ /*
5661+ * There was a link/board error. Read the status register to retrieve
5662+ * the error event and process it.
5663+ */
5664+ phba->sli.slistat.err_attn_event++;
5665+
5666+ /* Save status info */
5667+ phba->work_hs = readl(phba->HSregaddr);
5668+ phba->work_status[0] = readl(phba->MBslimaddr + 0xa8);
5669+ phba->work_status[1] = readl(phba->MBslimaddr + 0xac);
5670+
5671+ /* Clear chip Host Attention error bit */
5672+ writel(HA_ERATT, phba->HAregaddr);
5673+ readl(phba->HAregaddr); /* flush */
5674+ phba->pport->stopped = 1;
5675+
5676+ return;
5677+}
5678+
5679--- a/drivers/scsi/lpfc/lpfc_hbadisc.c
5680+++ b/drivers/scsi/lpfc/lpfc_hbadisc.c
5681@@ -30,6 +30,7 @@
5682 #include <scsi/scsi_transport_fc.h>
5683
5684 #include "lpfc_hw.h"
5685+#include "lpfc_nl.h"
5686 #include "lpfc_disc.h"
5687 #include "lpfc_sli.h"
5688 #include "lpfc_scsi.h"
5689@@ -207,8 +208,16 @@ lpfc_dev_loss_tmo_handler(struct lpfc_no
5690 return;
5691 }
5692
5693- if (ndlp->nlp_state == NLP_STE_MAPPED_NODE)
5694+ if (ndlp->nlp_state == NLP_STE_MAPPED_NODE) {
5695+ lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
5696+ "0284 Devloss timeout Ignored on "
5697+ "WWPN %x:%x:%x:%x:%x:%x:%x:%x "
5698+ "NPort x%x\n",
5699+ *name, *(name+1), *(name+2), *(name+3),
5700+ *(name+4), *(name+5), *(name+6), *(name+7),
5701+ ndlp->nlp_DID);
5702 return;
5703+ }
5704
5705 if (ndlp->nlp_type & NLP_FABRIC) {
5706 /* We will clean up these Nodes in linkup */
5707@@ -229,8 +238,6 @@ lpfc_dev_loss_tmo_handler(struct lpfc_no
5708 lpfc_sli_abort_iocb(vport, &phba->sli.ring[phba->sli.fcp_ring],
5709 ndlp->nlp_sid, 0, LPFC_CTX_TGT);
5710 }
5711- if (vport->load_flag & FC_UNLOADING)
5712- warn_on = 0;
5713
5714 if (warn_on) {
5715 lpfc_printf_vlog(vport, KERN_ERR, LOG_DISCOVERY,
5716@@ -268,6 +275,124 @@ lpfc_dev_loss_tmo_handler(struct lpfc_no
5717 lpfc_disc_state_machine(vport, ndlp, NULL, NLP_EVT_DEVICE_RM);
5718 }
5719
5720+/**
5721+ * lpfc_alloc_fast_evt: Allocates data structure for posting event.
5722+ * @phba: Pointer to hba context object.
5723+ *
5724+ * This function is called from the functions which need to post
5725+ * events from interrupt context. This function allocates data
5726+ * structure required for posting event. It also keeps track of
5727+ * number of events pending and prevent event storm when there are
5728+ * too many events.
5729+ **/
5730+struct lpfc_fast_path_event *
5731+lpfc_alloc_fast_evt(struct lpfc_hba *phba) {
5732+ struct lpfc_fast_path_event *ret;
5733+
5734+ /* If there are lot of fast event do not exhaust memory due to this */
5735+ if (atomic_read(&phba->fast_event_count) > LPFC_MAX_EVT_COUNT)
5736+ return NULL;
5737+
5738+ ret = kzalloc(sizeof(struct lpfc_fast_path_event),
5739+ GFP_ATOMIC);
5740+ if (ret)
5741+ atomic_inc(&phba->fast_event_count);
5742+ INIT_LIST_HEAD(&ret->work_evt.evt_listp);
5743+ ret->work_evt.evt = LPFC_EVT_FASTPATH_MGMT_EVT;
5744+ return ret;
5745+}
5746+
5747+/**
5748+ * lpfc_free_fast_evt: Frees event data structure.
5749+ * @phba: Pointer to hba context object.
5750+ * @evt: Event object which need to be freed.
5751+ *
5752+ * This function frees the data structure required for posting
5753+ * events.
5754+ **/
5755+void
5756+lpfc_free_fast_evt(struct lpfc_hba *phba,
5757+ struct lpfc_fast_path_event *evt) {
5758+
5759+ atomic_dec(&phba->fast_event_count);
5760+ kfree(evt);
5761+}
5762+
5763+/**
5764+ * lpfc_send_fastpath_evt: Posts events generated from fast path.
5765+ * @phba: Pointer to hba context object.
5766+ * @evtp: Event data structure.
5767+ *
5768+ * This function is called from worker thread, when the interrupt
5769+ * context need to post an event. This function posts the event
5770+ * to fc transport netlink interface.
5771+ **/
5772+static void
5773+lpfc_send_fastpath_evt(struct lpfc_hba *phba,
5774+ struct lpfc_work_evt *evtp)
5775+{
5776+ unsigned long evt_category, evt_sub_category;
5777+ struct lpfc_fast_path_event *fast_evt_data;
5778+ char *evt_data;
5779+ uint32_t evt_data_size;
5780+ struct Scsi_Host *shost;
5781+
5782+ fast_evt_data = container_of(evtp, struct lpfc_fast_path_event,
5783+ work_evt);
5784+
5785+ evt_category = (unsigned long) fast_evt_data->un.fabric_evt.event_type;
5786+ evt_sub_category = (unsigned long) fast_evt_data->un.
5787+ fabric_evt.subcategory;
5788+ shost = lpfc_shost_from_vport(fast_evt_data->vport);
5789+ if (evt_category == FC_REG_FABRIC_EVENT) {
5790+ if (evt_sub_category == LPFC_EVENT_FCPRDCHKERR) {
5791+ evt_data = (char *) &fast_evt_data->un.read_check_error;
5792+ evt_data_size = sizeof(fast_evt_data->un.
5793+ read_check_error);
5794+ } else if ((evt_sub_category == LPFC_EVENT_FABRIC_BUSY) ||
5795+ (evt_sub_category == IOSTAT_NPORT_BSY)) {
5796+ evt_data = (char *) &fast_evt_data->un.fabric_evt;
5797+ evt_data_size = sizeof(fast_evt_data->un.fabric_evt);
5798+ } else {
5799+ lpfc_free_fast_evt(phba, fast_evt_data);
5800+ return;
5801+ }
5802+ } else if (evt_category == FC_REG_SCSI_EVENT) {
5803+ switch (evt_sub_category) {
5804+ case LPFC_EVENT_QFULL:
5805+ case LPFC_EVENT_DEVBSY:
5806+ evt_data = (char *) &fast_evt_data->un.scsi_evt;
5807+ evt_data_size = sizeof(fast_evt_data->un.scsi_evt);
5808+ break;
5809+ case LPFC_EVENT_CHECK_COND:
5810+ evt_data = (char *) &fast_evt_data->un.check_cond_evt;
5811+ evt_data_size = sizeof(fast_evt_data->un.
5812+ check_cond_evt);
5813+ break;
5814+ case LPFC_EVENT_VARQUEDEPTH:
5815+ evt_data = (char *) &fast_evt_data->un.queue_depth_evt;
5816+ evt_data_size = sizeof(fast_evt_data->un.
5817+ queue_depth_evt);
5818+ break;
5819+ default:
5820+ lpfc_free_fast_evt(phba, fast_evt_data);
5821+ return;
5822+ }
5823+ } else {
5824+ lpfc_free_fast_evt(phba, fast_evt_data);
5825+ return;
5826+ }
5827+
5828+ fc_host_post_vendor_event(shost,
5829+ fc_get_event_number(),
5830+ evt_data_size,
5831+ evt_data,
5832+ SCSI_NL_VID_TYPE_PCI | PCI_VENDOR_ID_EMULEX);
5833+
5834+ lpfc_free_fast_evt(phba, fast_evt_data);
5835+ return;
5836+}
5837+
5838 static void
5839 lpfc_work_list_done(struct lpfc_hba *phba)
5840 {
5841@@ -339,6 +464,10 @@ lpfc_work_list_done(struct lpfc_hba *phb
5842 lpfc_unblock_mgmt_io(phba);
5843 complete((struct completion *)(evtp->evt_arg2));
5844 break;
5845+ case LPFC_EVT_FASTPATH_MGMT_EVT:
5846+ lpfc_send_fastpath_evt(phba, evtp);
5847+ free_evt = 0;
5848+ break;
5849 }
5850 if (free_evt)
5851 kfree(evtp);
5852@@ -363,6 +492,7 @@ lpfc_work_done(struct lpfc_hba *phba)
5853 spin_unlock_irq(&phba->hbalock);
5854
5855 if (ha_copy & HA_ERATT)
5856+ /* Handle the error attention event */
5857 lpfc_handle_eratt(phba);
5858
5859 if (ha_copy & HA_MBATT)
5860@@ -370,6 +500,7 @@ lpfc_work_done(struct lpfc_hba *phba)
5861
5862 if (ha_copy & HA_LATT)
5863 lpfc_handle_latt(phba);
5864+
5865 vports = lpfc_create_vport_work_array(phba);
5866 if (vports != NULL)
5867 for(i = 0; i <= phba->max_vpi; i++) {
5868@@ -1005,14 +1136,10 @@ out:
5869 }
5870
5871 static void
5872-lpfc_mbx_issue_link_down(struct lpfc_hba *phba)
5873+lpfc_enable_la(struct lpfc_hba *phba)
5874 {
5875 uint32_t control;
5876 struct lpfc_sli *psli = &phba->sli;
5877-
5878- lpfc_linkdown(phba);
5879-
5880- /* turn on Link Attention interrupts - no CLEAR_LA needed */
5881 spin_lock_irq(&phba->hbalock);
5882 psli->sli_flag |= LPFC_PROCESS_LA;
5883 control = readl(phba->HCregaddr);
5884@@ -1022,6 +1149,15 @@ lpfc_mbx_issue_link_down(struct lpfc_hba
5885 spin_unlock_irq(&phba->hbalock);
5886 }
5887
5888+static void
5889+lpfc_mbx_issue_link_down(struct lpfc_hba *phba)
5890+{
5891+ lpfc_linkdown(phba);
5892+ lpfc_enable_la(phba);
5893+ /* turn on Link Attention interrupts - no CLEAR_LA needed */
5894+}
5895+
5896+
5897 /*
5898 * This routine handles processing a READ_LA mailbox
5899 * command upon completion. It is setup in the LPFC_MBOXQ
5900@@ -1069,8 +1205,12 @@ lpfc_mbx_cmpl_read_la(struct lpfc_hba *p
5901 }
5902
5903 phba->fc_eventTag = la->eventTag;
5904+ if (la->mm)
5905+ phba->sli.sli_flag |= LPFC_MENLO_MAINT;
5906+ else
5907+ phba->sli.sli_flag &= ~LPFC_MENLO_MAINT;
5908
5909- if (la->attType == AT_LINK_UP) {
5910+ if (la->attType == AT_LINK_UP && (!la->mm)) {
5911 phba->fc_stat.LinkUp++;
5912 if (phba->link_flag & LS_LOOPBACK_MODE) {
5913 lpfc_printf_log(phba, KERN_ERR, LOG_LINK_EVENT,
5914@@ -1082,13 +1222,15 @@ lpfc_mbx_cmpl_read_la(struct lpfc_hba *p
5915 } else {
5916 lpfc_printf_log(phba, KERN_ERR, LOG_LINK_EVENT,
5917 "1303 Link Up Event x%x received "
5918- "Data: x%x x%x x%x x%x\n",
5919+ "Data: x%x x%x x%x x%x x%x x%x %d\n",
5920 la->eventTag, phba->fc_eventTag,
5921 la->granted_AL_PA, la->UlnkSpeed,
5922- phba->alpa_map[0]);
5923+ phba->alpa_map[0],
5924+ la->mm, la->fa,
5925+ phba->wait_4_mlo_maint_flg);
5926 }
5927 lpfc_mbx_process_link_up(phba, la);
5928- } else {
5929+ } else if (la->attType == AT_LINK_DOWN) {
5930 phba->fc_stat.LinkDown++;
5931 if (phba->link_flag & LS_LOOPBACK_MODE) {
5932 lpfc_printf_log(phba, KERN_ERR, LOG_LINK_EVENT,
5933@@ -1101,11 +1243,46 @@ lpfc_mbx_cmpl_read_la(struct lpfc_hba *p
5934 else {
5935 lpfc_printf_log(phba, KERN_ERR, LOG_LINK_EVENT,
5936 "1305 Link Down Event x%x received "
5937+ "Data: x%x x%x x%x x%x x%x\n",
5938+ la->eventTag, phba->fc_eventTag,
5939+ phba->pport->port_state, vport->fc_flag,
5940+ la->mm, la->fa);
5941+ }
5942+ lpfc_mbx_issue_link_down(phba);
5943+ }
5944+ if (la->mm && la->attType == AT_LINK_UP) {
5945+ if (phba->link_state != LPFC_LINK_DOWN) {
5946+ phba->fc_stat.LinkDown++;
5947+ lpfc_printf_log(phba, KERN_ERR, LOG_LINK_EVENT,
5948+ "1312 Link Down Event x%x received "
5949+ "Data: x%x x%x x%x\n",
5950+ la->eventTag, phba->fc_eventTag,
5951+ phba->pport->port_state, vport->fc_flag);
5952+ lpfc_mbx_issue_link_down(phba);
5953+ } else
5954+ lpfc_enable_la(phba);
5955+
5956+ lpfc_printf_log(phba, KERN_ERR, LOG_LINK_EVENT,
5957+ "1310 Menlo Maint Mode Link up Event x%x rcvd "
5958 "Data: x%x x%x x%x\n",
5959 la->eventTag, phba->fc_eventTag,
5960 phba->pport->port_state, vport->fc_flag);
5961+ /*
5962+ * The cmnd that triggered this will be waiting for this
5963+ * signal.
5964+ */
5965+ /* WAKEUP for MENLO_SET_MODE or MENLO_RESET command. */
5966+ if (phba->wait_4_mlo_maint_flg) {
5967+ phba->wait_4_mlo_maint_flg = 0;
5968+ wake_up_interruptible(&phba->wait_4_mlo_m_q);
5969 }
5970- lpfc_mbx_issue_link_down(phba);
5971+ }
5972+
5973+ if (la->fa) {
5974+ if (la->mm)
5975+ lpfc_issue_clear_la(phba, vport);
5976+ lpfc_printf_log(phba, KERN_INFO, LOG_LINK_EVENT,
5977+ "1311 fa %d\n", la->fa);
5978 }
5979
5980 lpfc_mbx_cmpl_read_la_free_mbuf:
5981@@ -1169,7 +1346,7 @@ lpfc_mbx_cmpl_unreg_vpi(struct lpfc_hba
5982 scsi_host_put(shost);
5983 }
5984
5985-void
5986+int
5987 lpfc_mbx_unreg_vpi(struct lpfc_vport *vport)
5988 {
5989 struct lpfc_hba *phba = vport->phba;
5990@@ -1178,7 +1355,7 @@ lpfc_mbx_unreg_vpi(struct lpfc_vport *vp
5991
5992 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
5993 if (!mbox)
5994- return;
5995+ return 1;
5996
5997 lpfc_unreg_vpi(phba, vport->vpi, mbox);
5998 mbox->vport = vport;
5999@@ -1189,7 +1366,9 @@ lpfc_mbx_unreg_vpi(struct lpfc_vport *vp
6000 "1800 Could not issue unreg_vpi\n");
6001 mempool_free(mbox, phba->mbox_mem_pool);
6002 vport->unreg_vpi_cmpl = VPORT_ERROR;
6003+ return rc;
6004 }
6005+ return 0;
6006 }
6007
6008 static void
6009@@ -1545,6 +1724,22 @@ lpfc_nlp_state_cleanup(struct lpfc_vport
6010 */
6011 lpfc_register_remote_port(vport, ndlp);
6012 }
6013+ if ((new_state == NLP_STE_MAPPED_NODE) &&
6014+ (vport->stat_data_enabled)) {
6015+ /*
6016+ * A new target is discovered, if there is no buffer for
6017+ * statistical data collection allocate buffer.
6018+ */
6019+ ndlp->lat_data = kcalloc(LPFC_MAX_BUCKET_COUNT,
6020+ sizeof(struct lpfc_scsicmd_bkt),
6021+ GFP_KERNEL);
6022+
6023+ if (!ndlp->lat_data)
6024+ lpfc_printf_vlog(vport, KERN_ERR, LOG_NODE,
6025+ "0286 lpfc_nlp_state_cleanup failed to "
6026+ "allocate statistical data buffer DID "
6027+ "0x%x\n", ndlp->nlp_DID);
6028+ }
6029 /*
6030 * if we added to Mapped list, but the remote port
6031 * registration failed or assigned a target id outside
6032@@ -2778,7 +2973,7 @@ restart_disc:
6033
6034 default:
6035 lpfc_printf_vlog(vport, KERN_ERR, LOG_DISCOVERY,
6036- "0229 Unexpected discovery timeout, "
6037+ "0273 Unexpected discovery timeout, "
6038 "vport State x%x\n", vport->port_state);
6039 break;
6040 }
6041@@ -2932,6 +3127,8 @@ lpfc_nlp_init(struct lpfc_vport *vport,
6042 INIT_LIST_HEAD(&ndlp->nlp_listp);
6043 kref_init(&ndlp->kref);
6044 NLP_INT_NODE_ACT(ndlp);
6045+ atomic_set(&ndlp->cmd_pending, 0);
6046+ ndlp->cmd_qdepth = LPFC_MAX_TGT_QDEPTH;
6047
6048 lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_NODE,
6049 "node init: did:x%x",
6050@@ -2971,8 +3168,10 @@ lpfc_nlp_release(struct kref *kref)
6051 spin_unlock_irqrestore(&phba->ndlp_lock, flags);
6052
6053 /* free ndlp memory for final ndlp release */
6054- if (NLP_CHK_FREE_REQ(ndlp))
6055+ if (NLP_CHK_FREE_REQ(ndlp)) {
6056+ kfree(ndlp->lat_data);
6057 mempool_free(ndlp, ndlp->vport->phba->nlp_mem_pool);
6058+ }
6059 }
6060
6061 /* This routine bumps the reference count for a ndlp structure to ensure
6062--- a/drivers/scsi/lpfc/lpfc_hw.h
6063+++ b/drivers/scsi/lpfc/lpfc_hw.h
6064@@ -1107,6 +1107,8 @@ typedef struct {
6065 /* Start FireFly Register definitions */
6066 #define PCI_VENDOR_ID_EMULEX 0x10df
6067 #define PCI_DEVICE_ID_FIREFLY 0x1ae5
6068+#define PCI_DEVICE_ID_PROTEUS_VF 0xe100
6069+#define PCI_DEVICE_ID_PROTEUS_PF 0xe180
6070 #define PCI_DEVICE_ID_SAT_SMB 0xf011
6071 #define PCI_DEVICE_ID_SAT_MID 0xf015
6072 #define PCI_DEVICE_ID_RFLY 0xf095
6073@@ -1133,10 +1135,12 @@ typedef struct {
6074 #define PCI_DEVICE_ID_LP11000S 0xfc10
6075 #define PCI_DEVICE_ID_LPE11000S 0xfc20
6076 #define PCI_DEVICE_ID_SAT_S 0xfc40
6077+#define PCI_DEVICE_ID_PROTEUS_S 0xfc50
6078 #define PCI_DEVICE_ID_HELIOS 0xfd00
6079 #define PCI_DEVICE_ID_HELIOS_SCSP 0xfd11
6080 #define PCI_DEVICE_ID_HELIOS_DCSP 0xfd12
6081 #define PCI_DEVICE_ID_ZEPHYR 0xfe00
6082+#define PCI_DEVICE_ID_HORNET 0xfe05
6083 #define PCI_DEVICE_ID_ZEPHYR_SCSP 0xfe11
6084 #define PCI_DEVICE_ID_ZEPHYR_DCSP 0xfe12
6085
6086@@ -1154,6 +1158,7 @@ typedef struct {
6087 #define ZEPHYR_JEDEC_ID 0x0577
6088 #define VIPER_JEDEC_ID 0x4838
6089 #define SATURN_JEDEC_ID 0x1004
6090+#define HORNET_JDEC_ID 0x2057706D
6091
6092 #define JEDEC_ID_MASK 0x0FFFF000
6093 #define JEDEC_ID_SHIFT 12
6094@@ -1198,6 +1203,18 @@ typedef struct { /* FireFly BIU registe
6095 #define HA_RXATT 0x00000008 /* Bit 3 */
6096 #define HA_RXMASK 0x0000000f
6097
6098+#define HA_R0_CLR_MSK (HA_R0RE_REQ | HA_R0CE_RSP | HA_R0ATT)
6099+#define HA_R1_CLR_MSK (HA_R1RE_REQ | HA_R1CE_RSP | HA_R1ATT)
6100+#define HA_R2_CLR_MSK (HA_R2RE_REQ | HA_R2CE_RSP | HA_R2ATT)
6101+#define HA_R3_CLR_MSK (HA_R3RE_REQ | HA_R3CE_RSP | HA_R3ATT)
6102+
6103+#define HA_R0_POS 3
6104+#define HA_R1_POS 7
6105+#define HA_R2_POS 11
6106+#define HA_R3_POS 15
6107+#define HA_LE_POS 29
6108+#define HA_MB_POS 30
6109+#define HA_ER_POS 31
6110 /* Chip Attention Register */
6111
6112 #define CA_REG_OFFSET 4 /* Byte offset from register base address */
6113@@ -1235,7 +1252,7 @@ typedef struct { /* FireFly BIU registe
6114
6115 /* Host Control Register */
6116
6117-#define HC_REG_OFFSET 12 /* Word offset from register base address */
6118+#define HC_REG_OFFSET 12 /* Byte offset from register base address */
6119
6120 #define HC_MBINT_ENA 0x00000001 /* Bit 0 */
6121 #define HC_R0INT_ENA 0x00000002 /* Bit 1 */
6122@@ -1248,6 +1265,19 @@ typedef struct { /* FireFly BIU registe
6123 #define HC_LAINT_ENA 0x20000000 /* Bit 29 */
6124 #define HC_ERINT_ENA 0x80000000 /* Bit 31 */
6125
6126+/* Message Signaled Interrupt eXtension (MSI-X) message identifiers */
6127+#define MSIX_DFLT_ID 0
6128+#define MSIX_RNG0_ID 0
6129+#define MSIX_RNG1_ID 1
6130+#define MSIX_RNG2_ID 2
6131+#define MSIX_RNG3_ID 3
6132+
6133+#define MSIX_LINK_ID 4
6134+#define MSIX_MBOX_ID 5
6135+
6136+#define MSIX_SPARE0_ID 6
6137+#define MSIX_SPARE1_ID 7
6138+
6139 /* Mailbox Commands */
6140 #define MBX_SHUTDOWN 0x00 /* terminate testing */
6141 #define MBX_LOAD_SM 0x01
6142@@ -1285,10 +1315,14 @@ typedef struct { /* FireFly BIU registe
6143 #define MBX_KILL_BOARD 0x24
6144 #define MBX_CONFIG_FARP 0x25
6145 #define MBX_BEACON 0x2A
6146+#define MBX_CONFIG_MSI 0x30
6147 #define MBX_HEARTBEAT 0x31
6148 #define MBX_WRITE_VPARMS 0x32
6149 #define MBX_ASYNCEVT_ENABLE 0x33
6150
6151+#define MBX_PORT_CAPABILITIES 0x3B
6152+#define MBX_PORT_IOV_CONTROL 0x3C
6153+
6154 #define MBX_CONFIG_HBQ 0x7C
6155 #define MBX_LOAD_AREA 0x81
6156 #define MBX_RUN_BIU_DIAG64 0x84
6157@@ -1474,24 +1508,18 @@ struct ulp_bde64 { /* SLI-2 */
6158 uint32_t bdeFlags:8; /* BDE Flags 0 IS A SUPPORTED
6159 VALUE !! */
6160 #endif
6161-
6162-#define BUFF_USE_RSVD 0x01 /* bdeFlags */
6163-#define BUFF_USE_INTRPT 0x02 /* Not Implemented with LP6000 */
6164-#define BUFF_USE_CMND 0x04 /* Optional, 1=cmd/rsp 0=data buffer */
6165-#define BUFF_USE_RCV 0x08 /* "" "", 1=rcv buffer, 0=xmit
6166- buffer */
6167-#define BUFF_TYPE_32BIT 0x10 /* "" "", 1=32 bit addr 0=64 bit
6168- addr */
6169-#define BUFF_TYPE_SPECIAL 0x20 /* Not Implemented with LP6000 */
6170-#define BUFF_TYPE_BDL 0x40 /* Optional, may be set in BDL */
6171-#define BUFF_TYPE_INVALID 0x80 /* "" "" */
6172+#define BUFF_TYPE_BDE_64 0x00 /* BDE (Host_resident) */
6173+#define BUFF_TYPE_BDE_IMMED 0x01 /* Immediate Data BDE */
6174+#define BUFF_TYPE_BDE_64P 0x02 /* BDE (Port-resident) */
6175+#define BUFF_TYPE_BDE_64I 0x08 /* Input BDE (Host-resident) */
6176+#define BUFF_TYPE_BDE_64IP 0x0A /* Input BDE (Port-resident) */
6177+#define BUFF_TYPE_BLP_64 0x40 /* BLP (Host-resident) */
6178+#define BUFF_TYPE_BLP_64P 0x42 /* BLP (Port-resident) */
6179 } f;
6180 } tus;
6181 uint32_t addrLow;
6182 uint32_t addrHigh;
6183 };
6184-#define BDE64_SIZE_WORD 0
6185-#define BPL64_SIZE_WORD 0x40
6186
6187 typedef struct ULP_BDL { /* SLI-2 */
6188 #ifdef __BIG_ENDIAN_BITFIELD
6189@@ -2201,7 +2229,10 @@ typedef struct {
6190 typedef struct {
6191 uint32_t eventTag; /* Event tag */
6192 #ifdef __BIG_ENDIAN_BITFIELD
6193- uint32_t rsvd1:22;
6194+ uint32_t rsvd1:19;
6195+ uint32_t fa:1;
6196+ uint32_t mm:1; /* Menlo Maintenance mode enabled */
6197+ uint32_t rx:1;
6198 uint32_t pb:1;
6199 uint32_t il:1;
6200 uint32_t attType:8;
6201@@ -2209,7 +2240,10 @@ typedef struct {
6202 uint32_t attType:8;
6203 uint32_t il:1;
6204 uint32_t pb:1;
6205- uint32_t rsvd1:22;
6206+ uint32_t rx:1;
6207+ uint32_t mm:1;
6208+ uint32_t fa:1;
6209+ uint32_t rsvd1:19;
6210 #endif
6211
6212 #define AT_RESERVED 0x00 /* Reserved - attType */
6213@@ -2230,6 +2264,7 @@ typedef struct {
6214
6215 #define TOPOLOGY_PT_PT 0x01 /* Topology is pt-pt / pt-fabric */
6216 #define TOPOLOGY_LOOP 0x02 /* Topology is FC-AL */
6217+#define TOPOLOGY_LNK_MENLO_MAINTENANCE 0x05 /* maint mode zephtr to menlo */
6218
6219 union {
6220 struct ulp_bde lilpBde; /* This BDE points to a 128 byte buffer
6221@@ -2324,6 +2359,36 @@ typedef struct {
6222 #define DMP_RSP_OFFSET 0x14 /* word 5 contains first word of rsp */
6223 #define DMP_RSP_SIZE 0x6C /* maximum of 27 words of rsp data */
6224
6225+/* Structure for MB Command UPDATE_CFG (0x1B) */
6226+
6227+struct update_cfg_var {
6228+#ifdef __BIG_ENDIAN_BITFIELD
6229+ uint32_t rsvd2:16;
6230+ uint32_t type:8;
6231+ uint32_t rsvd:1;
6232+ uint32_t ra:1;
6233+ uint32_t co:1;
6234+ uint32_t cv:1;
6235+ uint32_t req:4;
6236+ uint32_t entry_length:16;
6237+ uint32_t region_id:16;
6238+#else /* __LITTLE_ENDIAN_BITFIELD */
6239+ uint32_t req:4;
6240+ uint32_t cv:1;
6241+ uint32_t co:1;
6242+ uint32_t ra:1;
6243+ uint32_t rsvd:1;
6244+ uint32_t type:8;
6245+ uint32_t rsvd2:16;
6246+ uint32_t region_id:16;
6247+ uint32_t entry_length:16;
6248+#endif
6249+
6250+ uint32_t resp_info;
6251+ uint32_t byte_cnt;
6252+ uint32_t data_offset;
6253+};
6254+
6255 struct hbq_mask {
6256 #ifdef __BIG_ENDIAN_BITFIELD
6257 uint8_t tmatch;
6258@@ -2560,6 +2625,40 @@ typedef struct {
6259
6260 } CONFIG_PORT_VAR;
6261
6262+/* Structure for MB Command CONFIG_MSI (0x30) */
6263+struct config_msi_var {
6264+#ifdef __BIG_ENDIAN_BITFIELD
6265+ uint32_t dfltMsgNum:8; /* Default message number */
6266+ uint32_t rsvd1:11; /* Reserved */
6267+ uint32_t NID:5; /* Number of secondary attention IDs */
6268+ uint32_t rsvd2:5; /* Reserved */
6269+ uint32_t dfltPresent:1; /* Default message number present */
6270+ uint32_t addFlag:1; /* Add association flag */
6271+ uint32_t reportFlag:1; /* Report association flag */
6272+#else /* __LITTLE_ENDIAN_BITFIELD */
6273+ uint32_t reportFlag:1; /* Report association flag */
6274+ uint32_t addFlag:1; /* Add association flag */
6275+ uint32_t dfltPresent:1; /* Default message number present */
6276+ uint32_t rsvd2:5; /* Reserved */
6277+ uint32_t NID:5; /* Number of secondary attention IDs */
6278+ uint32_t rsvd1:11; /* Reserved */
6279+ uint32_t dfltMsgNum:8; /* Default message number */
6280+#endif
6281+ uint32_t attentionConditions[2];
6282+ uint8_t attentionId[16];
6283+ uint8_t messageNumberByHA[64];
6284+ uint8_t messageNumberByID[16];
6285+ uint32_t autoClearHA[2];
6286+#ifdef __BIG_ENDIAN_BITFIELD
6287+ uint32_t rsvd3:16;
6288+ uint32_t autoClearID:16;
6289+#else /* __LITTLE_ENDIAN_BITFIELD */
6290+ uint32_t autoClearID:16;
6291+ uint32_t rsvd3:16;
6292+#endif
6293+ uint32_t rsvd4;
6294+};
6295+
6296 /* SLI-2 Port Control Block */
6297
6298 /* SLIM POINTER */
6299@@ -2678,10 +2777,12 @@ typedef union {
6300 * NEW_FEATURE
6301 */
6302 struct config_hbq_var varCfgHbq;/* cmd = 0x7c (CONFIG_HBQ) */
6303+ struct update_cfg_var varUpdateCfg; /* cmd = 0x1B (UPDATE_CFG)*/
6304 CONFIG_PORT_VAR varCfgPort; /* cmd = 0x88 (CONFIG_PORT) */
6305 REG_VPI_VAR varRegVpi; /* cmd = 0x96 (REG_VPI) */
6306 UNREG_VPI_VAR varUnregVpi; /* cmd = 0x97 (UNREG_VPI) */
6307 ASYNCEVT_ENABLE_VAR varCfgAsyncEvent; /*cmd = x33 (CONFIG_ASYNC) */
6308+ struct config_msi_var varCfgMSI;/* cmd = x30 (CONFIG_MSI) */
6309 } MAILVARIANTS;
6310
6311 /*
6312@@ -2715,11 +2816,19 @@ struct sli3_pgp {
6313 uint32_t hbq_get[16];
6314 };
6315
6316-typedef union {
6317- struct sli2_desc s2;
6318- struct sli3_desc s3;
6319- struct sli3_pgp s3_pgp;
6320-} SLI_VAR;
6321+struct sli3_inb_pgp {
6322+ uint32_t ha_copy;
6323+ uint32_t counter;
6324+ struct lpfc_pgp port[MAX_RINGS];
6325+ uint32_t hbq_get[16];
6326+};
6327+
6328+union sli_var {
6329+ struct sli2_desc s2;
6330+ struct sli3_desc s3;
6331+ struct sli3_pgp s3_pgp;
6332+ struct sli3_inb_pgp s3_inb_pgp;
6333+};
6334
6335 typedef struct {
6336 #ifdef __BIG_ENDIAN_BITFIELD
6337@@ -2737,7 +2846,7 @@ typedef struct {
6338 #endif
6339
6340 MAILVARIANTS un;
6341- SLI_VAR us;
6342+ union sli_var us;
6343 } MAILBOX_t;
6344
6345 /*
6346@@ -3105,6 +3214,27 @@ struct que_xri64cx_ext_fields {
6347 struct lpfc_hbq_entry buff[5];
6348 };
6349
6350+#define LPFC_EXT_DATA_BDE_COUNT 3
6351+struct fcp_irw_ext {
6352+ uint32_t io_tag64_low;
6353+ uint32_t io_tag64_high;
6354+#ifdef __BIG_ENDIAN_BITFIELD
6355+ uint8_t reserved1;
6356+ uint8_t reserved2;
6357+ uint8_t reserved3;
6358+ uint8_t ebde_count;
6359+#else /* __LITTLE_ENDIAN */
6360+ uint8_t ebde_count;
6361+ uint8_t reserved3;
6362+ uint8_t reserved2;
6363+ uint8_t reserved1;
6364+#endif
6365+ uint32_t reserved4;
6366+ struct ulp_bde64 rbde; /* response bde */
6367+ struct ulp_bde64 dbde[LPFC_EXT_DATA_BDE_COUNT]; /* data BDE or BPL */
6368+ uint8_t icd[32]; /* immediate command data (32 bytes) */
6369+};
6370+
6371 typedef struct _IOCB { /* IOCB structure */
6372 union {
6373 GENERIC_RSP grsp; /* Generic response */
6374@@ -3190,7 +3320,7 @@ typedef struct _IOCB { /* IOCB structure
6375
6376 /* words 8-31 used for que_xri_cx iocb */
6377 struct que_xri64cx_ext_fields que_xri64cx_ext_words;
6378-
6379+ struct fcp_irw_ext fcp_ext;
6380 uint32_t sli3Words[24]; /* 96 extra bytes for SLI-3 */
6381 } unsli3;
6382
6383@@ -3292,3 +3422,10 @@ lpfc_error_lost_link(IOCB_t *iocbp)
6384 iocbp->un.ulpWord[4] == IOERR_LINK_DOWN ||
6385 iocbp->un.ulpWord[4] == IOERR_SLI_DOWN));
6386 }
6387+
6388+#define MENLO_TRANSPORT_TYPE 0xfe
6389+#define MENLO_CONTEXT 0
6390+#define MENLO_PU 3
6391+#define MENLO_TIMEOUT 30
6392+#define SETVAR_MLOMNT 0x103107
6393+#define SETVAR_MLORST 0x103007
6394--- a/drivers/scsi/lpfc/lpfc_init.c
6395+++ b/drivers/scsi/lpfc/lpfc_init.c
6396@@ -36,6 +36,7 @@
6397
6398 #include "lpfc_hw.h"
6399 #include "lpfc_sli.h"
6400+#include "lpfc_nl.h"
6401 #include "lpfc_disc.h"
6402 #include "lpfc_scsi.h"
6403 #include "lpfc.h"
6404@@ -52,17 +53,20 @@ static struct scsi_transport_template *l
6405 static struct scsi_transport_template *lpfc_vport_transport_template = NULL;
6406 static DEFINE_IDR(lpfc_hba_index);
6407
6408-/************************************************************************/
6409-/* */
6410-/* lpfc_config_port_prep */
6411-/* This routine will do LPFC initialization prior to the */
6412-/* CONFIG_PORT mailbox command. This will be initialized */
6413-/* as a SLI layer callback routine. */
6414-/* This routine returns 0 on success or -ERESTART if it wants */
6415-/* the SLI layer to reset the HBA and try again. Any */
6416-/* other return value indicates an error. */
6417-/* */
6418-/************************************************************************/
6419+/**
6420+ * lpfc_config_port_prep: Perform lpfc initialization prior to config port.
6421+ * @phba: pointer to lpfc hba data structure.
6422+ *
6423+ * This routine will do LPFC initialization prior to issuing the CONFIG_PORT
6424+ * mailbox command. It retrieves the revision information from the HBA and
6425+ * collects the Vital Product Data (VPD) about the HBA for preparing the
6426+ * configuration of the HBA.
6427+ *
6428+ * Return codes:
6429+ * 0 - success.
6430+ * -ERESTART - requests the SLI layer to reset the HBA and try again.
6431+ * Any other value - indicates an error.
6432+ **/
6433 int
6434 lpfc_config_port_prep(struct lpfc_hba *phba)
6435 {
6436@@ -180,12 +184,9 @@ lpfc_config_port_prep(struct lpfc_hba *p
6437 sizeof (phba->RandomData));
6438
6439 /* Get adapter VPD information */
6440- pmb->context2 = kmalloc(DMP_RSP_SIZE, GFP_KERNEL);
6441- if (!pmb->context2)
6442- goto out_free_mbox;
6443 lpfc_vpd_data = kmalloc(DMP_VPD_SIZE, GFP_KERNEL);
6444 if (!lpfc_vpd_data)
6445- goto out_free_context2;
6446+ goto out_free_mbox;
6447
6448 do {
6449 lpfc_dump_mem(phba, pmb, offset);
6450@@ -200,21 +201,29 @@ lpfc_config_port_prep(struct lpfc_hba *p
6451 }
6452 if (mb->un.varDmp.word_cnt > DMP_VPD_SIZE - offset)
6453 mb->un.varDmp.word_cnt = DMP_VPD_SIZE - offset;
6454- lpfc_sli_pcimem_bcopy(pmb->context2, lpfc_vpd_data + offset,
6455+ lpfc_sli_pcimem_bcopy(((uint8_t *)mb) + DMP_RSP_OFFSET,
6456+ lpfc_vpd_data + offset,
6457 mb->un.varDmp.word_cnt);
6458 offset += mb->un.varDmp.word_cnt;
6459 } while (mb->un.varDmp.word_cnt && offset < DMP_VPD_SIZE);
6460 lpfc_parse_vpd(phba, lpfc_vpd_data, offset);
6461
6462 kfree(lpfc_vpd_data);
6463-out_free_context2:
6464- kfree(pmb->context2);
6465 out_free_mbox:
6466 mempool_free(pmb, phba->mbox_mem_pool);
6467 return 0;
6468 }
6469
6470-/* Completion handler for config async event mailbox command. */
6471+/**
6472+ * lpfc_config_async_cmpl: Completion handler for config async event mbox cmd.
6473+ * @phba: pointer to lpfc hba data structure.
6474+ * @pmboxq: pointer to the driver internal queue element for mailbox command.
6475+ *
6476+ * This is the completion handler for driver's configuring asynchronous event
6477+ * mailbox command to the device. If the mailbox command returns successfully,
6478+ * it will set internal async event support flag to 1; otherwise, it will
6479+ * set internal async event support flag to 0.
6480+ **/
6481 static void
6482 lpfc_config_async_cmpl(struct lpfc_hba * phba, LPFC_MBOXQ_t * pmboxq)
6483 {
6484@@ -226,16 +235,19 @@ lpfc_config_async_cmpl(struct lpfc_hba *
6485 return;
6486 }
6487
6488-/************************************************************************/
6489-/* */
6490-/* lpfc_config_port_post */
6491-/* This routine will do LPFC initialization after the */
6492-/* CONFIG_PORT mailbox command. This will be initialized */
6493-/* as a SLI layer callback routine. */
6494-/* This routine returns 0 on success. Any other return value */
6495-/* indicates an error. */
6496-/* */
6497-/************************************************************************/
6498+/**
6499+ * lpfc_config_port_post: Perform lpfc initialization after config port.
6500+ * @phba: pointer to lpfc hba data structure.
6501+ *
6502+ * This routine will do LPFC initialization after the CONFIG_PORT mailbox
6503+ * command call. It performs all internal resource and state setups on the
6504+ * port: post IOCB buffers, enable appropriate host interrupt attentions,
6505+ * ELS ring timers, etc.
6506+ *
6507+ * Return codes
6508+ * 0 - success.
6509+ * Any other value - error.
6510+ **/
6511 int
6512 lpfc_config_port_post(struct lpfc_hba *phba)
6513 {
6514@@ -378,6 +390,29 @@ lpfc_config_port_post(struct lpfc_hba *p
6515 if (phba->sli_rev != 3)
6516 lpfc_post_rcv_buf(phba);
6517
6518+ /*
6519+ * Configure HBA MSI-X attention conditions to messages if MSI-X mode
6520+ */
6521+ if (phba->intr_type == MSIX) {
6522+ rc = lpfc_config_msi(phba, pmb);
6523+ if (rc) {
6524+ mempool_free(pmb, phba->mbox_mem_pool);
6525+ return -EIO;
6526+ }
6527+ rc = lpfc_sli_issue_mbox(phba, pmb, MBX_POLL);
6528+ if (rc != MBX_SUCCESS) {
6529+ lpfc_printf_log(phba, KERN_ERR, LOG_MBOX,
6530+ "0352 Config MSI mailbox command "
6531+ "failed, mbxCmd x%x, mbxStatus x%x\n",
6532+ pmb->mb.mbxCommand, pmb->mb.mbxStatus);
6533+ mempool_free(pmb, phba->mbox_mem_pool);
6534+ return -EIO;
6535+ }
6536+ }
6537+
6538+ /* Initialize ERATT handling flag */
6539+ phba->hba_flag &= ~HBA_ERATT_HANDLED;
6540+
6541 /* Enable appropriate host interrupts */
6542 spin_lock_irq(&phba->hbalock);
6543 status = readl(phba->HCregaddr);
6544@@ -393,26 +428,26 @@ lpfc_config_port_post(struct lpfc_hba *p
6545
6546 if ((phba->cfg_poll & ENABLE_FCP_RING_POLLING) &&
6547 (phba->cfg_poll & DISABLE_FCP_RING_INT))
6548- status &= ~(HC_R0INT_ENA << LPFC_FCP_RING);
6549+ status &= ~(HC_R0INT_ENA);
6550
6551 writel(status, phba->HCregaddr);
6552 readl(phba->HCregaddr); /* flush */
6553 spin_unlock_irq(&phba->hbalock);
6554
6555- /*
6556- * Setup the ring 0 (els) timeout handler
6557- */
6558- timeout = phba->fc_ratov << 1;
6559+ /* Set up ring-0 (ELS) timer */
6560+ timeout = phba->fc_ratov * 2;
6561 mod_timer(&vport->els_tmofunc, jiffies + HZ * timeout);
6562+ /* Set up heart beat (HB) timer */
6563 mod_timer(&phba->hb_tmofunc, jiffies + HZ * LPFC_HB_MBOX_INTERVAL);
6564 phba->hb_outstanding = 0;
6565 phba->last_completion_time = jiffies;
6566+ /* Set up error attention (ERATT) polling timer */
6567+ mod_timer(&phba->eratt_poll, jiffies + HZ * LPFC_ERATT_POLL_INTERVAL);
6568
6569 lpfc_init_link(phba, pmb, phba->cfg_topology, phba->cfg_link_speed);
6570 pmb->mbox_cmpl = lpfc_sli_def_mbox_cmpl;
6571- pmb->vport = vport;
6572- rc = lpfc_sli_issue_mbox(phba, pmb, MBX_NOWAIT);
6573 lpfc_set_loopback_flag(phba);
6574+ rc = lpfc_sli_issue_mbox(phba, pmb, MBX_NOWAIT);
6575 if (rc != MBX_SUCCESS) {
6576 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
6577 "0454 Adapter failed to init, mbxCmd x%x "
6578@@ -447,19 +482,20 @@ lpfc_config_port_post(struct lpfc_hba *p
6579 rc);
6580 mempool_free(pmb, phba->mbox_mem_pool);
6581 }
6582- return (0);
6583+ return 0;
6584 }
6585
6586-/************************************************************************/
6587-/* */
6588-/* lpfc_hba_down_prep */
6589-/* This routine will do LPFC uninitialization before the */
6590-/* HBA is reset when bringing down the SLI Layer. This will be */
6591-/* initialized as a SLI layer callback routine. */
6592-/* This routine returns 0 on success. Any other return value */
6593-/* indicates an error. */
6594-/* */
6595-/************************************************************************/
6596+/**
6597+ * lpfc_hba_down_prep: Perform lpfc uninitialization prior to HBA reset.
6598+ * @phba: pointer to lpfc HBA data structure.
6599+ *
6600+ * This routine will do LPFC uninitialization before the HBA is reset when
6601+ * bringing down the SLI Layer.
6602+ *
6603+ * Return codes
6604+ * 0 - success.
6605+ * Any other value - error.
6606+ **/
6607 int
6608 lpfc_hba_down_prep(struct lpfc_hba *phba)
6609 {
6610@@ -481,15 +517,17 @@ lpfc_hba_down_prep(struct lpfc_hba *phba
6611 return 0;
6612 }
6613
6614-/************************************************************************/
6615-/* */
6616-/* lpfc_hba_down_post */
6617-/* This routine will do uninitialization after the HBA is reset */
6618-/* when bringing down the SLI Layer. */
6619-/* This routine returns 0 on success. Any other return value */
6620-/* indicates an error. */
6621-/* */
6622-/************************************************************************/
6623+/**
6624+ * lpfc_hba_down_post: Perform lpfc uninitialization after HBA reset.
6625+ * @phba: pointer to lpfc HBA data structure.
6626+ *
6627+ * This routine will do uninitialization after the HBA is reset when bring
6628+ * down the SLI Layer.
6629+ *
6630+ * Return codes
6631+ * 0 - sucess.
6632+ * Any other value - error.
6633+ **/
6634 int
6635 lpfc_hba_down_post(struct lpfc_hba *phba)
6636 {
6637@@ -548,7 +586,18 @@ lpfc_hba_down_post(struct lpfc_hba *phba
6638 return 0;
6639 }
6640
6641-/* HBA heart beat timeout handler */
6642+/**
6643+ * lpfc_hb_timeout: The HBA-timer timeout handler.
6644+ * @ptr: unsigned long holds the pointer to lpfc hba data structure.
6645+ *
6646+ * This is the HBA-timer timeout handler registered to the lpfc driver. When
6647+ * this timer fires, a HBA timeout event shall be posted to the lpfc driver
6648+ * work-port-events bitmap and the worker thread is notified. This timeout
6649+ * event will be used by the worker thread to invoke the actual timeout
6650+ * handler routine, lpfc_hb_timeout_handler. Any periodical operations will
6651+ * be performed in the timeout handler and the HBA timeout event bit shall
6652+ * be cleared by the worker thread after it has taken the event bitmap out.
6653+ **/
6654 static void
6655 lpfc_hb_timeout(unsigned long ptr)
6656 {
6657@@ -557,17 +606,36 @@ lpfc_hb_timeout(unsigned long ptr)
6658 unsigned long iflag;
6659
6660 phba = (struct lpfc_hba *)ptr;
6661+
6662+ /* Check for heart beat timeout conditions */
6663 spin_lock_irqsave(&phba->pport->work_port_lock, iflag);
6664 tmo_posted = phba->pport->work_port_events & WORKER_HB_TMO;
6665 if (!tmo_posted)
6666 phba->pport->work_port_events |= WORKER_HB_TMO;
6667 spin_unlock_irqrestore(&phba->pport->work_port_lock, iflag);
6668
6669+ /* Tell the worker thread there is work to do */
6670 if (!tmo_posted)
6671 lpfc_worker_wake_up(phba);
6672 return;
6673 }
6674
6675+/**
6676+ * lpfc_hb_mbox_cmpl: The lpfc heart-beat mailbox command callback function.
6677+ * @phba: pointer to lpfc hba data structure.
6678+ * @pmboxq: pointer to the driver internal queue element for mailbox command.
6679+ *
6680+ * This is the callback function to the lpfc heart-beat mailbox command.
6681+ * If configured, the lpfc driver issues the heart-beat mailbox command to
6682+ * the HBA every LPFC_HB_MBOX_INTERVAL (current 5) seconds. At the time the
6683+ * heart-beat mailbox command is issued, the driver shall set up heart-beat
6684+ * timeout timer to LPFC_HB_MBOX_TIMEOUT (current 30) seconds and marks
6685+ * heart-beat outstanding state. Once the mailbox command comes back and
6686+ * no error conditions detected, the heart-beat mailbox command timer is
6687+ * reset to LPFC_HB_MBOX_INTERVAL seconds and the heart-beat outstanding
6688+ * state is cleared for the next heart-beat. If the timer expired with the
6689+ * heart-beat outstanding state set, the driver will put the HBA offline.
6690+ **/
6691 static void
6692 lpfc_hb_mbox_cmpl(struct lpfc_hba * phba, LPFC_MBOXQ_t * pmboxq)
6693 {
6694@@ -577,6 +645,7 @@ lpfc_hb_mbox_cmpl(struct lpfc_hba * phba
6695 phba->hb_outstanding = 0;
6696 spin_unlock_irqrestore(&phba->hbalock, drvr_flag);
6697
6698+ /* Check and reset heart-beat timer is necessary */
6699 mempool_free(pmboxq, phba->mbox_mem_pool);
6700 if (!(phba->pport->fc_flag & FC_OFFLINE_MODE) &&
6701 !(phba->link_state == LPFC_HBA_ERROR) &&
6702@@ -586,6 +655,22 @@ lpfc_hb_mbox_cmpl(struct lpfc_hba * phba
6703 return;
6704 }
6705
6706+/**
6707+ * lpfc_hb_timeout_handler: The HBA-timer timeout handler.
6708+ * @phba: pointer to lpfc hba data structure.
6709+ *
6710+ * This is the actual HBA-timer timeout handler to be invoked by the worker
6711+ * thread whenever the HBA timer fired and HBA-timeout event posted. This
6712+ * handler performs any periodic operations needed for the device. If such
6713+ * periodic event has already been attended to either in the interrupt handler
6714+ * or by processing slow-ring or fast-ring events within the HBA-timer
6715+ * timeout window (LPFC_HB_MBOX_INTERVAL), this handler just simply resets
6716+ * the timer for the next timeout period. If lpfc heart-beat mailbox command
6717+ * is configured and there is no heart-beat mailbox command outstanding, a
6718+ * heart-beat mailbox is issued and timer set properly. Otherwise, if there
6719+ * has been a heart-beat mailbox command outstanding, the HBA shall be put
6720+ * to offline.
6721+ **/
6722 void
6723 lpfc_hb_timeout_handler(struct lpfc_hba *phba)
6724 {
6725@@ -684,6 +769,13 @@ lpfc_hb_timeout_handler(struct lpfc_hba
6726 }
6727 }
6728
6729+/**
6730+ * lpfc_offline_eratt: Bring lpfc offline on hardware error attention.
6731+ * @phba: pointer to lpfc hba data structure.
6732+ *
6733+ * This routine is called to bring the HBA offline when HBA hardware error
6734+ * other than Port Error 6 has been detected.
6735+ **/
6736 static void
6737 lpfc_offline_eratt(struct lpfc_hba *phba)
6738 {
6739@@ -704,14 +796,16 @@ lpfc_offline_eratt(struct lpfc_hba *phba
6740 return;
6741 }
6742
6743-/************************************************************************/
6744-/* */
6745-/* lpfc_handle_eratt */
6746-/* This routine will handle processing a Host Attention */
6747-/* Error Status event. This will be initialized */
6748-/* as a SLI layer callback routine. */
6749-/* */
6750-/************************************************************************/
6751+/**
6752+ * lpfc_handle_eratt: The HBA hardware error handler.
6753+ * @phba: pointer to lpfc hba data structure.
6754+ *
6755+ * This routine is invoked to handle the following HBA hardware error
6756+ * conditions:
6757+ * 1 - HBA error attention interrupt
6758+ * 2 - DMA ring index out of range
6759+ * 3 - Mailbox command came back as unknown
6760+ **/
6761 void
6762 lpfc_handle_eratt(struct lpfc_hba *phba)
6763 {
6764@@ -722,6 +816,7 @@ lpfc_handle_eratt(struct lpfc_hba *phba)
6765 unsigned long temperature;
6766 struct temp_event temp_event_data;
6767 struct Scsi_Host *shost;
6768+ struct lpfc_board_event_header board_event;
6769
6770 /* If the pci channel is offline, ignore possible errors,
6771 * since we cannot communicate with the pci card anyway. */
6772@@ -731,6 +826,16 @@ lpfc_handle_eratt(struct lpfc_hba *phba)
6773 if (!phba->cfg_enable_hba_reset)
6774 return;
6775
6776+ /* Send an internal error event to mgmt application */
6777+ board_event.event_type = FC_REG_BOARD_EVENT;
6778+ board_event.subcategory = LPFC_EVENT_PORTINTERR;
6779+ shost = lpfc_shost_from_vport(phba->pport);
6780+ fc_host_post_vendor_event(shost, fc_get_event_number(),
6781+ sizeof(board_event),
6782+ (char *) &board_event,
6783+ SCSI_NL_VID_TYPE_PCI
6784+ | PCI_VENDOR_ID_EMULEX);
6785+
6786 if (phba->work_hs & HS_FFER6) {
6787 /* Re-establishing Link */
6788 lpfc_printf_log(phba, KERN_INFO, LOG_LINK_EVENT,
6789@@ -771,7 +876,7 @@ lpfc_handle_eratt(struct lpfc_hba *phba)
6790 temp_event_data.data = (uint32_t)temperature;
6791
6792 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
6793- "0459 Adapter maximum temperature exceeded "
6794+ "0406 Adapter maximum temperature exceeded "
6795 "(%ld), taking this port offline "
6796 "Data: x%x x%x x%x\n",
6797 temperature, phba->work_hs,
6798@@ -791,8 +896,8 @@ lpfc_handle_eratt(struct lpfc_hba *phba)
6799
6800 } else {
6801 /* The if clause above forces this code path when the status
6802- * failure is a value other than FFER6. Do not call the offline
6803- * twice. This is the adapter hardware error path.
6804+ * failure is a value other than FFER6. Do not call the offline
6805+ * twice. This is the adapter hardware error path.
6806 */
6807 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
6808 "0457 Adapter Hardware Error "
6809@@ -808,16 +913,16 @@ lpfc_handle_eratt(struct lpfc_hba *phba)
6810
6811 lpfc_offline_eratt(phba);
6812 }
6813+ return;
6814 }
6815
6816-/************************************************************************/
6817-/* */
6818-/* lpfc_handle_latt */
6819-/* This routine will handle processing a Host Attention */
6820-/* Link Status event. This will be initialized */
6821-/* as a SLI layer callback routine. */
6822-/* */
6823-/************************************************************************/
6824+/**
6825+ * lpfc_handle_latt: The HBA link event handler.
6826+ * @phba: pointer to lpfc hba data structure.
6827+ *
6828+ * This routine is invoked from the worker thread to handle a HBA host
6829+ * attention link event.
6830+ **/
6831 void
6832 lpfc_handle_latt(struct lpfc_hba *phba)
6833 {
6834@@ -898,12 +1003,20 @@ lpfc_handle_latt_err_exit:
6835 return;
6836 }
6837
6838-/************************************************************************/
6839-/* */
6840-/* lpfc_parse_vpd */
6841-/* This routine will parse the VPD data */
6842-/* */
6843-/************************************************************************/
6844+/**
6845+ * lpfc_parse_vpd: Parse VPD (Vital Product Data).
6846+ * @phba: pointer to lpfc hba data structure.
6847+ * @vpd: pointer to the vital product data.
6848+ * @len: length of the vital product data in bytes.
6849+ *
6850+ * This routine parses the Vital Product Data (VPD). The VPD is treated as
6851+ * an array of characters. In this routine, the ModelName, ProgramType, and
6852+ * ModelDesc, etc. fields of the phba data structure will be populated.
6853+ *
6854+ * Return codes
6855+ * 0 - pointer to the VPD passed in is NULL
6856+ * 1 - success
6857+ **/
6858 static int
6859 lpfc_parse_vpd(struct lpfc_hba *phba, uint8_t *vpd, int len)
6860 {
6861@@ -1040,12 +1153,25 @@ lpfc_parse_vpd(struct lpfc_hba *phba, ui
6862 return(1);
6863 }
6864
6865+/**
6866+ * lpfc_get_hba_model_desc: Retrieve HBA device model name and description.
6867+ * @phba: pointer to lpfc hba data structure.
6868+ * @mdp: pointer to the data structure to hold the derived model name.
6869+ * @descp: pointer to the data structure to hold the derived description.
6870+ *
6871+ * This routine retrieves HBA's description based on its registered PCI device
6872+ * ID. The @descp passed into this function points to an array of 256 chars. It
6873+ * shall be returned with the model name, maximum speed, and the host bus type.
6874+ * The @mdp passed into this function points to an array of 80 chars. When the
6875+ * function returns, the @mdp will be filled with the model name.
6876+ **/
6877 static void
6878 lpfc_get_hba_model_desc(struct lpfc_hba *phba, uint8_t *mdp, uint8_t *descp)
6879 {
6880 lpfc_vpd_t *vp;
6881 uint16_t dev_id = phba->pcidev->device;
6882 int max_speed;
6883+ int GE = 0;
6884 struct {
6885 char * name;
6886 int max_speed;
6887@@ -1177,6 +1303,19 @@ lpfc_get_hba_model_desc(struct lpfc_hba
6888 case PCI_DEVICE_ID_SAT_S:
6889 m = (typeof(m)){"LPe12000-S", max_speed, "PCIe"};
6890 break;
6891+ case PCI_DEVICE_ID_HORNET:
6892+ m = (typeof(m)){"LP21000", max_speed, "PCIe"};
6893+ GE = 1;
6894+ break;
6895+ case PCI_DEVICE_ID_PROTEUS_VF:
6896+ m = (typeof(m)) {"LPev12000", max_speed, "PCIe IOV"};
6897+ break;
6898+ case PCI_DEVICE_ID_PROTEUS_PF:
6899+ m = (typeof(m)) {"LPev12000", max_speed, "PCIe IOV"};
6900+ break;
6901+ case PCI_DEVICE_ID_PROTEUS_S:
6902+ m = (typeof(m)) {"LPemv12002-S", max_speed, "PCIe IOV"};
6903+ break;
6904 default:
6905 m = (typeof(m)){ NULL };
6906 break;
6907@@ -1186,18 +1325,25 @@ lpfc_get_hba_model_desc(struct lpfc_hba
6908 snprintf(mdp, 79,"%s", m.name);
6909 if (descp && descp[0] == '\0')
6910 snprintf(descp, 255,
6911- "Emulex %s %dGb %s Fibre Channel Adapter",
6912- m.name, m.max_speed, m.bus);
6913+ "Emulex %s %d%s %s %s",
6914+ m.name, m.max_speed,
6915+ (GE) ? "GE" : "Gb",
6916+ m.bus,
6917+ (GE) ? "FCoE Adapter" : "Fibre Channel Adapter");
6918 }
6919
6920-/**************************************************/
6921-/* lpfc_post_buffer */
6922-/* */
6923-/* This routine will post count buffers to the */
6924-/* ring with the QUE_RING_BUF_CN command. This */
6925-/* allows 3 buffers / command to be posted. */
6926-/* Returns the number of buffers NOT posted. */
6927-/**************************************************/
6928+/**
6929+ * lpfc_post_buffer: Post IOCB(s) with DMA buffer descriptor(s) to a IOCB ring.
6930+ * @phba: pointer to lpfc hba data structure.
6931+ * @pring: pointer to a IOCB ring.
6932+ * @cnt: the number of IOCBs to be posted to the IOCB ring.
6933+ *
6934+ * This routine posts a given number of IOCBs with the associated DMA buffer
6935+ * descriptors specified by the cnt argument to the given IOCB ring.
6936+ *
6937+ * Return codes
6938+ * The number of IOCBs NOT able to be posted to the IOCB ring.
6939+ **/
6940 int
6941 lpfc_post_buffer(struct lpfc_hba *phba, struct lpfc_sli_ring *pring, int cnt)
6942 {
6943@@ -1287,12 +1433,17 @@ lpfc_post_buffer(struct lpfc_hba *phba,
6944 return 0;
6945 }
6946
6947-/************************************************************************/
6948-/* */
6949-/* lpfc_post_rcv_buf */
6950-/* This routine post initial rcv buffers to the configured rings */
6951-/* */
6952-/************************************************************************/
6953+/**
6954+ * lpfc_post_rcv_buf: Post the initial receive IOCB buffers to ELS ring.
6955+ * @phba: pointer to lpfc hba data structure.
6956+ *
6957+ * This routine posts initial receive IOCB buffers to the ELS ring. The
6958+ * current number of initial IOCB buffers specified by LPFC_BUF_RING0 is
6959+ * set to 64 IOCBs.
6960+ *
6961+ * Return codes
6962+ * 0 - success (currently always success)
6963+ **/
6964 static int
6965 lpfc_post_rcv_buf(struct lpfc_hba *phba)
6966 {
6967@@ -1307,11 +1458,13 @@ lpfc_post_rcv_buf(struct lpfc_hba *phba)
6968
6969 #define S(N,V) (((V)<<(N))|((V)>>(32-(N))))
6970
6971-/************************************************************************/
6972-/* */
6973-/* lpfc_sha_init */
6974-/* */
6975-/************************************************************************/
6976+/**
6977+ * lpfc_sha_init: Set up initial array of hash table entries.
6978+ * @HashResultPointer: pointer to an array as hash table.
6979+ *
6980+ * This routine sets up the initial values to the array of hash table entries
6981+ * for the LC HBAs.
6982+ **/
6983 static void
6984 lpfc_sha_init(uint32_t * HashResultPointer)
6985 {
6986@@ -1322,11 +1475,16 @@ lpfc_sha_init(uint32_t * HashResultPoint
6987 HashResultPointer[4] = 0xC3D2E1F0;
6988 }
6989
6990-/************************************************************************/
6991-/* */
6992-/* lpfc_sha_iterate */
6993-/* */
6994-/************************************************************************/
6995+/**
6996+ * lpfc_sha_iterate: Iterate initial hash table with the working hash table.
6997+ * @HashResultPointer: pointer to an initial/result hash table.
6998+ * @HashWorkingPointer: pointer to an working hash table.
6999+ *
7000+ * This routine iterates an initial hash table pointed by @HashResultPointer
7001+ * with the values from the working hash table pointeed by @HashWorkingPointer.
7002+ * The results are putting back to the initial hash table, returned through
7003+ * the @HashResultPointer as the result hash table.
7004+ **/
7005 static void
7006 lpfc_sha_iterate(uint32_t * HashResultPointer, uint32_t * HashWorkingPointer)
7007 {
7008@@ -1374,22 +1532,29 @@ lpfc_sha_iterate(uint32_t * HashResultPo
7009
7010 }
7011
7012-/************************************************************************/
7013-/* */
7014-/* lpfc_challenge_key */
7015-/* */
7016-/************************************************************************/
7017+/**
7018+ * lpfc_challenge_key: Create challenge key based on WWPN of the HBA.
7019+ * @RandomChallenge: pointer to the entry of host challenge random number array.
7020+ * @HashWorking: pointer to the entry of the working hash array.
7021+ *
7022+ * This routine calculates the working hash array referred by @HashWorking
7023+ * from the challenge random numbers associated with the host, referred by
7024+ * @RandomChallenge. The result is put into the entry of the working hash
7025+ * array and returned by reference through @HashWorking.
7026+ **/
7027 static void
7028 lpfc_challenge_key(uint32_t * RandomChallenge, uint32_t * HashWorking)
7029 {
7030 *HashWorking = (*RandomChallenge ^ *HashWorking);
7031 }
7032
7033-/************************************************************************/
7034-/* */
7035-/* lpfc_hba_init */
7036-/* */
7037-/************************************************************************/
7038+/**
7039+ * lpfc_hba_init: Perform special handling for LC HBA initialization.
7040+ * @phba: pointer to lpfc hba data structure.
7041+ * @hbainit: pointer to an array of unsigned 32-bit integers.
7042+ *
7043+ * This routine performs the special handling for LC HBA initialization.
7044+ **/
7045 void
7046 lpfc_hba_init(struct lpfc_hba *phba, uint32_t *hbainit)
7047 {
7048@@ -1412,6 +1577,15 @@ lpfc_hba_init(struct lpfc_hba *phba, uin
7049 kfree(HashWorking);
7050 }
7051
7052+/**
7053+ * lpfc_cleanup: Performs vport cleanups before deleting a vport.
7054+ * @vport: pointer to a virtual N_Port data structure.
7055+ *
7056+ * This routine performs the necessary cleanups before deleting the @vport.
7057+ * It invokes the discovery state machine to perform necessary state
7058+ * transitions and to release the ndlps associated with the @vport. Note,
7059+ * the physical port is treated as @vport 0.
7060+ **/
7061 void
7062 lpfc_cleanup(struct lpfc_vport *vport)
7063 {
7064@@ -1459,14 +1633,6 @@ lpfc_cleanup(struct lpfc_vport *vport)
7065 lpfc_disc_state_machine(vport, ndlp, NULL,
7066 NLP_EVT_DEVICE_RM);
7067
7068- /* nlp_type zero is not defined, nlp_flag zero also not defined,
7069- * nlp_state is unused, this happens when
7070- * an initiator has logged
7071- * into us so cleanup this ndlp.
7072- */
7073- if ((ndlp->nlp_type == 0) && (ndlp->nlp_flag == 0) &&
7074- (ndlp->nlp_state == 0))
7075- lpfc_nlp_put(ndlp);
7076 }
7077
7078 /* At this point, ALL ndlp's should be gone
7079@@ -1482,7 +1648,7 @@ lpfc_cleanup(struct lpfc_vport *vport)
7080 &vport->fc_nodes, nlp_listp) {
7081 lpfc_printf_vlog(ndlp->vport, KERN_ERR,
7082 LOG_NODE,
7083- "0282: did:x%x ndlp:x%p "
7084+ "0282 did:x%x ndlp:x%p "
7085 "usgmap:x%x refcnt:%d\n",
7086 ndlp->nlp_DID, (void *)ndlp,
7087 ndlp->nlp_usg_map,
7088@@ -1498,6 +1664,14 @@ lpfc_cleanup(struct lpfc_vport *vport)
7089 return;
7090 }
7091
7092+/**
7093+ * lpfc_stop_vport_timers: Stop all the timers associated with a vport.
7094+ * @vport: pointer to a virtual N_Port data structure.
7095+ *
7096+ * This routine stops all the timers associated with a @vport. This function
7097+ * is invoked before disabling or deleting a @vport. Note that the physical
7098+ * port is treated as @vport 0.
7099+ **/
7100 void
7101 lpfc_stop_vport_timers(struct lpfc_vport *vport)
7102 {
7103@@ -1507,6 +1681,13 @@ lpfc_stop_vport_timers(struct lpfc_vport
7104 return;
7105 }
7106
7107+/**
7108+ * lpfc_stop_phba_timers: Stop all the timers associated with an HBA.
7109+ * @phba: pointer to lpfc hba data structure.
7110+ *
7111+ * This routine stops all the timers associated with a HBA. This function is
7112+ * invoked before either putting a HBA offline or unloading the driver.
7113+ **/
7114 static void
7115 lpfc_stop_phba_timers(struct lpfc_hba *phba)
7116 {
7117@@ -1516,9 +1697,20 @@ lpfc_stop_phba_timers(struct lpfc_hba *p
7118 del_timer_sync(&phba->fabric_block_timer);
7119 phba->hb_outstanding = 0;
7120 del_timer_sync(&phba->hb_tmofunc);
7121+ del_timer_sync(&phba->eratt_poll);
7122 return;
7123 }
7124
7125+/**
7126+ * lpfc_block_mgmt_io: Mark a HBA's management interface as blocked.
7127+ * @phba: pointer to lpfc hba data structure.
7128+ *
7129+ * This routine marks a HBA's management interface as blocked. Once the HBA's
7130+ * management interface is marked as blocked, all the user space access to
7131+ * the HBA, whether they are from sysfs interface or libdfc interface will
7132+ * all be blocked. The HBA is set to block the management interface when the
7133+ * driver prepares the HBA interface for online or offline.
7134+ **/
7135 static void
7136 lpfc_block_mgmt_io(struct lpfc_hba * phba)
7137 {
7138@@ -1529,6 +1721,18 @@ lpfc_block_mgmt_io(struct lpfc_hba * phb
7139 spin_unlock_irqrestore(&phba->hbalock, iflag);
7140 }
7141
7142+/**
7143+ * lpfc_online: Initialize and bring a HBA online.
7144+ * @phba: pointer to lpfc hba data structure.
7145+ *
7146+ * This routine initializes the HBA and brings a HBA online. During this
7147+ * process, the management interface is blocked to prevent user space access
7148+ * to the HBA interfering with the driver initialization.
7149+ *
7150+ * Return codes
7151+ * 0 - successful
7152+ * 1 - failed
7153+ **/
7154 int
7155 lpfc_online(struct lpfc_hba *phba)
7156 {
7157@@ -1574,6 +1778,17 @@ lpfc_online(struct lpfc_hba *phba)
7158 return 0;
7159 }
7160
7161+/**
7162+ * lpfc_unblock_mgmt_io: Mark a HBA's management interface to be not blocked.
7163+ * @phba: pointer to lpfc hba data structure.
7164+ *
7165+ * This routine marks a HBA's management interface as not blocked. Once the
7166+ * HBA's management interface is marked as not blocked, all the user space
7167+ * access to the HBA, whether they are from sysfs interface or libdfc
7168+ * interface will be allowed. The HBA is set to block the management interface
7169+ * when the driver prepares the HBA interface for online or offline and then
7170+ * set to unblock the management interface afterwards.
7171+ **/
7172 void
7173 lpfc_unblock_mgmt_io(struct lpfc_hba * phba)
7174 {
7175@@ -1584,6 +1799,14 @@ lpfc_unblock_mgmt_io(struct lpfc_hba * p
7176 spin_unlock_irqrestore(&phba->hbalock, iflag);
7177 }
7178
7179+/**
7180+ * lpfc_offline_prep: Prepare a HBA to be brought offline.
7181+ * @phba: pointer to lpfc hba data structure.
7182+ *
7183+ * This routine is invoked to prepare a HBA to be brought offline. It performs
7184+ * unregistration login to all the nodes on all vports and flushes the mailbox
7185+ * queue to make it ready to be brought offline.
7186+ **/
7187 void
7188 lpfc_offline_prep(struct lpfc_hba * phba)
7189 {
7190@@ -1633,6 +1856,14 @@ lpfc_offline_prep(struct lpfc_hba * phba
7191 lpfc_sli_flush_mbox_queue(phba);
7192 }
7193
7194+/**
7195+ * lpfc_offline: Bring a HBA offline.
7196+ * @phba: pointer to lpfc hba data structure.
7197+ *
7198+ * This routine actually brings a HBA offline. It stops all the timers
7199+ * associated with the HBA, brings down the SLI layer, and eventually
7200+ * marks the HBA as in offline state for the upper layer protocol.
7201+ **/
7202 void
7203 lpfc_offline(struct lpfc_hba *phba)
7204 {
7205@@ -1670,12 +1901,17 @@ lpfc_offline(struct lpfc_hba *phba)
7206 lpfc_destroy_vport_work_array(phba, vports);
7207 }
7208
7209-/******************************************************************************
7210-* Function name: lpfc_scsi_free
7211-*
7212-* Description: Called from lpfc_pci_remove_one free internal driver resources
7213-*
7214-******************************************************************************/
7215+/**
7216+ * lpfc_scsi_free: Free all the SCSI buffers and IOCBs from driver lists.
7217+ * @phba: pointer to lpfc hba data structure.
7218+ *
7219+ * This routine is to free all the SCSI buffers and IOCBs from the driver
7220+ * list back to kernel. It is called from lpfc_pci_remove_one to free
7221+ * the internal resources before the device is removed from the system.
7222+ *
7223+ * Return codes
7224+ * 0 - successful (for now, it always returns 0)
7225+ **/
7226 static int
7227 lpfc_scsi_free(struct lpfc_hba *phba)
7228 {
7229@@ -1704,6 +1940,22 @@ lpfc_scsi_free(struct lpfc_hba *phba)
7230 return 0;
7231 }
7232
7233+/**
7234+ * lpfc_create_port: Create an FC port.
7235+ * @phba: pointer to lpfc hba data structure.
7236+ * @instance: a unique integer ID to this FC port.
7237+ * @dev: pointer to the device data structure.
7238+ *
7239+ * This routine creates a FC port for the upper layer protocol. The FC port
7240+ * can be created on top of either a physical port or a virtual port provided
7241+ * by the HBA. This routine also allocates a SCSI host data structure (shost)
7242+ * and associates the FC port created before adding the shost into the SCSI
7243+ * layer.
7244+ *
7245+ * Return codes
7246+ * @vport - pointer to the virtual N_Port data structure.
7247+ * NULL - port create failed.
7248+ **/
7249 struct lpfc_vport *
7250 lpfc_create_port(struct lpfc_hba *phba, int instance, struct device *dev)
7251 {
7252@@ -1777,6 +2029,13 @@ out:
7253 return NULL;
7254 }
7255
7256+/**
7257+ * destroy_port: Destroy an FC port.
7258+ * @vport: pointer to an lpfc virtual N_Port data structure.
7259+ *
7260+ * This routine destroys a FC port from the upper layer protocol. All the
7261+ * resources associated with the port are released.
7262+ **/
7263 void
7264 destroy_port(struct lpfc_vport *vport)
7265 {
7266@@ -1797,6 +2056,16 @@ destroy_port(struct lpfc_vport *vport)
7267 return;
7268 }
7269
7270+/**
7271+ * lpfc_get_instance: Get a unique integer ID.
7272+ *
7273+ * This routine allocates a unique integer ID from lpfc_hba_index pool. It
7274+ * uses the kernel idr facility to perform the task.
7275+ *
7276+ * Return codes:
7277+ * instance - a unique integer ID allocated as the new instance.
7278+ * -1 - lpfc get instance failed.
7279+ **/
7280 int
7281 lpfc_get_instance(void)
7282 {
7283@@ -1810,11 +2079,21 @@ lpfc_get_instance(void)
7284 return instance;
7285 }
7286
7287-/*
7288- * Note: there is no scan_start function as adapter initialization
7289- * will have asynchronously kicked off the link initialization.
7290- */
7291-
7292+/**
7293+ * lpfc_scan_finished: method for SCSI layer to detect whether scan is done.
7294+ * @shost: pointer to SCSI host data structure.
7295+ * @time: elapsed time of the scan in jiffies.
7296+ *
7297+ * This routine is called by the SCSI layer with a SCSI host to determine
7298+ * whether the scan host is finished.
7299+ *
7300+ * Note: there is no scan_start function as adapter initialization will have
7301+ * asynchronously kicked off the link initialization.
7302+ *
7303+ * Return codes
7304+ * 0 - SCSI host scan is not over yet.
7305+ * 1 - SCSI host scan is over.
7306+ **/
7307 int lpfc_scan_finished(struct Scsi_Host *shost, unsigned long time)
7308 {
7309 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
7310@@ -1858,6 +2137,13 @@ finished:
7311 return stat;
7312 }
7313
7314+/**
7315+ * lpfc_host_attrib_init: Initialize SCSI host attributes on a FC port.
7316+ * @shost: pointer to SCSI host data structure.
7317+ *
7318+ * This routine initializes a given SCSI host attributes on a FC port. The
7319+ * SCSI host can be either on top of a physical port or a virtual port.
7320+ **/
7321 void lpfc_host_attrib_init(struct Scsi_Host *shost)
7322 {
7323 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
7324@@ -1906,42 +2192,157 @@ void lpfc_host_attrib_init(struct Scsi_H
7325 spin_unlock_irq(shost->host_lock);
7326 }
7327
7328+/**
7329+ * lpfc_enable_msix: Enable MSI-X interrupt mode.
7330+ * @phba: pointer to lpfc hba data structure.
7331+ *
7332+ * This routine is invoked to enable the MSI-X interrupt vectors. The kernel
7333+ * function pci_enable_msix() is called to enable the MSI-X vectors. Note that
7334+ * pci_enable_msix(), once invoked, enables either all or nothing, depending
7335+ * on the current availability of PCI vector resources. The device driver is
7336+ * responsible for calling the individual request_irq() to register each MSI-X
7337+ * vector with a interrupt handler, which is done in this function. Note that
7338+ * later when device is unloading, the driver should always call free_irq()
7339+ * on all MSI-X vectors it has done request_irq() on before calling
7340+ * pci_disable_msix(). Failure to do so results in a BUG_ON() and a device
7341+ * will be left with MSI-X enabled and leaks its vectors.
7342+ *
7343+ * Return codes
7344+ * 0 - sucessful
7345+ * other values - error
7346+ **/
7347 static int
7348 lpfc_enable_msix(struct lpfc_hba *phba)
7349 {
7350- int error;
7351+ int rc, i;
7352+ LPFC_MBOXQ_t *pmb;
7353
7354- phba->msix_entries[0].entry = 0;
7355- phba->msix_entries[0].vector = 0;
7356+ /* Set up MSI-X multi-message vectors */
7357+ for (i = 0; i < LPFC_MSIX_VECTORS; i++)
7358+ phba->msix_entries[i].entry = i;
7359
7360- error = pci_enable_msix(phba->pcidev, phba->msix_entries,
7361+ /* Configure MSI-X capability structure */
7362+ rc = pci_enable_msix(phba->pcidev, phba->msix_entries,
7363 ARRAY_SIZE(phba->msix_entries));
7364- if (error) {
7365+ if (rc) {
7366 lpfc_printf_log(phba, KERN_INFO, LOG_INIT,
7367 "0420 Enable MSI-X failed (%d), continuing "
7368- "with MSI\n", error);
7369- pci_disable_msix(phba->pcidev);
7370- return error;
7371+ "with MSI\n", rc);
7372+ goto msi_fail_out;
7373+ } else
7374+ for (i = 0; i < LPFC_MSIX_VECTORS; i++)
7375+ lpfc_printf_log(phba, KERN_INFO, LOG_INIT,
7376+ "0477 MSI-X entry[%d]: vector=x%x "
7377+ "message=%d\n", i,
7378+ phba->msix_entries[i].vector,
7379+ phba->msix_entries[i].entry);
7380+ /*
7381+ * Assign MSI-X vectors to interrupt handlers
7382+ */
7383+
7384+ /* vector-0 is associated to slow-path handler */
7385+ rc = request_irq(phba->msix_entries[0].vector, &lpfc_sp_intr_handler,
7386+ IRQF_SHARED, LPFC_SP_DRIVER_HANDLER_NAME, phba);
7387+ if (rc) {
7388+ lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
7389+ "0421 MSI-X slow-path request_irq failed "
7390+ "(%d), continuing with MSI\n", rc);
7391+ goto msi_fail_out;
7392 }
7393
7394- error = request_irq(phba->msix_entries[0].vector, lpfc_intr_handler, 0,
7395- LPFC_DRIVER_NAME, phba);
7396- if (error) {
7397+ /* vector-1 is associated to fast-path handler */
7398+ rc = request_irq(phba->msix_entries[1].vector, &lpfc_fp_intr_handler,
7399+ IRQF_SHARED, LPFC_FP_DRIVER_HANDLER_NAME, phba);
7400+
7401+ if (rc) {
7402 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
7403- "0421 MSI-X request_irq failed (%d), "
7404- "continuing with MSI\n", error);
7405- pci_disable_msix(phba->pcidev);
7406+ "0429 MSI-X fast-path request_irq failed "
7407+ "(%d), continuing with MSI\n", rc);
7408+ goto irq_fail_out;
7409 }
7410- return error;
7411+
7412+ /*
7413+ * Configure HBA MSI-X attention conditions to messages
7414+ */
7415+ pmb = (LPFC_MBOXQ_t *) mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
7416+
7417+ if (!pmb) {
7418+ rc = -ENOMEM;
7419+ lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
7420+ "0474 Unable to allocate memory for issuing "
7421+ "MBOX_CONFIG_MSI command\n");
7422+ goto mem_fail_out;
7423+ }
7424+ rc = lpfc_config_msi(phba, pmb);
7425+ if (rc)
7426+ goto mbx_fail_out;
7427+ rc = lpfc_sli_issue_mbox(phba, pmb, MBX_POLL);
7428+ if (rc != MBX_SUCCESS) {
7429+ lpfc_printf_log(phba, KERN_ERR, LOG_MBOX,
7430+ "0351 Config MSI mailbox command failed, "
7431+ "mbxCmd x%x, mbxStatus x%x\n",
7432+ pmb->mb.mbxCommand, pmb->mb.mbxStatus);
7433+ goto mbx_fail_out;
7434+ }
7435+
7436+ /* Free memory allocated for mailbox command */
7437+ mempool_free(pmb, phba->mbox_mem_pool);
7438+ return rc;
7439+
7440+mbx_fail_out:
7441+ /* Free memory allocated for mailbox command */
7442+ mempool_free(pmb, phba->mbox_mem_pool);
7443+
7444+mem_fail_out:
7445+ /* free the irq already requested */
7446+ free_irq(phba->msix_entries[1].vector, phba);
7447+
7448+irq_fail_out:
7449+ /* free the irq already requested */
7450+ free_irq(phba->msix_entries[0].vector, phba);
7451+
7452+msi_fail_out:
7453+ /* Unconfigure MSI-X capability structure */
7454+ pci_disable_msix(phba->pcidev);
7455+ return rc;
7456 }
7457
7458+/**
7459+ * lpfc_disable_msix: Disable MSI-X interrupt mode.
7460+ * @phba: pointer to lpfc hba data structure.
7461+ *
7462+ * This routine is invoked to release the MSI-X vectors and then disable the
7463+ * MSI-X interrupt mode.
7464+ **/
7465 static void
7466 lpfc_disable_msix(struct lpfc_hba *phba)
7467 {
7468- free_irq(phba->msix_entries[0].vector, phba);
7469+ int i;
7470+
7471+ /* Free up MSI-X multi-message vectors */
7472+ for (i = 0; i < LPFC_MSIX_VECTORS; i++)
7473+ free_irq(phba->msix_entries[i].vector, phba);
7474+ /* Disable MSI-X */
7475 pci_disable_msix(phba->pcidev);
7476 }
7477
7478+/**
7479+ * lpfc_pci_probe_one: lpfc PCI probe func to register device to PCI subsystem.
7480+ * @pdev: pointer to PCI device
7481+ * @pid: pointer to PCI device identifier
7482+ *
7483+ * This routine is to be registered to the kernel's PCI subsystem. When an
7484+ * Emulex HBA is presented in PCI bus, the kernel PCI subsystem looks at
7485+ * PCI device-specific information of the device and driver to see if the
7486+ * driver state that it can support this kind of device. If the match is
7487+ * successful, the driver core invokes this routine. If this routine
7488+ * determines it can claim the HBA, it does all the initialization that it
7489+ * needs to do to handle the HBA properly.
7490+ *
7491+ * Return code
7492+ * 0 - driver can claim the device
7493+ * negative value - driver can not claim the device
7494+ **/
7495 static int __devinit
7496 lpfc_pci_probe_one(struct pci_dev *pdev, const struct pci_device_id *pid)
7497 {
7498@@ -1956,6 +2357,7 @@ lpfc_pci_probe_one(struct pci_dev *pdev,
7499 int i, hbq_count;
7500 uint16_t iotag;
7501 int bars = pci_select_bars(pdev, IORESOURCE_MEM);
7502+ struct lpfc_adapter_event_header adapter_event;
7503
7504 if (pci_enable_device_mem(pdev))
7505 goto out;
7506@@ -1966,6 +2368,7 @@ lpfc_pci_probe_one(struct pci_dev *pdev,
7507 if (!phba)
7508 goto out_release_regions;
7509
7510+ atomic_set(&phba->fast_event_count, 0);
7511 spin_lock_init(&phba->hbalock);
7512
7513 /* Initialize ndlp management spinlock */
7514@@ -1978,6 +2381,7 @@ lpfc_pci_probe_one(struct pci_dev *pdev,
7515 goto out_free_phba;
7516
7517 INIT_LIST_HEAD(&phba->port_list);
7518+ init_waitqueue_head(&phba->wait_4_mlo_m_q);
7519 /*
7520 * Get all the module params for configuring this host and then
7521 * establish the host.
7522@@ -2000,6 +2404,9 @@ lpfc_pci_probe_one(struct pci_dev *pdev,
7523 init_timer(&phba->fabric_block_timer);
7524 phba->fabric_block_timer.function = lpfc_fabric_block_timeout;
7525 phba->fabric_block_timer.data = (unsigned long) phba;
7526+ init_timer(&phba->eratt_poll);
7527+ phba->eratt_poll.function = lpfc_poll_eratt;
7528+ phba->eratt_poll.data = (unsigned long) phba;
7529
7530 pci_set_master(pdev);
7531 pci_try_set_mwi(pdev);
7532@@ -2019,7 +2426,7 @@ lpfc_pci_probe_one(struct pci_dev *pdev,
7533 bar2map_len = pci_resource_len(phba->pcidev, 2);
7534
7535 /* Map HBA SLIM to a kernel virtual address. */
7536- phba->slim_memmap_p = ioremap(phba->pci_bar0_map, bar0map_len);
7537+ phba->slim_memmap_p = ioremap(phba->pci_bar0_map, bar0map_len);
7538 if (!phba->slim_memmap_p) {
7539 error = -ENODEV;
7540 dev_printk(KERN_ERR, &pdev->dev,
7541@@ -2037,12 +2444,18 @@ lpfc_pci_probe_one(struct pci_dev *pdev,
7542 }
7543
7544 /* Allocate memory for SLI-2 structures */
7545- phba->slim2p = dma_alloc_coherent(&phba->pcidev->dev, SLI2_SLIM_SIZE,
7546- &phba->slim2p_mapping, GFP_KERNEL);
7547- if (!phba->slim2p)
7548+ phba->slim2p.virt = dma_alloc_coherent(&phba->pcidev->dev,
7549+ SLI2_SLIM_SIZE,
7550+ &phba->slim2p.phys,
7551+ GFP_KERNEL);
7552+ if (!phba->slim2p.virt)
7553 goto out_iounmap;
7554
7555- memset(phba->slim2p, 0, SLI2_SLIM_SIZE);
7556+ memset(phba->slim2p.virt, 0, SLI2_SLIM_SIZE);
7557+ phba->mbox = phba->slim2p.virt + offsetof(struct lpfc_sli2_slim, mbx);
7558+ phba->pcb = (phba->slim2p.virt + offsetof(struct lpfc_sli2_slim, pcb));
7559+ phba->IOCBs = (phba->slim2p.virt +
7560+ offsetof(struct lpfc_sli2_slim, IOCBs));
7561
7562 phba->hbqslimp.virt = dma_alloc_coherent(&phba->pcidev->dev,
7563 lpfc_sli_hbq_size(),
7564@@ -2111,7 +2524,7 @@ lpfc_pci_probe_one(struct pci_dev *pdev,
7565 phba->fc_arbtov = FF_DEF_ARBTOV;
7566
7567 INIT_LIST_HEAD(&phba->work_list);
7568- phba->work_ha_mask = (HA_ERATT|HA_MBATT|HA_LATT);
7569+ phba->work_ha_mask = (HA_ERATT | HA_MBATT | HA_LATT);
7570 phba->work_ha_mask |= (HA_RXMASK << (LPFC_ELS_RING * 4));
7571
7572 /* Initialize the wait queue head for the kernel thread */
7573@@ -2146,21 +2559,42 @@ lpfc_pci_probe_one(struct pci_dev *pdev,
7574 pci_set_drvdata(pdev, shost);
7575 phba->intr_type = NONE;
7576
7577+ phba->MBslimaddr = phba->slim_memmap_p;
7578+ phba->HAregaddr = phba->ctrl_regs_memmap_p + HA_REG_OFFSET;
7579+ phba->CAregaddr = phba->ctrl_regs_memmap_p + CA_REG_OFFSET;
7580+ phba->HSregaddr = phba->ctrl_regs_memmap_p + HS_REG_OFFSET;
7581+ phba->HCregaddr = phba->ctrl_regs_memmap_p + HC_REG_OFFSET;
7582+
7583+ /* Configure and enable interrupt */
7584 if (phba->cfg_use_msi == 2) {
7585- error = lpfc_enable_msix(phba);
7586- if (!error)
7587- phba->intr_type = MSIX;
7588+ /* Need to issue conf_port mbox cmd before conf_msi mbox cmd */
7589+ error = lpfc_sli_config_port(phba, 3);
7590+ if (error)
7591+ lpfc_printf_log(phba, KERN_INFO, LOG_INIT,
7592+ "0427 Firmware not capable of SLI 3 mode.\n");
7593+ else {
7594+ lpfc_printf_log(phba, KERN_INFO, LOG_INIT,
7595+ "0426 Firmware capable of SLI 3 mode.\n");
7596+ /* Now, try to enable MSI-X interrupt mode */
7597+ error = lpfc_enable_msix(phba);
7598+ if (!error) {
7599+ phba->intr_type = MSIX;
7600+ lpfc_printf_log(phba, KERN_INFO, LOG_INIT,
7601+ "0430 enable MSI-X mode.\n");
7602+ }
7603+ }
7604 }
7605
7606 /* Fallback to MSI if MSI-X initialization failed */
7607 if (phba->cfg_use_msi >= 1 && phba->intr_type == NONE) {
7608 retval = pci_enable_msi(phba->pcidev);
7609- if (!retval)
7610+ if (!retval) {
7611 phba->intr_type = MSI;
7612- else
7613 lpfc_printf_log(phba, KERN_INFO, LOG_INIT,
7614- "0452 Enable MSI failed, continuing "
7615- "with IRQ\n");
7616+ "0473 enable MSI mode.\n");
7617+ } else
7618+ lpfc_printf_log(phba, KERN_INFO, LOG_INIT,
7619+ "0452 enable IRQ mode.\n");
7620 }
7621
7622 /* MSI-X is the only case the doesn't need to call request_irq */
7623@@ -2176,18 +2610,16 @@ lpfc_pci_probe_one(struct pci_dev *pdev,
7624 phba->intr_type = INTx;
7625 }
7626
7627- phba->MBslimaddr = phba->slim_memmap_p;
7628- phba->HAregaddr = phba->ctrl_regs_memmap_p + HA_REG_OFFSET;
7629- phba->CAregaddr = phba->ctrl_regs_memmap_p + CA_REG_OFFSET;
7630- phba->HSregaddr = phba->ctrl_regs_memmap_p + HS_REG_OFFSET;
7631- phba->HCregaddr = phba->ctrl_regs_memmap_p + HC_REG_OFFSET;
7632-
7633 if (lpfc_alloc_sysfs_attr(vport)) {
7634+ lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
7635+ "1476 Failed to allocate sysfs attr\n");
7636 error = -ENOMEM;
7637 goto out_free_irq;
7638 }
7639
7640 if (lpfc_sli_hba_setup(phba)) {
7641+ lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
7642+ "1477 Failed to set up hba\n");
7643 error = -ENODEV;
7644 goto out_remove_device;
7645 }
7646@@ -2206,6 +2638,16 @@ lpfc_pci_probe_one(struct pci_dev *pdev,
7647 spin_unlock_irq(shost->host_lock);
7648 }
7649
7650+ lpfc_printf_log(phba, KERN_INFO, LOG_INIT,
7651+ "0428 Perform SCSI scan\n");
7652+ /* Send board arrival event to upper layer */
7653+ adapter_event.event_type = FC_REG_ADAPTER_EVENT;
7654+ adapter_event.subcategory = LPFC_EVENT_ARRIVAL;
7655+ fc_host_post_vendor_event(shost, fc_get_event_number(),
7656+ sizeof(adapter_event),
7657+ (char *) &adapter_event,
7658+ SCSI_NL_VID_TYPE_PCI | PCI_VENDOR_ID_EMULEX);
7659+
7660 scsi_scan_host(shost);
7661
7662 return 0;
7663@@ -2238,11 +2680,11 @@ out_free_iocbq:
7664 }
7665 lpfc_mem_free(phba);
7666 out_free_hbqslimp:
7667- dma_free_coherent(&pdev->dev, lpfc_sli_hbq_size(), phba->hbqslimp.virt,
7668- phba->hbqslimp.phys);
7669+ dma_free_coherent(&pdev->dev, lpfc_sli_hbq_size(),
7670+ phba->hbqslimp.virt, phba->hbqslimp.phys);
7671 out_free_slim:
7672- dma_free_coherent(&pdev->dev, SLI2_SLIM_SIZE, phba->slim2p,
7673- phba->slim2p_mapping);
7674+ dma_free_coherent(&pdev->dev, SLI2_SLIM_SIZE,
7675+ phba->slim2p.virt, phba->slim2p.phys);
7676 out_iounmap:
7677 iounmap(phba->ctrl_regs_memmap_p);
7678 out_iounmap_slim:
7679@@ -2262,6 +2704,14 @@ out:
7680 return error;
7681 }
7682
7683+/**
7684+ * lpfc_pci_remove_one: lpfc PCI func to unregister device from PCI subsystem.
7685+ * @pdev: pointer to PCI device
7686+ *
7687+ * This routine is to be registered to the kernel's PCI subsystem. When an
7688+ * Emulex HBA is removed from PCI bus. It perform all the necessary cleanup
7689+ * for the HBA device to be removed from the PCI subsystem properly.
7690+ **/
7691 static void __devexit
7692 lpfc_pci_remove_one(struct pci_dev *pdev)
7693 {
7694@@ -2316,12 +2766,12 @@ lpfc_pci_remove_one(struct pci_dev *pdev
7695 lpfc_scsi_free(phba);
7696 lpfc_mem_free(phba);
7697
7698- dma_free_coherent(&pdev->dev, lpfc_sli_hbq_size(), phba->hbqslimp.virt,
7699- phba->hbqslimp.phys);
7700+ dma_free_coherent(&pdev->dev, lpfc_sli_hbq_size(),
7701+ phba->hbqslimp.virt, phba->hbqslimp.phys);
7702
7703 /* Free resources associated with SLI2 interface */
7704 dma_free_coherent(&pdev->dev, SLI2_SLIM_SIZE,
7705- phba->slim2p, phba->slim2p_mapping);
7706+ phba->slim2p.virt, phba->slim2p.phys);
7707
7708 /* unmap adapter SLIM and Control Registers */
7709 iounmap(phba->ctrl_regs_memmap_p);
7710@@ -2336,13 +2786,21 @@ lpfc_pci_remove_one(struct pci_dev *pdev
7711 }
7712
7713 /**
7714- * lpfc_io_error_detected - called when PCI error is detected
7715- * @pdev: Pointer to PCI device
7716- * @state: The current pci conneection state
7717+ * lpfc_io_error_detected: Driver method for handling PCI I/O error detected.
7718+ * @pdev: pointer to PCI device.
7719+ * @state: the current PCI connection state.
7720 *
7721- * This function is called after a PCI bus error affecting
7722- * this device has been detected.
7723- */
7724+ * This routine is registered to the PCI subsystem for error handling. This
7725+ * function is called by the PCI subsystem after a PCI bus error affecting
7726+ * this device has been detected. When this function is invoked, it will
7727+ * need to stop all the I/Os and interrupt(s) to the device. Once that is
7728+ * done, it will return PCI_ERS_RESULT_NEED_RESET for the PCI subsystem to
7729+ * perform proper recovery as desired.
7730+ *
7731+ * Return codes
7732+ * PCI_ERS_RESULT_NEED_RESET - need to reset before recovery
7733+ * PCI_ERS_RESULT_DISCONNECT - device could not be recovered
7734+ **/
7735 static pci_ers_result_t lpfc_io_error_detected(struct pci_dev *pdev,
7736 pci_channel_state_t state)
7737 {
7738@@ -2351,8 +2809,15 @@ static pci_ers_result_t lpfc_io_error_de
7739 struct lpfc_sli *psli = &phba->sli;
7740 struct lpfc_sli_ring *pring;
7741
7742- if (state == pci_channel_io_perm_failure)
7743+ if (state == pci_channel_io_perm_failure) {
7744+ lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
7745+ "0472 PCI channel I/O permanent failure\n");
7746+ /* Block all SCSI devices' I/Os on the host */
7747+ lpfc_scsi_dev_block(phba);
7748+ /* Clean up all driver's outstanding SCSI I/Os */
7749+ lpfc_sli_flush_fcp_rings(phba);
7750 return PCI_ERS_RESULT_DISCONNECT;
7751+ }
7752
7753 pci_disable_device(pdev);
7754 /*
7755@@ -2376,10 +2841,21 @@ static pci_ers_result_t lpfc_io_error_de
7756 }
7757
7758 /**
7759- * lpfc_io_slot_reset - called after the pci bus has been reset.
7760- * @pdev: Pointer to PCI device
7761+ * lpfc_io_slot_reset: Restart a PCI device from scratch.
7762+ * @pdev: pointer to PCI device.
7763+ *
7764+ * This routine is registered to the PCI subsystem for error handling. This is
7765+ * called after PCI bus has been reset to restart the PCI card from scratch,
7766+ * as if from a cold-boot. During the PCI subsystem error recovery, after the
7767+ * driver returns PCI_ERS_RESULT_NEED_RESET, the PCI subsystem will perform
7768+ * proper error recovery and then call this routine before calling the .resume
7769+ * method to recover the device. This function will initialize the HBA device,
7770+ * enable the interrupt, but it will just put the HBA to offline state without
7771+ * passing any I/O traffic.
7772 *
7773- * Restart the card from scratch, as if from a cold-boot.
7774+ * Return codes
7775+ * PCI_ERS_RESULT_RECOVERED - the device has been recovered
7776+ * PCI_ERS_RESULT_DISCONNECT - device could not be recovered
7777 */
7778 static pci_ers_result_t lpfc_io_slot_reset(struct pci_dev *pdev)
7779 {
7780@@ -2404,20 +2880,34 @@ static pci_ers_result_t lpfc_io_slot_res
7781 /* Enable configured interrupt method */
7782 phba->intr_type = NONE;
7783 if (phba->cfg_use_msi == 2) {
7784- error = lpfc_enable_msix(phba);
7785- if (!error)
7786- phba->intr_type = MSIX;
7787+ /* Need to issue conf_port mbox cmd before conf_msi mbox cmd */
7788+ error = lpfc_sli_config_port(phba, 3);
7789+ if (error)
7790+ lpfc_printf_log(phba, KERN_INFO, LOG_INIT,
7791+ "0478 Firmware not capable of SLI 3 mode.\n");
7792+ else {
7793+ lpfc_printf_log(phba, KERN_INFO, LOG_INIT,
7794+ "0479 Firmware capable of SLI 3 mode.\n");
7795+ /* Now, try to enable MSI-X interrupt mode */
7796+ error = lpfc_enable_msix(phba);
7797+ if (!error) {
7798+ phba->intr_type = MSIX;
7799+ lpfc_printf_log(phba, KERN_INFO, LOG_INIT,
7800+ "0480 enable MSI-X mode.\n");
7801+ }
7802+ }
7803 }
7804
7805 /* Fallback to MSI if MSI-X initialization failed */
7806 if (phba->cfg_use_msi >= 1 && phba->intr_type == NONE) {
7807 retval = pci_enable_msi(phba->pcidev);
7808- if (!retval)
7809+ if (!retval) {
7810 phba->intr_type = MSI;
7811- else
7812 lpfc_printf_log(phba, KERN_INFO, LOG_INIT,
7813- "0470 Enable MSI failed, continuing "
7814- "with IRQ\n");
7815+ "0481 enable MSI mode.\n");
7816+ } else
7817+ lpfc_printf_log(phba, KERN_INFO, LOG_INIT,
7818+ "0470 enable IRQ mode.\n");
7819 }
7820
7821 /* MSI-X is the only case the doesn't need to call request_irq */
7822@@ -2440,11 +2930,13 @@ static pci_ers_result_t lpfc_io_slot_res
7823 }
7824
7825 /**
7826- * lpfc_io_resume - called when traffic can start flowing again.
7827- * @pdev: Pointer to PCI device
7828+ * lpfc_io_resume: Resume PCI I/O operation.
7829+ * @pdev: pointer to PCI device
7830 *
7831- * This callback is called when the error recovery driver tells us that
7832- * its OK to resume normal operation.
7833+ * This routine is registered to the PCI subsystem for error handling. It is
7834+ * called when kernel error recovery tells the lpfc driver that it is ok to
7835+ * resume normal PCI operation after PCI bus error recovery. After this call,
7836+ * traffic can start to flow from this device again.
7837 */
7838 static void lpfc_io_resume(struct pci_dev *pdev)
7839 {
7840@@ -2491,6 +2983,8 @@ static struct pci_device_id lpfc_id_tabl
7841 PCI_ANY_ID, PCI_ANY_ID, },
7842 {PCI_VENDOR_ID_EMULEX, PCI_DEVICE_ID_ZEPHYR,
7843 PCI_ANY_ID, PCI_ANY_ID, },
7844+ {PCI_VENDOR_ID_EMULEX, PCI_DEVICE_ID_HORNET,
7845+ PCI_ANY_ID, PCI_ANY_ID, },
7846 {PCI_VENDOR_ID_EMULEX, PCI_DEVICE_ID_ZEPHYR_SCSP,
7847 PCI_ANY_ID, PCI_ANY_ID, },
7848 {PCI_VENDOR_ID_EMULEX, PCI_DEVICE_ID_ZEPHYR_DCSP,
7849@@ -2521,6 +3015,12 @@ static struct pci_device_id lpfc_id_tabl
7850 PCI_ANY_ID, PCI_ANY_ID, },
7851 {PCI_VENDOR_ID_EMULEX, PCI_DEVICE_ID_SAT_S,
7852 PCI_ANY_ID, PCI_ANY_ID, },
7853+ {PCI_VENDOR_ID_EMULEX, PCI_DEVICE_ID_PROTEUS_VF,
7854+ PCI_ANY_ID, PCI_ANY_ID, },
7855+ {PCI_VENDOR_ID_EMULEX, PCI_DEVICE_ID_PROTEUS_PF,
7856+ PCI_ANY_ID, PCI_ANY_ID, },
7857+ {PCI_VENDOR_ID_EMULEX, PCI_DEVICE_ID_PROTEUS_S,
7858+ PCI_ANY_ID, PCI_ANY_ID, },
7859 { 0 }
7860 };
7861
7862@@ -2540,6 +3040,18 @@ static struct pci_driver lpfc_driver = {
7863 .err_handler = &lpfc_err_handler,
7864 };
7865
7866+/**
7867+ * lpfc_init: lpfc module initialization routine.
7868+ *
7869+ * This routine is to be invoked when the lpfc module is loaded into the
7870+ * kernel. The special kernel macro module_init() is used to indicate the
7871+ * role of this routine to the kernel as lpfc module entry point.
7872+ *
7873+ * Return codes
7874+ * 0 - successful
7875+ * -ENOMEM - FC attach transport failed
7876+ * all others - failed
7877+ */
7878 static int __init
7879 lpfc_init(void)
7880 {
7881@@ -2567,12 +3079,20 @@ lpfc_init(void)
7882 error = pci_register_driver(&lpfc_driver);
7883 if (error) {
7884 fc_release_transport(lpfc_transport_template);
7885- fc_release_transport(lpfc_vport_transport_template);
7886+ if (lpfc_enable_npiv)
7887+ fc_release_transport(lpfc_vport_transport_template);
7888 }
7889
7890 return error;
7891 }
7892
7893+/**
7894+ * lpfc_exit: lpfc module removal routine.
7895+ *
7896+ * This routine is invoked when the lpfc module is removed from the kernel.
7897+ * The special kernel macro module_exit() is used to indicate the role of
7898+ * this routine to the kernel as lpfc module exit point.
7899+ */
7900 static void __exit
7901 lpfc_exit(void)
7902 {
7903--- a/drivers/scsi/lpfc/lpfc_mbox.c
7904+++ b/drivers/scsi/lpfc/lpfc_mbox.c
7905@@ -1,7 +1,7 @@
7906 /*******************************************************************
7907 * This file is part of the Emulex Linux Device Driver for *
7908 * Fibre Channel Host Bus Adapters. *
7909- * Copyright (C) 2004-2007 Emulex. All rights reserved. *
7910+ * Copyright (C) 2004-2008 Emulex. All rights reserved. *
7911 * EMULEX and SLI are trademarks of Emulex. *
7912 * www.emulex.com *
7913 * Portions Copyright (C) 2004-2005 Christoph Hellwig *
7914@@ -30,6 +30,7 @@
7915
7916 #include "lpfc_hw.h"
7917 #include "lpfc_sli.h"
7918+#include "lpfc_nl.h"
7919 #include "lpfc_disc.h"
7920 #include "lpfc_scsi.h"
7921 #include "lpfc.h"
7922@@ -37,10 +38,20 @@
7923 #include "lpfc_crtn.h"
7924 #include "lpfc_compat.h"
7925
7926-/**********************************************/
7927-
7928-/* mailbox command */
7929-/**********************************************/
7930+/**
7931+ * lpfc_dump_mem: Prepare a mailbox command for retrieving HBA's VPD memory.
7932+ * @phba: pointer to lpfc hba data structure.
7933+ * @pmb: pointer to the driver internal queue element for mailbox command.
7934+ * @offset: offset for dumping VPD memory mailbox command.
7935+ *
7936+ * The dump mailbox command provides a method for the device driver to obtain
7937+ * various types of information from the HBA device.
7938+ *
7939+ * This routine prepares the mailbox command for dumping HBA Vital Product
7940+ * Data (VPD) memory. This mailbox command is to be used for retrieving a
7941+ * portion (DMP_RSP_SIZE bytes) of a HBA's VPD from the HBA at an address
7942+ * offset specified by the offset parameter.
7943+ **/
7944 void
7945 lpfc_dump_mem(struct lpfc_hba * phba, LPFC_MBOXQ_t * pmb, uint16_t offset)
7946 {
7947@@ -65,10 +76,17 @@ lpfc_dump_mem(struct lpfc_hba * phba, LP
7948 return;
7949 }
7950
7951-/**********************************************/
7952-/* lpfc_read_nv Issue a READ NVPARAM */
7953-/* mailbox command */
7954-/**********************************************/
7955+/**
7956+ * lpfc_read_nv: Prepare a mailbox command for reading HBA's NVRAM param.
7957+ * @phba: pointer to lpfc hba data structure.
7958+ * @pmb: pointer to the driver internal queue element for mailbox command.
7959+ *
7960+ * The read NVRAM mailbox command returns the HBA's non-volatile parameters
7961+ * that are used as defaults when the Fibre Channel link is brought on-line.
7962+ *
7963+ * This routine prepares the mailbox command for reading information stored
7964+ * in the HBA's NVRAM. Specifically, the HBA's WWNN and WWPN.
7965+ **/
7966 void
7967 lpfc_read_nv(struct lpfc_hba * phba, LPFC_MBOXQ_t * pmb)
7968 {
7969@@ -81,10 +99,19 @@ lpfc_read_nv(struct lpfc_hba * phba, LPF
7970 return;
7971 }
7972
7973-/**********************************************/
7974-/* lpfc_config_async Issue a */
7975-/* MBX_ASYNC_EVT_ENABLE mailbox command */
7976-/**********************************************/
7977+/**
7978+ * lpfc_config_async: Prepare a mailbox command for enabling HBA async event.
7979+ * @phba: pointer to lpfc hba data structure.
7980+ * @pmb: pointer to the driver internal queue element for mailbox command.
7981+ * @ring: ring number for the asynchronous event to be configured.
7982+ *
7983+ * The asynchronous event enable mailbox command is used to enable the
7984+ * asynchronous event posting via the ASYNC_STATUS_CN IOCB response and
7985+ * specifies the default ring to which events are posted.
7986+ *
7987+ * This routine prepares the mailbox command for enabling HBA asynchronous
7988+ * event support on a IOCB ring.
7989+ **/
7990 void
7991 lpfc_config_async(struct lpfc_hba * phba, LPFC_MBOXQ_t * pmb,
7992 uint32_t ring)
7993@@ -99,10 +126,19 @@ lpfc_config_async(struct lpfc_hba * phba
7994 return;
7995 }
7996
7997-/**********************************************/
7998-/* lpfc_heart_beat Issue a HEART_BEAT */
7999-/* mailbox command */
8000-/**********************************************/
8001+/**
8002+ * lpfc_heart_beat: Prepare a mailbox command for heart beat.
8003+ * @phba: pointer to lpfc hba data structure.
8004+ * @pmb: pointer to the driver internal queue element for mailbox command.
8005+ *
8006+ * The heart beat mailbox command is used to detect an unresponsive HBA, which
8007+ * is defined as any device where no error attention is sent and both mailbox
8008+ * and rings are not processed.
8009+ *
8010+ * This routine prepares the mailbox command for issuing a heart beat in the
8011+ * form of mailbox command to the HBA. The timely completion of the heart
8012+ * beat mailbox command indicates the health of the HBA.
8013+ **/
8014 void
8015 lpfc_heart_beat(struct lpfc_hba * phba, LPFC_MBOXQ_t * pmb)
8016 {
8017@@ -115,10 +151,26 @@ lpfc_heart_beat(struct lpfc_hba * phba,
8018 return;
8019 }
8020
8021-/**********************************************/
8022-/* lpfc_read_la Issue a READ LA */
8023-/* mailbox command */
8024-/**********************************************/
8025+/**
8026+ * lpfc_read_la: Prepare a mailbox command for reading HBA link attention.
8027+ * @phba: pointer to lpfc hba data structure.
8028+ * @pmb: pointer to the driver internal queue element for mailbox command.
8029+ * @mp: DMA buffer memory for reading the link attention information into.
8030+ *
8031+ * The read link attention mailbox command is issued to read the Link Event
8032+ * Attention information indicated by the HBA port when the Link Event bit
8033+ * of the Host Attention (HSTATT) register is set to 1. A Link Event
8034+ * Attention occurs based on an exception detected at the Fibre Channel link
8035+ * interface.
8036+ *
8037+ * This routine prepares the mailbox command for reading HBA link attention
8038+ * information. A DMA memory has been set aside and address passed to the
8039+ * HBA through @mp for the HBA to DMA link attention information into the
8040+ * memory as part of the execution of the mailbox command.
8041+ *
8042+ * Return codes
8043+ * 0 - Success (currently always return 0)
8044+ **/
8045 int
8046 lpfc_read_la(struct lpfc_hba * phba, LPFC_MBOXQ_t * pmb, struct lpfc_dmabuf *mp)
8047 {
8048@@ -143,10 +195,21 @@ lpfc_read_la(struct lpfc_hba * phba, LPF
8049 return (0);
8050 }
8051
8052-/**********************************************/
8053-/* lpfc_clear_la Issue a CLEAR LA */
8054-/* mailbox command */
8055-/**********************************************/
8056+/**
8057+ * lpfc_clear_la: Prepare a mailbox command for clearing HBA link attention.
8058+ * @phba: pointer to lpfc hba data structure.
8059+ * @pmb: pointer to the driver internal queue element for mailbox command.
8060+ *
8061+ * The clear link attention mailbox command is issued to clear the link event
8062+ * attention condition indicated by the Link Event bit of the Host Attention
8063+ * (HSTATT) register. The link event attention condition is cleared only if
8064+ * the event tag specified matches that of the current link event counter.
8065+ * The current event tag is read using the read link attention event mailbox
8066+ * command.
8067+ *
8068+ * This routine prepares the mailbox command for clearing HBA link attention
8069+ * information.
8070+ **/
8071 void
8072 lpfc_clear_la(struct lpfc_hba * phba, LPFC_MBOXQ_t * pmb)
8073 {
8074@@ -161,10 +224,20 @@ lpfc_clear_la(struct lpfc_hba * phba, LP
8075 return;
8076 }
8077
8078-/**************************************************/
8079-/* lpfc_config_link Issue a CONFIG LINK */
8080-/* mailbox command */
8081-/**************************************************/
8082+/**
8083+ * lpfc_config_link: Prepare a mailbox command for configuring link on a HBA.
8084+ * @phba: pointer to lpfc hba data structure.
8085+ * @pmb: pointer to the driver internal queue element for mailbox command.
8086+ *
8087+ * The configure link mailbox command is used before the initialize link
8088+ * mailbox command to override default value and to configure link-oriented
8089+ * parameters such as DID address and various timers. Typically, this
8090+ * command would be used after an F_Port login to set the returned DID address
8091+ * and the fabric timeout values. This command is not valid before a configure
8092+ * port command has configured the HBA port.
8093+ *
8094+ * This routine prepares the mailbox command for configuring link on a HBA.
8095+ **/
8096 void
8097 lpfc_config_link(struct lpfc_hba * phba, LPFC_MBOXQ_t * pmb)
8098 {
8099@@ -199,10 +272,98 @@ lpfc_config_link(struct lpfc_hba * phba,
8100 return;
8101 }
8102
8103-/**********************************************/
8104-/* lpfc_init_link Issue an INIT LINK */
8105-/* mailbox command */
8106-/**********************************************/
8107+/**
8108+ * lpfc_config_msi: Prepare a mailbox command for configuring msi-x.
8109+ * @phba: pointer to lpfc hba data structure.
8110+ * @pmb: pointer to the driver internal queue element for mailbox command.
8111+ *
8112+ * The configure MSI-X mailbox command is used to configure the HBA's SLI-3
8113+ * MSI-X multi-message interrupt vector association to interrupt attention
8114+ * conditions.
8115+ *
8116+ * Return codes
8117+ * 0 - Success
8118+ * -EINVAL - Failure
8119+ **/
8120+int
8121+lpfc_config_msi(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)
8122+{
8123+ MAILBOX_t *mb = &pmb->mb;
8124+ uint32_t attentionConditions[2];
8125+
8126+ /* Sanity check */
8127+ if (phba->cfg_use_msi != 2) {
8128+ lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
8129+ "0475 Not configured for supporting MSI-X "
8130+ "cfg_use_msi: 0x%x\n", phba->cfg_use_msi);
8131+ return -EINVAL;
8132+ }
8133+
8134+ if (phba->sli_rev < 3) {
8135+ lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
8136+ "0476 HBA not supporting SLI-3 or later "
8137+ "SLI Revision: 0x%x\n", phba->sli_rev);
8138+ return -EINVAL;
8139+ }
8140+
8141+ /* Clear mailbox command fields */
8142+ memset(pmb, 0, sizeof(LPFC_MBOXQ_t));
8143+
8144+ /*
8145+ * SLI-3, Message Signaled Interrupt Fearure.
8146+ */
8147+
8148+ /* Multi-message attention configuration */
8149+ attentionConditions[0] = (HA_R0ATT | HA_R1ATT | HA_R2ATT | HA_ERATT |
8150+ HA_LATT | HA_MBATT);
8151+ attentionConditions[1] = 0;
8152+
8153+ mb->un.varCfgMSI.attentionConditions[0] = attentionConditions[0];
8154+ mb->un.varCfgMSI.attentionConditions[1] = attentionConditions[1];
8155+
8156+ /*
8157+ * Set up message number to HA bit association
8158+ */
8159+#ifdef __BIG_ENDIAN_BITFIELD
8160+ /* RA0 (FCP Ring) */
8161+ mb->un.varCfgMSI.messageNumberByHA[HA_R0_POS] = 1;
8162+ /* RA1 (Other Protocol Extra Ring) */
8163+ mb->un.varCfgMSI.messageNumberByHA[HA_R1_POS] = 1;
8164+#else /* __LITTLE_ENDIAN_BITFIELD */
8165+ /* RA0 (FCP Ring) */
8166+ mb->un.varCfgMSI.messageNumberByHA[HA_R0_POS^3] = 1;
8167+ /* RA1 (Other Protocol Extra Ring) */
8168+ mb->un.varCfgMSI.messageNumberByHA[HA_R1_POS^3] = 1;
8169+#endif
8170+ /* Multi-message interrupt autoclear configuration*/
8171+ mb->un.varCfgMSI.autoClearHA[0] = attentionConditions[0];
8172+ mb->un.varCfgMSI.autoClearHA[1] = attentionConditions[1];
8173+
8174+ /* For now, HBA autoclear does not work reliably, disable it */
8175+ mb->un.varCfgMSI.autoClearHA[0] = 0;
8176+ mb->un.varCfgMSI.autoClearHA[1] = 0;
8177+
8178+ /* Set command and owner bit */
8179+ mb->mbxCommand = MBX_CONFIG_MSI;
8180+ mb->mbxOwner = OWN_HOST;
8181+
8182+ return 0;
8183+}
8184+
8185+/**
8186+ * lpfc_init_link: Prepare a mailbox command for initialize link on a HBA.
8187+ * @phba: pointer to lpfc hba data structure.
8188+ * @pmb: pointer to the driver internal queue element for mailbox command.
8189+ * @topology: the link topology for the link to be initialized to.
8190+ * @linkspeed: the link speed for the link to be initialized to.
8191+ *
8192+ * The initialize link mailbox command is used to initialize the Fibre
8193+ * Channel link. This command must follow a configure port command that
8194+ * establishes the mode of operation.
8195+ *
8196+ * This routine prepares the mailbox command for initializing link on a HBA
8197+ * with the specified link topology and speed.
8198+ **/
8199 void
8200 lpfc_init_link(struct lpfc_hba * phba,
8201 LPFC_MBOXQ_t * pmb, uint32_t topology, uint32_t linkspeed)
8202@@ -269,10 +430,27 @@ lpfc_init_link(struct lpfc_hba * phba,
8203 return;
8204 }
8205
8206-/**********************************************/
8207-/* lpfc_read_sparam Issue a READ SPARAM */
8208-/* mailbox command */
8209-/**********************************************/
8210+/**
8211+ * lpfc_read_sparam: Prepare a mailbox command for reading HBA parameters.
8212+ * @phba: pointer to lpfc hba data structure.
8213+ * @pmb: pointer to the driver internal queue element for mailbox command.
8214+ * @vpi: virtual N_Port identifier.
8215+ *
8216+ * The read service parameter mailbox command is used to read the HBA port
8217+ * service parameters. The service parameters are read into the buffer
8218+ * specified directly by a BDE in the mailbox command. These service
8219+ * parameters may then be used to build the payload of an N_Port/F_POrt
8220+ * login request and reply (LOGI/ACC).
8221+ *
8222+ * This routine prepares the mailbox command for reading HBA port service
8223+ * parameters. The DMA memory is allocated in this function and the addresses
8224+ * are populated into the mailbox command for the HBA to DMA the service
8225+ * parameters into.
8226+ *
8227+ * Return codes
8228+ * 0 - Success
8229+ * 1 - DMA memory allocation failed
8230+ **/
8231 int
8232 lpfc_read_sparam(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb, int vpi)
8233 {
8234@@ -312,10 +490,21 @@ lpfc_read_sparam(struct lpfc_hba *phba,
8235 return (0);
8236 }
8237
8238-/********************************************/
8239-/* lpfc_unreg_did Issue a UNREG_DID */
8240-/* mailbox command */
8241-/********************************************/
8242+/**
8243+ * lpfc_unreg_did: Prepare a mailbox command for unregistering DID.
8244+ * @phba: pointer to lpfc hba data structure.
8245+ * @vpi: virtual N_Port identifier.
8246+ * @did: remote port identifier.
8247+ * @pmb: pointer to the driver internal queue element for mailbox command.
8248+ *
8249+ * The unregister DID mailbox command is used to unregister an N_Port/F_Port
8250+ * login for an unknown RPI by specifying the DID of a remote port. This
8251+ * command frees an RPI context in the HBA port. This has the effect of
8252+ * performing an implicit N_Port/F_Port logout.
8253+ *
8254+ * This routine prepares the mailbox command for unregistering a remote
8255+ * N_Port/F_Port (DID) login.
8256+ **/
8257 void
8258 lpfc_unreg_did(struct lpfc_hba * phba, uint16_t vpi, uint32_t did,
8259 LPFC_MBOXQ_t * pmb)
8260@@ -333,10 +522,19 @@ lpfc_unreg_did(struct lpfc_hba * phba, u
8261 return;
8262 }
8263
8264-/**********************************************/
8265-/* lpfc_read_nv Issue a READ CONFIG */
8266-/* mailbox command */
8267-/**********************************************/
8268+/**
8269+ * lpfc_read_config: Prepare a mailbox command for reading HBA configuration.
8270+ * @phba: pointer to lpfc hba data structure.
8271+ * @pmb: pointer to the driver internal queue element for mailbox command.
8272+ *
8273+ * The read configuration mailbox command is used to read the HBA port
8274+ * configuration parameters. This mailbox command provides a method for
8275+ * seeing any parameters that may have changed via various configuration
8276+ * mailbox commands.
8277+ *
8278+ * This routine prepares the mailbox command for reading out HBA configuration
8279+ * parameters.
8280+ **/
8281 void
8282 lpfc_read_config(struct lpfc_hba * phba, LPFC_MBOXQ_t * pmb)
8283 {
8284@@ -350,10 +548,18 @@ lpfc_read_config(struct lpfc_hba * phba,
8285 return;
8286 }
8287
8288-/*************************************************/
8289-/* lpfc_read_lnk_stat Issue a READ LINK STATUS */
8290-/* mailbox command */
8291-/*************************************************/
8292+/**
8293+ * lpfc_read_lnk_stat: Prepare a mailbox command for reading HBA link stats.
8294+ * @phba: pointer to lpfc hba data structure.
8295+ * @pmb: pointer to the driver internal queue element for mailbox command.
8296+ *
8297+ * The read link status mailbox command is used to read the link status from
8298+ * the HBA. Link status includes all link-related error counters. These
8299+ * counters are maintained by the HBA and originated in the link hardware
8300+ * unit. Note that all of these counters wrap.
8301+ *
8302+ * This routine prepares the mailbox command for reading out HBA link status.
8303+ **/
8304 void
8305 lpfc_read_lnk_stat(struct lpfc_hba * phba, LPFC_MBOXQ_t * pmb)
8306 {
8307@@ -367,10 +573,30 @@ lpfc_read_lnk_stat(struct lpfc_hba * phb
8308 return;
8309 }
8310
8311-/********************************************/
8312-/* lpfc_reg_login Issue a REG_LOGIN */
8313-/* mailbox command */
8314-/********************************************/
8315+/**
8316+ * lpfc_reg_login: Prepare a mailbox command for registering remote login.
8317+ * @phba: pointer to lpfc hba data structure.
8318+ * @vpi: virtual N_Port identifier.
8319+ * @did: remote port identifier.
8320+ * @param: pointer to memory holding the server parameters.
8321+ * @pmb: pointer to the driver internal queue element for mailbox command.
8322+ * @flag: action flag to be passed back for the complete function.
8323+ *
8324+ * The registration login mailbox command is used to register an N_Port or
8325+ * F_Port login. This registration allows the HBA to cache the remote N_Port
8326+ * service parameters internally and thereby make the appropriate FC-2
8327+ * decisions. The remote port service parameters are handed off by the driver
8328+ * to the HBA using a descriptor entry that directly identifies a buffer in
8329+ * host memory. In exchange, the HBA returns an RPI identifier.
8330+ *
8331+ * This routine prepares the mailbox command for registering remote port login.
8332+ * The function allocates DMA buffer for passing the service parameters to the
8333+ * HBA with the mailbox command.
8334+ *
8335+ * Return codes
8336+ * 0 - Success
8337+ * 1 - DMA memory allocation failed
8338+ **/
8339 int
8340 lpfc_reg_login(struct lpfc_hba *phba, uint16_t vpi, uint32_t did,
8341 uint8_t *param, LPFC_MBOXQ_t *pmb, uint32_t flag)
8342@@ -418,10 +644,20 @@ lpfc_reg_login(struct lpfc_hba *phba, ui
8343 return (0);
8344 }
8345
8346-/**********************************************/
8347-/* lpfc_unreg_login Issue a UNREG_LOGIN */
8348-/* mailbox command */
8349-/**********************************************/
8350+/**
8351+ * lpfc_unreg_login: Prepare a mailbox command for unregistering remote login.
8352+ * @phba: pointer to lpfc hba data structure.
8353+ * @vpi: virtual N_Port identifier.
8354+ * @rpi: remote port identifier
8355+ * @pmb: pointer to the driver internal queue element for mailbox command.
8356+ *
8357+ * The unregistration login mailbox command is used to unregister an N_Port
8358+ * or F_Port login. This command frees an RPI context in the HBA. It has the
8359+ * effect of performing an implicit N_Port/F_Port logout.
8360+ *
8361+ * This routine prepares the mailbox command for unregistering remote port
8362+ * login.
8363+ **/
8364 void
8365 lpfc_unreg_login(struct lpfc_hba *phba, uint16_t vpi, uint32_t rpi,
8366 LPFC_MBOXQ_t * pmb)
8367@@ -440,10 +676,21 @@ lpfc_unreg_login(struct lpfc_hba *phba,
8368 return;
8369 }
8370
8371-/**************************************************/
8372-/* lpfc_reg_vpi Issue a REG_VPI */
8373-/* mailbox command */
8374-/**************************************************/
8375+/**
8376+ * lpfc_reg_vpi: Prepare a mailbox command for registering vport identifier.
8377+ * @phba: pointer to lpfc hba data structure.
8378+ * @vpi: virtual N_Port identifier.
8379+ * @sid: Fibre Channel S_ID (N_Port_ID assigned to a virtual N_Port).
8380+ * @pmb: pointer to the driver internal queue element for mailbox command.
8381+ *
8382+ * The registration vport identifier mailbox command is used to activate a
8383+ * virtual N_Port after it has acquired an N_Port_ID. The HBA validates the
8384+ * N_Port_ID against the information in the selected virtual N_Port context
8385+ * block and marks it active to allow normal processing of IOCB commands and
8386+ * received unsolicited exchanges.
8387+ *
8388+ * This routine prepares the mailbox command for registering a virtual N_Port.
8389+ **/
8390 void
8391 lpfc_reg_vpi(struct lpfc_hba *phba, uint16_t vpi, uint32_t sid,
8392 LPFC_MBOXQ_t *pmb)
8393@@ -461,10 +708,22 @@ lpfc_reg_vpi(struct lpfc_hba *phba, uint
8394
8395 }
8396
8397-/**************************************************/
8398-/* lpfc_unreg_vpi Issue a UNREG_VNPI */
8399-/* mailbox command */
8400-/**************************************************/
8401+/**
8402+ * lpfc_unreg_vpi: Prepare a mailbox command for unregistering vport id.
8403+ * @phba: pointer to lpfc hba data structure.
8404+ * @vpi: virtual N_Port identifier.
8405+ * @pmb: pointer to the driver internal queue element for mailbox command.
8406+ *
8407+ * The unregistration vport identifier mailbox command is used to inactivate
8408+ * a virtual N_Port. The driver must have logged out and unregistered all
8409+ * remote N_Ports to abort any activity on the virtual N_Port. The HBA will
8410+ * unregisters any default RPIs associated with the specified vpi, aborting
8411+ * any active exchanges. The HBA will post the mailbox response after making
8412+ * the virtual N_Port inactive.
8413+ *
8414+ * This routine prepares the mailbox command for unregistering a virtual
8415+ * N_Port.
8416+ **/
8417 void
8418 lpfc_unreg_vpi(struct lpfc_hba *phba, uint16_t vpi, LPFC_MBOXQ_t *pmb)
8419 {
8420@@ -479,12 +738,19 @@ lpfc_unreg_vpi(struct lpfc_hba *phba, ui
8421
8422 }
8423
8424+/**
8425+ * lpfc_config_pcb_setup: Set up IOCB rings in the Port Control Block (PCB)
8426+ * @phba: pointer to lpfc hba data structure.
8427+ *
8428+ * This routine sets up and initializes the IOCB rings in the Port Control
8429+ * Block (PCB).
8430+ **/
8431 static void
8432 lpfc_config_pcb_setup(struct lpfc_hba * phba)
8433 {
8434 struct lpfc_sli *psli = &phba->sli;
8435 struct lpfc_sli_ring *pring;
8436- PCB_t *pcbp = &phba->slim2p->pcb;
8437+ PCB_t *pcbp = phba->pcb;
8438 dma_addr_t pdma_addr;
8439 uint32_t offset;
8440 uint32_t iocbCnt = 0;
8441@@ -513,29 +779,43 @@ lpfc_config_pcb_setup(struct lpfc_hba *
8442 continue;
8443 }
8444 /* Command ring setup for ring */
8445- pring->cmdringaddr = (void *) &phba->slim2p->IOCBs[iocbCnt];
8446+ pring->cmdringaddr = (void *)&phba->IOCBs[iocbCnt];
8447 pcbp->rdsc[i].cmdEntries = pring->numCiocb;
8448
8449- offset = (uint8_t *) &phba->slim2p->IOCBs[iocbCnt] -
8450- (uint8_t *) phba->slim2p;
8451- pdma_addr = phba->slim2p_mapping + offset;
8452+ offset = (uint8_t *) &phba->IOCBs[iocbCnt] -
8453+ (uint8_t *) phba->slim2p.virt;
8454+ pdma_addr = phba->slim2p.phys + offset;
8455 pcbp->rdsc[i].cmdAddrHigh = putPaddrHigh(pdma_addr);
8456 pcbp->rdsc[i].cmdAddrLow = putPaddrLow(pdma_addr);
8457 iocbCnt += pring->numCiocb;
8458
8459 /* Response ring setup for ring */
8460- pring->rspringaddr = (void *) &phba->slim2p->IOCBs[iocbCnt];
8461+ pring->rspringaddr = (void *) &phba->IOCBs[iocbCnt];
8462
8463 pcbp->rdsc[i].rspEntries = pring->numRiocb;
8464- offset = (uint8_t *)&phba->slim2p->IOCBs[iocbCnt] -
8465- (uint8_t *)phba->slim2p;
8466- pdma_addr = phba->slim2p_mapping + offset;
8467+ offset = (uint8_t *)&phba->IOCBs[iocbCnt] -
8468+ (uint8_t *)phba->slim2p.virt;
8469+ pdma_addr = phba->slim2p.phys + offset;
8470 pcbp->rdsc[i].rspAddrHigh = putPaddrHigh(pdma_addr);
8471 pcbp->rdsc[i].rspAddrLow = putPaddrLow(pdma_addr);
8472 iocbCnt += pring->numRiocb;
8473 }
8474 }
8475
8476+/**
8477+ * lpfc_read_rev: Prepare a mailbox command for reading HBA revision.
8478+ * @phba: pointer to lpfc hba data structure.
8479+ * @pmb: pointer to the driver internal queue element for mailbox command.
8480+ *
8481+ * The read revision mailbox command is used to read the revision levels of
8482+ * the HBA components. These components include hardware units, resident
8483+ * firmware, and available firmware. HBAs that supports SLI-3 mode of
8484+ * operation provide different response information depending on the version
8485+ * requested by the driver.
8486+ *
8487+ * This routine prepares the mailbox command for reading HBA revision
8488+ * information.
8489+ **/
8490 void
8491 lpfc_read_rev(struct lpfc_hba * phba, LPFC_MBOXQ_t * pmb)
8492 {
8493@@ -548,6 +828,16 @@ lpfc_read_rev(struct lpfc_hba * phba, LP
8494 return;
8495 }
8496
8497+/**
8498+ * lpfc_build_hbq_profile2: Set up the HBQ Selection Profile 2.
8499+ * @hbqmb: pointer to the HBQ configuration data structure in mailbox command.
8500+ * @hbq_desc: pointer to the HBQ selection profile descriptor.
8501+ *
8502+ * The Host Buffer Queue (HBQ) Selection Profile 2 specifies that the HBA
8503+ * tests the incoming frames' R_CTL/TYPE fields with works 10:15 and performs
8504+ * the Sequence Length Test using the fields in the Selection Profile 2
8505+ * extension in words 20:31.
8506+ **/
8507 static void
8508 lpfc_build_hbq_profile2(struct config_hbq_var *hbqmb,
8509 struct lpfc_hbq_init *hbq_desc)
8510@@ -557,6 +847,16 @@ lpfc_build_hbq_profile2(struct config_hb
8511 hbqmb->profiles.profile2.seqlenoff = hbq_desc->seqlenoff;
8512 }
8513
8514+/**
8515+ * lpfc_build_hbq_profile3: Set up the HBQ Selection Profile 3.
8516+ * @hbqmb: pointer to the HBQ configuration data structure in mailbox command.
8517+ * @hbq_desc: pointer to the HBQ selection profile descriptor.
8518+ *
8519+ * The Host Buffer Queue (HBQ) Selection Profile 3 specifies that the HBA
8520+ * tests the incoming frame's R_CTL/TYPE fields with words 10:15 and performs
8521+ * the Sequence Length Test and Byte Field Test using the fields in the
8522+ * Selection Profile 3 extension in words 20:31.
8523+ **/
8524 static void
8525 lpfc_build_hbq_profile3(struct config_hbq_var *hbqmb,
8526 struct lpfc_hbq_init *hbq_desc)
8527@@ -569,6 +869,17 @@ lpfc_build_hbq_profile3(struct config_hb
8528 sizeof(hbqmb->profiles.profile3.cmdmatch));
8529 }
8530
8531+/**
8532+ * lpfc_build_hbq_profile5: Set up the HBQ Selection Profile 5.
8533+ * @hbqmb: pointer to the HBQ configuration data structure in mailbox command.
8534+ * @hbq_desc: pointer to the HBQ selection profile descriptor.
8535+ *
8536+ * The Host Buffer Queue (HBQ) Selection Profile 5 specifies a header HBQ. The
8537+ * HBA tests the initial frame of an incoming sequence using the frame's
8538+ * R_CTL/TYPE fields with words 10:15 and performs the Sequence Length Test
8539+ * and Byte Field Test using the fields in the Selection Profile 5 extension
8540+ * words 20:31.
8541+ **/
8542 static void
8543 lpfc_build_hbq_profile5(struct config_hbq_var *hbqmb,
8544 struct lpfc_hbq_init *hbq_desc)
8545@@ -581,6 +892,20 @@ lpfc_build_hbq_profile5(struct config_hb
8546 sizeof(hbqmb->profiles.profile5.cmdmatch));
8547 }
8548
8549+/**
8550+ * lpfc_config_hbq: Prepare a mailbox command for configuring an HBQ.
8551+ * @phba: pointer to lpfc hba data structure.
8552+ * @id: HBQ identifier.
8553+ * @hbq_desc: pointer to the HBA descriptor data structure.
8554+ * @hbq_entry_index: index of the HBQ entry data structures.
8555+ * @pmb: pointer to the driver internal queue element for mailbox command.
8556+ *
8557+ * The configure HBQ (Host Buffer Queue) mailbox command is used to configure
8558+ * an HBQ. The configuration binds events that require buffers to a particular
8559+ * ring and HBQ based on a selection profile.
8560+ *
8561+ * This routine prepares the mailbox command for configuring an HBQ.
8562+ **/
8563 void
8564 lpfc_config_hbq(struct lpfc_hba *phba, uint32_t id,
8565 struct lpfc_hbq_init *hbq_desc,
8566@@ -641,8 +966,23 @@ lpfc_config_hbq(struct lpfc_hba *phba, u
8567 return;
8568 }
8569
8570-
8571-
8572+/**
8573+ * lpfc_config_ring: Prepare a mailbox command for configuring an IOCB ring.
8574+ * @phba: pointer to lpfc hba data structure.
8575+ * @ring:
8576+ * @pmb: pointer to the driver internal queue element for mailbox command.
8577+ *
8578+ * The configure ring mailbox command is used to configure an IOCB ring. This
8579+ * configuration binds from one to six of HBA RC_CTL/TYPE mask entries to the
8580+ * ring. This is used to map incoming sequences to a particular ring whose
8581+ * RC_CTL/TYPE mask entry matches that of the sequence. The driver should not
8582+ * attempt to configure a ring whose number is greater than the number
8583+ * specified in the Port Control Block (PCB). It is an error to issue the
8584+ * configure ring command more than once with the same ring number. The HBA
8585+ * returns an error if the driver attempts this.
8586+ *
8587+ * This routine prepares the mailbox command for configuring IOCB ring.
8588+ **/
8589 void
8590 lpfc_config_ring(struct lpfc_hba * phba, int ring, LPFC_MBOXQ_t * pmb)
8591 {
8592@@ -684,6 +1024,20 @@ lpfc_config_ring(struct lpfc_hba * phba,
8593 return;
8594 }
8595
8596+/**
8597+ * lpfc_config_port: Prepare a mailbox command for configuring port.
8598+ * @phba: pointer to lpfc hba data structure.
8599+ * @pmb: pointer to the driver internal queue element for mailbox command.
8600+ *
8601+ * The configure port mailbox command is used to identify the Port Control
8602+ * Block (PCB) in the driver memory. After this command is issued, the
8603+ * driver must not access the mailbox in the HBA without first resetting
8604+ * the HBA. The HBA may copy the PCB information to internal storage for
8605+ * subsequent use; the driver can not change the PCB information unless it
8606+ * resets the HBA.
8607+ *
8608+ * This routine prepares the mailbox command for configuring port.
8609+ **/
8610 void
8611 lpfc_config_port(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)
8612 {
8613@@ -702,8 +1056,8 @@ lpfc_config_port(struct lpfc_hba *phba,
8614
8615 mb->un.varCfgPort.pcbLen = sizeof(PCB_t);
8616
8617- offset = (uint8_t *)&phba->slim2p->pcb - (uint8_t *)phba->slim2p;
8618- pdma_addr = phba->slim2p_mapping + offset;
8619+ offset = (uint8_t *)phba->pcb - (uint8_t *)phba->slim2p.virt;
8620+ pdma_addr = phba->slim2p.phys + offset;
8621 mb->un.varCfgPort.pcbLow = putPaddrLow(pdma_addr);
8622 mb->un.varCfgPort.pcbHigh = putPaddrHigh(pdma_addr);
8623
8624@@ -711,12 +1065,13 @@ lpfc_config_port(struct lpfc_hba *phba,
8625
8626 if (phba->sli_rev == 3 && phba->vpd.sli3Feat.cerbm) {
8627 mb->un.varCfgPort.cerbm = 1; /* Request HBQs */
8628+ mb->un.varCfgPort.ccrp = 1; /* Command Ring Polling */
8629+ mb->un.varCfgPort.cinb = 1; /* Interrupt Notification Block */
8630 mb->un.varCfgPort.max_hbq = lpfc_sli_hbq_count();
8631 if (phba->max_vpi && phba->cfg_enable_npiv &&
8632 phba->vpd.sli3Feat.cmv) {
8633 mb->un.varCfgPort.max_vpi = phba->max_vpi;
8634 mb->un.varCfgPort.cmv = 1;
8635- phba->sli3_options |= LPFC_SLI3_NPIV_ENABLED;
8636 } else
8637 mb->un.varCfgPort.max_vpi = phba->max_vpi = 0;
8638 } else
8639@@ -724,16 +1079,15 @@ lpfc_config_port(struct lpfc_hba *phba,
8640 mb->un.varCfgPort.sli_mode = phba->sli_rev;
8641
8642 /* Now setup pcb */
8643- phba->slim2p->pcb.type = TYPE_NATIVE_SLI2;
8644- phba->slim2p->pcb.feature = FEATURE_INITIAL_SLI2;
8645+ phba->pcb->type = TYPE_NATIVE_SLI2;
8646+ phba->pcb->feature = FEATURE_INITIAL_SLI2;
8647
8648 /* Setup Mailbox pointers */
8649- phba->slim2p->pcb.mailBoxSize = offsetof(MAILBOX_t, us) +
8650- sizeof(struct sli2_desc);
8651- offset = (uint8_t *)&phba->slim2p->mbx - (uint8_t *)phba->slim2p;
8652- pdma_addr = phba->slim2p_mapping + offset;
8653- phba->slim2p->pcb.mbAddrHigh = putPaddrHigh(pdma_addr);
8654- phba->slim2p->pcb.mbAddrLow = putPaddrLow(pdma_addr);
8655+ phba->pcb->mailBoxSize = sizeof(MAILBOX_t);
8656+ offset = (uint8_t *)phba->mbox - (uint8_t *)phba->slim2p.virt;
8657+ pdma_addr = phba->slim2p.phys + offset;
8658+ phba->pcb->mbAddrHigh = putPaddrHigh(pdma_addr);
8659+ phba->pcb->mbAddrLow = putPaddrLow(pdma_addr);
8660
8661 /*
8662 * Setup Host Group ring pointer.
8663@@ -794,13 +1148,13 @@ lpfc_config_port(struct lpfc_hba *phba,
8664 }
8665
8666 /* mask off BAR0's flag bits 0 - 3 */
8667- phba->slim2p->pcb.hgpAddrLow = (bar_low & PCI_BASE_ADDRESS_MEM_MASK) +
8668- (void __iomem *) phba->host_gp -
8669+ phba->pcb->hgpAddrLow = (bar_low & PCI_BASE_ADDRESS_MEM_MASK) +
8670+ (void __iomem *)phba->host_gp -
8671 (void __iomem *)phba->MBslimaddr;
8672 if (bar_low & PCI_BASE_ADDRESS_MEM_TYPE_64)
8673- phba->slim2p->pcb.hgpAddrHigh = bar_high;
8674+ phba->pcb->hgpAddrHigh = bar_high;
8675 else
8676- phba->slim2p->pcb.hgpAddrHigh = 0;
8677+ phba->pcb->hgpAddrHigh = 0;
8678 /* write HGP data to SLIM at the required longword offset */
8679 memset(&hgp, 0, sizeof(struct lpfc_hgp));
8680
8681@@ -810,17 +1164,19 @@ lpfc_config_port(struct lpfc_hba *phba,
8682 }
8683
8684 /* Setup Port Group ring pointer */
8685- if (phba->sli_rev == 3)
8686- pgp_offset = (uint8_t *)&phba->slim2p->mbx.us.s3_pgp.port -
8687- (uint8_t *)phba->slim2p;
8688- else
8689- pgp_offset = (uint8_t *)&phba->slim2p->mbx.us.s2.port -
8690- (uint8_t *)phba->slim2p;
8691-
8692- pdma_addr = phba->slim2p_mapping + pgp_offset;
8693- phba->slim2p->pcb.pgpAddrHigh = putPaddrHigh(pdma_addr);
8694- phba->slim2p->pcb.pgpAddrLow = putPaddrLow(pdma_addr);
8695- phba->hbq_get = &phba->slim2p->mbx.us.s3_pgp.hbq_get[0];
8696+ if (phba->sli3_options & LPFC_SLI3_INB_ENABLED) {
8697+ pgp_offset = offsetof(struct lpfc_sli2_slim,
8698+ mbx.us.s3_inb_pgp.port);
8699+ phba->hbq_get = phba->mbox->us.s3_inb_pgp.hbq_get;
8700+ } else if (phba->sli_rev == 3) {
8701+ pgp_offset = offsetof(struct lpfc_sli2_slim,
8702+ mbx.us.s3_pgp.port);
8703+ phba->hbq_get = phba->mbox->us.s3_pgp.hbq_get;
8704+ } else
8705+ pgp_offset = offsetof(struct lpfc_sli2_slim, mbx.us.s2.port);
8706+ pdma_addr = phba->slim2p.phys + pgp_offset;
8707+ phba->pcb->pgpAddrHigh = putPaddrHigh(pdma_addr);
8708+ phba->pcb->pgpAddrLow = putPaddrLow(pdma_addr);
8709
8710 /* Use callback routine to setp rings in the pcb */
8711 lpfc_config_pcb_setup(phba);
8712@@ -835,10 +1191,24 @@ lpfc_config_port(struct lpfc_hba *phba,
8713 }
8714
8715 /* Swap PCB if needed */
8716- lpfc_sli_pcimem_bcopy(&phba->slim2p->pcb, &phba->slim2p->pcb,
8717- sizeof(PCB_t));
8718+ lpfc_sli_pcimem_bcopy(phba->pcb, phba->pcb, sizeof(PCB_t));
8719 }
8720
8721+/**
8722+ * lpfc_kill_board: Prepare a mailbox command for killing board.
8723+ * @phba: pointer to lpfc hba data structure.
8724+ * @pmb: pointer to the driver internal queue element for mailbox command.
8725+ *
8726+ * The kill board mailbox command is used to tell firmware to perform a
8727+ * graceful shutdown of a channel on a specified board to prepare for reset.
8728+ * When the kill board mailbox command is received, the ER3 bit is set to 1
8729+ * in the Host Status register and the ER Attention bit is set to 1 in the
8730+ * Host Attention register of the HBA function that received the kill board
8731+ * command.
8732+ *
8733+ * This routine prepares the mailbox command for killing the board in
8734+ * preparation for a graceful shutdown.
8735+ **/
8736 void
8737 lpfc_kill_board(struct lpfc_hba * phba, LPFC_MBOXQ_t * pmb)
8738 {
8739@@ -850,6 +1220,16 @@ lpfc_kill_board(struct lpfc_hba * phba,
8740 return;
8741 }
8742
8743+/**
8744+ * lpfc_mbox_put: Put a mailbox cmd into the tail of driver's mailbox queue.
8745+ * @phba: pointer to lpfc hba data structure.
8746+ * @mbq: pointer to the driver internal queue element for mailbox command.
8747+ *
8748+ * Driver maintains a internal mailbox command queue implemented as a linked
8749+ * list. When a mailbox command is issued, it shall be put into the mailbox
8750+ * command queue such that they shall be processed orderly as HBA can process
8751+ * one mailbox command at a time.
8752+ **/
8753 void
8754 lpfc_mbox_put(struct lpfc_hba * phba, LPFC_MBOXQ_t * mbq)
8755 {
8756@@ -864,6 +1244,20 @@ lpfc_mbox_put(struct lpfc_hba * phba, LP
8757 return;
8758 }
8759
8760+/**
8761+ * lpfc_mbox_get: Remove a mailbox cmd from the head of driver's mailbox queue.
8762+ * @phba: pointer to lpfc hba data structure.
8763+ *
8764+ * Driver maintains a internal mailbox command queue implemented as a linked
8765+ * list. When a mailbox command is issued, it shall be put into the mailbox
8766+ * command queue such that they shall be processed orderly as HBA can process
8767+ * one mailbox command at a time. After HBA finished processing a mailbox
8768+ * command, the driver will remove a pending mailbox command from the head of
8769+ * the mailbox command queue and send to the HBA for processing.
8770+ *
8771+ * Return codes
8772+ * pointer to the driver internal queue element for mailbox command.
8773+ **/
8774 LPFC_MBOXQ_t *
8775 lpfc_mbox_get(struct lpfc_hba * phba)
8776 {
8777@@ -877,6 +1271,17 @@ lpfc_mbox_get(struct lpfc_hba * phba)
8778 return mbq;
8779 }
8780
8781+/**
8782+ * lpfc_mbox_cmpl_put: Put mailbox command into mailbox command complete list.
8783+ * @phba: pointer to lpfc hba data structure.
8784+ * @mbq: pointer to the driver internal queue element for mailbox command.
8785+ *
8786+ * This routine put the completed mailbox command into the mailbox command
8787+ * complete list. This routine is called from driver interrupt handler
8788+ * context.The mailbox complete list is used by the driver worker thread
8789+ * to process mailbox complete callback functions outside the driver interrupt
8790+ * handler.
8791+ **/
8792 void
8793 lpfc_mbox_cmpl_put(struct lpfc_hba * phba, LPFC_MBOXQ_t * mbq)
8794 {
8795@@ -887,6 +1292,17 @@ lpfc_mbox_cmpl_put(struct lpfc_hba * phb
8796 return;
8797 }
8798
8799+/**
8800+ * lpfc_mbox_tmo_val: Retrieve mailbox command timeout value.
8801+ * @phba: pointer to lpfc hba data structure.
8802+ * @cmd: mailbox command code.
8803+ *
8804+ * This routine retrieves the proper timeout value according to the mailbox
8805+ * command code.
8806+ *
8807+ * Return codes
8808+ * Timeout value to be used for the given mailbox command
8809+ **/
8810 int
8811 lpfc_mbox_tmo_val(struct lpfc_hba *phba, int cmd)
8812 {
8813--- a/drivers/scsi/lpfc/lpfc_mem.c
8814+++ b/drivers/scsi/lpfc/lpfc_mem.c
8815@@ -1,7 +1,7 @@
8816 /*******************************************************************
8817 * This file is part of the Emulex Linux Device Driver for *
8818 * Fibre Channel Host Bus Adapters. *
8819- * Copyright (C) 2004-2006 Emulex. All rights reserved. *
8820+ * Copyright (C) 2004-2008 Emulex. All rights reserved. *
8821 * EMULEX and SLI are trademarks of Emulex. *
8822 * www.emulex.com *
8823 * Portions Copyright (C) 2004-2005 Christoph Hellwig *
8824@@ -30,6 +30,7 @@
8825
8826 #include "lpfc_hw.h"
8827 #include "lpfc_sli.h"
8828+#include "lpfc_nl.h"
8829 #include "lpfc_disc.h"
8830 #include "lpfc_scsi.h"
8831 #include "lpfc.h"
8832@@ -39,7 +40,21 @@
8833 #define LPFC_MEM_POOL_SIZE 64 /* max elem in non-DMA safety pool */
8834
8835
8836-
8837+/**
8838+ * lpfc_mem_alloc: create and allocate all PCI and memory pools
8839+ * @phba: HBA to allocate pools for
8840+ *
8841+ * Description: Creates and allocates PCI pools lpfc_scsi_dma_buf_pool,
8842+ * lpfc_mbuf_pool, lpfc_hbq_pool. Creates and allocates kmalloc-backed mempools
8843+ * for LPFC_MBOXQ_t and lpfc_nodelist. Also allocates the VPI bitmask.
8844+ *
8845+ * Notes: Not interrupt-safe. Must be called with no locks held. If any
8846+ * allocation fails, frees all successfully allocated memory before returning.
8847+ *
8848+ * Returns:
8849+ * 0 on success
8850+ * -ENOMEM on failure (if any memory allocations fail)
8851+ **/
8852 int
8853 lpfc_mem_alloc(struct lpfc_hba * phba)
8854 {
8855@@ -120,6 +135,16 @@ lpfc_mem_alloc(struct lpfc_hba * phba)
8856 return -ENOMEM;
8857 }
8858
8859+/**
8860+ * lpfc_mem_free: Frees all PCI and memory allocated by lpfc_mem_alloc
8861+ * @phba: HBA to free memory for
8862+ *
8863+ * Description: Frees PCI pools lpfc_scsi_dma_buf_pool, lpfc_mbuf_pool,
8864+ * lpfc_hbq_pool. Frees kmalloc-backed mempools for LPFC_MBOXQ_t and
8865+ * lpfc_nodelist. Also frees the VPI bitmask.
8866+ *
8867+ * Returns: None
8868+ **/
8869 void
8870 lpfc_mem_free(struct lpfc_hba * phba)
8871 {
8872@@ -181,12 +206,29 @@ lpfc_mem_free(struct lpfc_hba * phba)
8873 phba->lpfc_scsi_dma_buf_pool = NULL;
8874 phba->lpfc_mbuf_pool = NULL;
8875
8876- /* Free the iocb lookup array */
8877+ /* Free the iocb lookup array */
8878 kfree(psli->iocbq_lookup);
8879 psli->iocbq_lookup = NULL;
8880-
8881 }
8882
8883+/**
8884+ * lpfc_mbuf_alloc: Allocate an mbuf from the lpfc_mbuf_pool PCI pool
8885+ * @phba: HBA which owns the pool to allocate from
8886+ * @mem_flags: indicates if this is a priority (MEM_PRI) allocation
8887+ * @handle: used to return the DMA-mapped address of the mbuf
8888+ *
8889+ * Description: Allocates a DMA-mapped buffer from the lpfc_mbuf_pool PCI pool.
8890+ * Allocates from generic pci_pool_alloc function first and if that fails and
8891+ * mem_flags has MEM_PRI set (the only defined flag), returns an mbuf from the
8892+ * HBA's pool.
8893+ *
8894+ * Notes: Not interrupt-safe. Must be called with no locks held. Takes
8895+ * phba->hbalock.
8896+ *
8897+ * Returns:
8898+ * pointer to the allocated mbuf on success
8899+ * NULL on failure
8900+ **/
8901 void *
8902 lpfc_mbuf_alloc(struct lpfc_hba *phba, int mem_flags, dma_addr_t *handle)
8903 {
8904@@ -206,6 +248,20 @@ lpfc_mbuf_alloc(struct lpfc_hba *phba, i
8905 return ret;
8906 }
8907
8908+/**
8909+ * __lpfc_mem_free: Free an mbuf from the lpfc_mbuf_pool PCI pool (locked)
8910+ * @phba: HBA which owns the pool to return to
8911+ * @virt: mbuf to free
8912+ * @dma: the DMA-mapped address of the lpfc_mbuf_pool to be freed
8913+ *
8914+ * Description: Returns an mbuf lpfc_mbuf_pool to the lpfc_mbuf_safety_pool if
8915+ * it is below its max_count, frees the mbuf otherwise.
8916+ *
8917+ * Notes: Must be called with phba->hbalock held to synchronize access to
8918+ * lpfc_mbuf_safety_pool.
8919+ *
8920+ * Returns: None
8921+ **/
8922 void
8923 __lpfc_mbuf_free(struct lpfc_hba * phba, void *virt, dma_addr_t dma)
8924 {
8925@@ -221,7 +277,21 @@ __lpfc_mbuf_free(struct lpfc_hba * phba,
8926 return;
8927 }
8928
8929+/**
8930+ * lpfc_mem_free: Free an mbuf from the lpfc_mbuf_pool PCI pool (unlocked)
8931+ * @phba: HBA which owns the pool to return to
8932+ * @virt: mbuf to free
8933+ * @dma: the DMA-mapped address of the lpfc_mbuf_pool to be freed
8934+ *
8935+ * Description: Returns an mbuf lpfc_mbuf_pool to the lpfc_mbuf_safety_pool if
8936+ * it is below its max_count, frees the mbuf otherwise.
8937+ *
8938+ * Notes: Takes phba->hbalock. Can be called with or without other locks held.
8939+ *
8940+ * Returns: None
8941+ **/
8942 void
8943+
8944 lpfc_mbuf_free(struct lpfc_hba * phba, void *virt, dma_addr_t dma)
8945 {
8946 unsigned long iflags;
8947@@ -232,6 +302,19 @@ lpfc_mbuf_free(struct lpfc_hba * phba, v
8948 return;
8949 }
8950
8951+/**
8952+ * lpfc_els_hbq_alloc: Allocate an HBQ buffer
8953+ * @phba: HBA to allocate HBQ buffer for
8954+ *
8955+ * Description: Allocates a DMA-mapped HBQ buffer from the lpfc_hbq_pool PCI
8956+ * pool along a non-DMA-mapped container for it.
8957+ *
8958+ * Notes: Not interrupt-safe. Must be called with no locks held.
8959+ *
8960+ * Returns:
8961+ * pointer to HBQ on success
8962+ * NULL on failure
8963+ **/
8964 struct hbq_dmabuf *
8965 lpfc_els_hbq_alloc(struct lpfc_hba *phba)
8966 {
8967@@ -251,6 +334,18 @@ lpfc_els_hbq_alloc(struct lpfc_hba *phba
8968 return hbqbp;
8969 }
8970
8971+/**
8972+ * lpfc_mem_hbq_free: Frees an HBQ buffer allocated with lpfc_els_hbq_alloc
8973+ * @phba: HBA buffer was allocated for
8974+ * @hbqbp: HBQ container returned by lpfc_els_hbq_alloc
8975+ *
8976+ * Description: Frees both the container and the DMA-mapped buffer returned by
8977+ * lpfc_els_hbq_alloc.
8978+ *
8979+ * Notes: Can be called with or without locks held.
8980+ *
8981+ * Returns: None
8982+ **/
8983 void
8984 lpfc_els_hbq_free(struct lpfc_hba *phba, struct hbq_dmabuf *hbqbp)
8985 {
8986@@ -259,7 +354,18 @@ lpfc_els_hbq_free(struct lpfc_hba *phba,
8987 return;
8988 }
8989
8990-/* This is ONLY called for the LPFC_ELS_HBQ */
8991+/**
8992+ * lpfc_in_buf_free: Free a DMA buffer
8993+ * @phba: HBA buffer is associated with
8994+ * @mp: Buffer to free
8995+ *
8996+ * Description: Frees the given DMA buffer in the appropriate way given if the
8997+ * HBA is running in SLI3 mode with HBQs enabled.
8998+ *
8999+ * Notes: Takes phba->hbalock. Can be called with or without other locks held.
9000+ *
9001+ * Returns: None
9002+ **/
9003 void
9004 lpfc_in_buf_free(struct lpfc_hba *phba, struct lpfc_dmabuf *mp)
9005 {
9006--- /dev/null
9007+++ b/drivers/scsi/lpfc/lpfc_nl.h
9008@@ -0,0 +1,163 @@
9009+/*******************************************************************
9010+ * This file is part of the Emulex Linux Device Driver for *
9011+ * Fibre Channel Host Bus Adapters. *
9012+ * Copyright (C) 2008 Emulex. All rights reserved. *
9013+ * EMULEX and SLI are trademarks of Emulex. *
9014+ * www.emulex.com *
9015+ * *
9016+ * This program is free software; you can redistribute it and/or *
9017+ * modify it under the terms of version 2 of the GNU General *
9018+ * Public License as published by the Free Software Foundation. *
9019+ * This program is distributed in the hope that it will be useful. *
9020+ * ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND *
9021+ * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, *
9022+ * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT, ARE *
9023+ * DISCLAIMED, EXCEPT TO THE EXTENT THAT SUCH DISCLAIMERS ARE HELD *
9024+ * TO BE LEGALLY INVALID. See the GNU General Public License for *
9025+ * more details, a copy of which can be found in the file COPYING *
9026+ * included with this package. *
9027+ *******************************************************************/
9028+
9029+/* Event definitions for RegisterForEvent */
9030+#define FC_REG_LINK_EVENT 0x0001 /* link up / down events */
9031+#define FC_REG_RSCN_EVENT 0x0002 /* RSCN events */
9032+#define FC_REG_CT_EVENT 0x0004 /* CT request events */
9033+#define FC_REG_DUMP_EVENT 0x0008 /* Dump events */
9034+#define FC_REG_TEMPERATURE_EVENT 0x0010 /* temperature events */
9035+#define FC_REG_ELS_EVENT 0x0020 /* lpfc els events */
9036+#define FC_REG_FABRIC_EVENT 0x0040 /* lpfc fabric events */
9037+#define FC_REG_SCSI_EVENT 0x0080 /* lpfc scsi events */
9038+#define FC_REG_BOARD_EVENT 0x0100 /* lpfc board events */
9039+#define FC_REG_ADAPTER_EVENT 0x0200 /* lpfc adapter events */
9040+#define FC_REG_EVENT_MASK (FC_REG_LINK_EVENT | \
9041+ FC_REG_RSCN_EVENT | \
9042+ FC_REG_CT_EVENT | \
9043+ FC_REG_DUMP_EVENT | \
9044+ FC_REG_TEMPERATURE_EVENT | \
9045+ FC_REG_ELS_EVENT | \
9046+ FC_REG_FABRIC_EVENT | \
9047+ FC_REG_SCSI_EVENT | \
9048+ FC_REG_BOARD_EVENT | \
9049+ FC_REG_ADAPTER_EVENT)
9050+/* Temperature events */
9051+#define LPFC_CRIT_TEMP 0x1
9052+#define LPFC_THRESHOLD_TEMP 0x2
9053+#define LPFC_NORMAL_TEMP 0x3
9054+/*
9055+ * All net link event payloads will begin with and event type
9056+ * and subcategory. The event type must come first.
9057+ * The subcategory further defines the data that follows in the rest
9058+ * of the payload. Each category will have its own unique header plus
9059+ * any addtional data unique to the subcategory.
9060+ * The payload sent via the fc transport is one-way driver->application.
9061+ */
9062+
9063+/* els event header */
9064+struct lpfc_els_event_header {
9065+ uint32_t event_type;
9066+ uint32_t subcategory;
9067+ uint8_t wwpn[8];
9068+ uint8_t wwnn[8];
9069+};
9070+
9071+/* subcategory codes for FC_REG_ELS_EVENT */
9072+#define LPFC_EVENT_PLOGI_RCV 0x01
9073+#define LPFC_EVENT_PRLO_RCV 0x02
9074+#define LPFC_EVENT_ADISC_RCV 0x04
9075+#define LPFC_EVENT_LSRJT_RCV 0x08
9076+
9077+/* special els lsrjt event */
9078+struct lpfc_lsrjt_event {
9079+ struct lpfc_els_event_header header;
9080+ uint32_t command;
9081+ uint32_t reason_code;
9082+ uint32_t explanation;
9083+};
9084+
9085+
9086+/* fabric event header */
9087+struct lpfc_fabric_event_header {
9088+ uint32_t event_type;
9089+ uint32_t subcategory;
9090+ uint8_t wwpn[8];
9091+ uint8_t wwnn[8];
9092+};
9093+
9094+/* subcategory codes for FC_REG_FABRIC_EVENT */
9095+#define LPFC_EVENT_FABRIC_BUSY 0x01
9096+#define LPFC_EVENT_PORT_BUSY 0x02
9097+#define LPFC_EVENT_FCPRDCHKERR 0x04
9098+
9099+/* special case fabric fcprdchkerr event */
9100+struct lpfc_fcprdchkerr_event {
9101+ struct lpfc_fabric_event_header header;
9102+ uint32_t lun;
9103+ uint32_t opcode;
9104+ uint32_t fcpiparam;
9105+};
9106+
9107+
9108+/* scsi event header */
9109+struct lpfc_scsi_event_header {
9110+ uint32_t event_type;
9111+ uint32_t subcategory;
9112+ uint32_t lun;
9113+ uint8_t wwpn[8];
9114+ uint8_t wwnn[8];
9115+};
9116+
9117+/* subcategory codes for FC_REG_SCSI_EVENT */
9118+#define LPFC_EVENT_QFULL 0x0001
9119+#define LPFC_EVENT_DEVBSY 0x0002
9120+#define LPFC_EVENT_CHECK_COND 0x0004
9121+#define LPFC_EVENT_LUNRESET 0x0008
9122+#define LPFC_EVENT_TGTRESET 0x0010
9123+#define LPFC_EVENT_BUSRESET 0x0020
9124+#define LPFC_EVENT_VARQUEDEPTH 0x0040
9125+
9126+/* special case scsi varqueuedepth event */
9127+struct lpfc_scsi_varqueuedepth_event {
9128+ struct lpfc_scsi_event_header scsi_event;
9129+ uint32_t oldval;
9130+ uint32_t newval;
9131+};
9132+
9133+/* special case scsi check condition event */
9134+struct lpfc_scsi_check_condition_event {
9135+ struct lpfc_scsi_event_header scsi_event;
9136+ uint8_t sense_key;
9137+ uint8_t asc;
9138+ uint8_t ascq;
9139+};
9140+
9141+/* event codes for FC_REG_BOARD_EVENT */
9142+#define LPFC_EVENT_PORTINTERR 0x01
9143+
9144+/* board event header */
9145+struct lpfc_board_event_header {
9146+ uint32_t event_type;
9147+ uint32_t subcategory;
9148+};
9149+
9150+
9151+/* event codes for FC_REG_ADAPTER_EVENT */
9152+#define LPFC_EVENT_ARRIVAL 0x01
9153+
9154+/* adapter event header */
9155+struct lpfc_adapter_event_header {
9156+ uint32_t event_type;
9157+ uint32_t subcategory;
9158+};
9159+
9160+
9161+/* event codes for temp_event */
9162+#define LPFC_CRIT_TEMP 0x1
9163+#define LPFC_THRESHOLD_TEMP 0x2
9164+#define LPFC_NORMAL_TEMP 0x3
9165+
9166+struct temp_event {
9167+ uint32_t event_type;
9168+ uint32_t event_code;
9169+ uint32_t data;
9170+};
9171+
9172--- a/drivers/scsi/lpfc/lpfc_nportdisc.c
9173+++ b/drivers/scsi/lpfc/lpfc_nportdisc.c
9174@@ -30,6 +30,7 @@
9175
9176 #include "lpfc_hw.h"
9177 #include "lpfc_sli.h"
9178+#include "lpfc_nl.h"
9179 #include "lpfc_disc.h"
9180 #include "lpfc_scsi.h"
9181 #include "lpfc.h"
9182@@ -1003,20 +1004,8 @@ lpfc_rcv_plogi_adisc_issue(struct lpfc_v
9183 spin_lock_irq(shost->host_lock);
9184 ndlp->nlp_flag &= ~NLP_NPR_2B_DISC;
9185 spin_unlock_irq(shost->host_lock);
9186-
9187- if (vport->num_disc_nodes) {
9188+ if (vport->num_disc_nodes)
9189 lpfc_more_adisc(vport);
9190- if ((vport->num_disc_nodes == 0) &&
9191- (vport->fc_npr_cnt))
9192- lpfc_els_disc_plogi(vport);
9193- if (vport->num_disc_nodes == 0) {
9194- spin_lock_irq(shost->host_lock);
9195- vport->fc_flag &= ~FC_NDISC_ACTIVE;
9196- spin_unlock_irq(shost->host_lock);
9197- lpfc_can_disctmo(vport);
9198- lpfc_end_rscn(vport);
9199- }
9200- }
9201 }
9202 return ndlp->nlp_state;
9203 }
9204@@ -1865,8 +1854,13 @@ static uint32_t
9205 lpfc_cmpl_logo_npr_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
9206 void *arg, uint32_t evt)
9207 {
9208+ struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
9209+ if (ndlp->nlp_DID == Fabric_DID) {
9210+ spin_lock_irq(shost->host_lock);
9211+ vport->fc_flag &= ~(FC_FABRIC | FC_PUBLIC_LOOP);
9212+ spin_unlock_irq(shost->host_lock);
9213+ }
9214 lpfc_unreg_rpi(vport, ndlp);
9215- /* This routine does nothing, just return the current state */
9216 return ndlp->nlp_state;
9217 }
9218
9219@@ -2155,7 +2149,7 @@ lpfc_disc_state_machine(struct lpfc_vpor
9220 lpfc_nlp_put(ndlp);
9221 } else {
9222 lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
9223- "0212 DSM out state %d on NPort free\n", rc);
9224+ "0213 DSM out state %d on NPort free\n", rc);
9225
9226 lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_DSM,
9227 "DSM out: ste:%d did:x%x flg:x%x",
9228diff --git a/drivers/scsi/lpfc/lpfc_scsi.c b/drivers/scsi/lpfc/lpfc_scsi.c
9229index a22bdf9..e1d5421 100644
9230--- a/drivers/scsi/lpfc/lpfc_scsi.c
9231+++ b/drivers/scsi/lpfc/lpfc_scsi.c
9232@@ -32,6 +32,7 @@
9233 #include "lpfc_version.h"
9234 #include "lpfc_hw.h"
9235 #include "lpfc_sli.h"
9236+#include "lpfc_nl.h"
9237 #include "lpfc_disc.h"
9238 #include "lpfc_scsi.h"
9239 #include "lpfc.h"
9240@@ -42,6 +43,111 @@
9241 #define LPFC_RESET_WAIT 2
9242 #define LPFC_ABORT_WAIT 2
9243
9244+/**
9245+ * lpfc_update_stats: Update statistical data for the command completion.
9246+ * @phba: Pointer to HBA object.
9247+ * @lpfc_cmd: lpfc scsi command object pointer.
9248+ *
9249+ * This function is called when there is a command completion and this
9250+ * function updates the statistical data for the command completion.
9251+ **/
9252+static void
9253+lpfc_update_stats(struct lpfc_hba *phba, struct lpfc_scsi_buf *lpfc_cmd)
9254+{
9255+ struct lpfc_rport_data *rdata = lpfc_cmd->rdata;
9256+ struct lpfc_nodelist *pnode = rdata->pnode;
9257+ struct scsi_cmnd *cmd = lpfc_cmd->pCmd;
9258+ unsigned long flags;
9259+ struct Scsi_Host *shost = cmd->device->host;
9260+ struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
9261+ unsigned long latency;
9262+ int i;
9263+
9264+ if (cmd->result)
9265+ return;
9266+
9267+ spin_lock_irqsave(shost->host_lock, flags);
9268+ if (!vport->stat_data_enabled ||
9269+ vport->stat_data_blocked ||
9270+ !pnode->lat_data ||
9271+ (phba->bucket_type == LPFC_NO_BUCKET)) {
9272+ spin_unlock_irqrestore(shost->host_lock, flags);
9273+ return;
9274+ }
9275+ latency = jiffies_to_msecs(jiffies - lpfc_cmd->start_time);
9276+
9277+ if (phba->bucket_type == LPFC_LINEAR_BUCKET) {
9278+ i = (latency + phba->bucket_step - 1 - phba->bucket_base)/
9279+ phba->bucket_step;
9280+ if (i >= LPFC_MAX_BUCKET_COUNT)
9281+ i = LPFC_MAX_BUCKET_COUNT;
9282+ } else {
9283+ for (i = 0; i < LPFC_MAX_BUCKET_COUNT-1; i++)
9284+ if (latency <= (phba->bucket_base +
9285+ ((1<<i)*phba->bucket_step)))
9286+ break;
9287+ }
9288+
9289+ pnode->lat_data[i].cmd_count++;
9290+ spin_unlock_irqrestore(shost->host_lock, flags);
9291+}
9292+
9293+
9294+/**
9295+ * lpfc_send_sdev_queuedepth_change_event: Posts a queuedepth change
9296+ * event.
9297+ * @phba: Pointer to HBA context object.
9298+ * @vport: Pointer to vport object.
9299+ * @ndlp: Pointer to FC node associated with the target.
9300+ * @lun: Lun number of the scsi device.
9301+ * @old_val: Old value of the queue depth.
9302+ * @new_val: New value of the queue depth.
9303+ *
9304+ * This function sends an event to the mgmt application indicating
9305+ * there is a change in the scsi device queue depth.
9306+ **/
9307+static void
9308+lpfc_send_sdev_queuedepth_change_event(struct lpfc_hba *phba,
9309+ struct lpfc_vport *vport,
9310+ struct lpfc_nodelist *ndlp,
9311+ uint32_t lun,
9312+ uint32_t old_val,
9313+ uint32_t new_val)
9314+{
9315+ struct lpfc_fast_path_event *fast_path_evt;
9316+ unsigned long flags;
9317+
9318+ fast_path_evt = lpfc_alloc_fast_evt(phba);
9319+ if (!fast_path_evt)
9320+ return;
9321+
9322+ fast_path_evt->un.queue_depth_evt.scsi_event.event_type =
9323+ FC_REG_SCSI_EVENT;
9324+ fast_path_evt->un.queue_depth_evt.scsi_event.subcategory =
9325+ LPFC_EVENT_VARQUEDEPTH;
9326+
9327+ /* Report all luns with change in queue depth */
9328+ fast_path_evt->un.queue_depth_evt.scsi_event.lun = lun;
9329+ if (ndlp && NLP_CHK_NODE_ACT(ndlp)) {
9330+ memcpy(&fast_path_evt->un.queue_depth_evt.scsi_event.wwpn,
9331+ &ndlp->nlp_portname, sizeof(struct lpfc_name));
9332+ memcpy(&fast_path_evt->un.queue_depth_evt.scsi_event.wwnn,
9333+ &ndlp->nlp_nodename, sizeof(struct lpfc_name));
9334+ }
9335+
9336+ fast_path_evt->un.queue_depth_evt.oldval = old_val;
9337+ fast_path_evt->un.queue_depth_evt.newval = new_val;
9338+ fast_path_evt->vport = vport;
9339+
9340+ fast_path_evt->work_evt.evt = LPFC_EVT_FASTPATH_MGMT_EVT;
9341+ spin_lock_irqsave(&phba->hbalock, flags);
9342+ list_add_tail(&fast_path_evt->work_evt.evt_listp, &phba->work_list);
9343+ spin_unlock_irqrestore(&phba->hbalock, flags);
9344+ lpfc_worker_wake_up(phba);
9345+
9346+ return;
9347+}
9348+
9349 /*
9350 * This function is called with no lock held when there is a resource
9351 * error in driver or in firmware.
9352@@ -117,9 +223,10 @@ lpfc_ramp_down_queue_handler(struct lpfc_hba *phba)
9353 struct lpfc_vport **vports;
9354 struct Scsi_Host *shost;
9355 struct scsi_device *sdev;
9356- unsigned long new_queue_depth;
9357+ unsigned long new_queue_depth, old_queue_depth;
9358 unsigned long num_rsrc_err, num_cmd_success;
9359 int i;
9360+ struct lpfc_rport_data *rdata;
9361
9362 num_rsrc_err = atomic_read(&phba->num_rsrc_err);
9363 num_cmd_success = atomic_read(&phba->num_cmd_success);
9364@@ -137,6 +244,7 @@ lpfc_ramp_down_queue_handler(struct lpfc_hba *phba)
9365 else
9366 new_queue_depth = sdev->queue_depth -
9367 new_queue_depth;
9368+ old_queue_depth = sdev->queue_depth;
9369 if (sdev->ordered_tags)
9370 scsi_adjust_queue_depth(sdev,
9371 MSG_ORDERED_TAG,
9372@@ -145,6 +253,13 @@ lpfc_ramp_down_queue_handler(struct lpfc_hba *phba)
9373 scsi_adjust_queue_depth(sdev,
9374 MSG_SIMPLE_TAG,
9375 new_queue_depth);
9376+ rdata = sdev->hostdata;
9377+ if (rdata)
9378+ lpfc_send_sdev_queuedepth_change_event(
9379+ phba, vports[i],
9380+ rdata->pnode,
9381+ sdev->lun, old_queue_depth,
9382+ new_queue_depth);
9383 }
9384 }
9385 lpfc_destroy_vport_work_array(phba, vports);
9386@@ -159,6 +274,7 @@ lpfc_ramp_up_queue_handler(struct lpfc_hba *phba)
9387 struct Scsi_Host *shost;
9388 struct scsi_device *sdev;
9389 int i;
9390+ struct lpfc_rport_data *rdata;
9391
9392 vports = lpfc_create_vport_work_array(phba);
9393 if (vports != NULL)
9394@@ -176,6 +292,14 @@ lpfc_ramp_up_queue_handler(struct lpfc_hba *phba)
9395 scsi_adjust_queue_depth(sdev,
9396 MSG_SIMPLE_TAG,
9397 sdev->queue_depth+1);
9398+ rdata = sdev->hostdata;
9399+ if (rdata)
9400+ lpfc_send_sdev_queuedepth_change_event(
9401+ phba, vports[i],
9402+ rdata->pnode,
9403+ sdev->lun,
9404+ sdev->queue_depth - 1,
9405+ sdev->queue_depth);
9406 }
9407 }
9408 lpfc_destroy_vport_work_array(phba, vports);
9409@@ -183,6 +307,35 @@ lpfc_ramp_up_queue_handler(struct lpfc_hba *phba)
9410 atomic_set(&phba->num_cmd_success, 0);
9411 }
9412
9413+/**
9414+ * lpfc_scsi_dev_block: set all scsi hosts to block state.
9415+ * @phba: Pointer to HBA context object.
9416+ *
9417+ * This function walks vport list and set each SCSI host to block state
9418+ * by invoking fc_remote_port_delete() routine. This function is invoked
9419+ * with EEH when device's PCI slot has been permanently disabled.
9420+ **/
9421+void
9422+lpfc_scsi_dev_block(struct lpfc_hba *phba)
9423+{
9424+ struct lpfc_vport **vports;
9425+ struct Scsi_Host *shost;
9426+ struct scsi_device *sdev;
9427+ struct fc_rport *rport;
9428+ int i;
9429+
9430+ vports = lpfc_create_vport_work_array(phba);
9431+ if (vports != NULL)
9432+ for (i = 0; i <= phba->max_vpi && vports[i] != NULL; i++) {
9433+ shost = lpfc_shost_from_vport(vports[i]);
9434+ shost_for_each_device(sdev, shost) {
9435+ rport = starget_to_rport(scsi_target(sdev));
9436+ fc_remote_port_delete(rport);
9437+ }
9438+ }
9439+ lpfc_destroy_vport_work_array(phba, vports);
9440+}
9441+
9442 /*
9443 * This routine allocates a scsi buffer, which contains all the necessary
9444 * information needed to initiate a SCSI I/O. The non-DMAable buffer region
9445@@ -198,7 +351,9 @@ lpfc_new_scsi_buf(struct lpfc_vport *vport)
9446 struct lpfc_scsi_buf *psb;
9447 struct ulp_bde64 *bpl;
9448 IOCB_t *iocb;
9449- dma_addr_t pdma_phys;
9450+ dma_addr_t pdma_phys_fcp_cmd;
9451+ dma_addr_t pdma_phys_fcp_rsp;
9452+ dma_addr_t pdma_phys_bpl;
9453 uint16_t iotag;
9454
9455 psb = kzalloc(sizeof(struct lpfc_scsi_buf), GFP_KERNEL);
9456@@ -238,40 +393,60 @@ lpfc_new_scsi_buf(struct lpfc_vport *vport)
9457
9458 /* Initialize local short-hand pointers. */
9459 bpl = psb->fcp_bpl;
9460- pdma_phys = psb->dma_handle;
9461+ pdma_phys_fcp_cmd = psb->dma_handle;
9462+ pdma_phys_fcp_rsp = psb->dma_handle + sizeof(struct fcp_cmnd);
9463+ pdma_phys_bpl = psb->dma_handle + sizeof(struct fcp_cmnd) +
9464+ sizeof(struct fcp_rsp);
9465
9466 /*
9467 * The first two bdes are the FCP_CMD and FCP_RSP. The balance are sg
9468 * list bdes. Initialize the first two and leave the rest for
9469 * queuecommand.
9470 */
9471- bpl->addrHigh = le32_to_cpu(putPaddrHigh(pdma_phys));
9472- bpl->addrLow = le32_to_cpu(putPaddrLow(pdma_phys));
9473- bpl->tus.f.bdeSize = sizeof (struct fcp_cmnd);
9474- bpl->tus.f.bdeFlags = BUFF_USE_CMND;
9475- bpl->tus.w = le32_to_cpu(bpl->tus.w);
9476- bpl++;
9477+ bpl[0].addrHigh = le32_to_cpu(putPaddrHigh(pdma_phys_fcp_cmd));
9478+ bpl[0].addrLow = le32_to_cpu(putPaddrLow(pdma_phys_fcp_cmd));
9479+ bpl[0].tus.f.bdeSize = sizeof(struct fcp_cmnd);
9480+ bpl[0].tus.f.bdeFlags = BUFF_TYPE_BDE_64;
9481+ bpl[0].tus.w = le32_to_cpu(bpl->tus.w);
9482
9483 /* Setup the physical region for the FCP RSP */
9484- pdma_phys += sizeof (struct fcp_cmnd);
9485- bpl->addrHigh = le32_to_cpu(putPaddrHigh(pdma_phys));
9486- bpl->addrLow = le32_to_cpu(putPaddrLow(pdma_phys));
9487- bpl->tus.f.bdeSize = sizeof (struct fcp_rsp);
9488- bpl->tus.f.bdeFlags = (BUFF_USE_CMND | BUFF_USE_RCV);
9489- bpl->tus.w = le32_to_cpu(bpl->tus.w);
9490+ bpl[1].addrHigh = le32_to_cpu(putPaddrHigh(pdma_phys_fcp_rsp));
9491+ bpl[1].addrLow = le32_to_cpu(putPaddrLow(pdma_phys_fcp_rsp));
9492+ bpl[1].tus.f.bdeSize = sizeof(struct fcp_rsp);
9493+ bpl[1].tus.f.bdeFlags = BUFF_TYPE_BDE_64;
9494+ bpl[1].tus.w = le32_to_cpu(bpl->tus.w);
9495
9496 /*
9497 * Since the IOCB for the FCP I/O is built into this lpfc_scsi_buf,
9498 * initialize it with all known data now.
9499 */
9500- pdma_phys += (sizeof (struct fcp_rsp));
9501 iocb = &psb->cur_iocbq.iocb;
9502 iocb->un.fcpi64.bdl.ulpIoTag32 = 0;
9503- iocb->un.fcpi64.bdl.addrHigh = putPaddrHigh(pdma_phys);
9504- iocb->un.fcpi64.bdl.addrLow = putPaddrLow(pdma_phys);
9505- iocb->un.fcpi64.bdl.bdeSize = (2 * sizeof (struct ulp_bde64));
9506- iocb->un.fcpi64.bdl.bdeFlags = BUFF_TYPE_BDL;
9507- iocb->ulpBdeCount = 1;
9508+ if (phba->sli_rev == 3) {
9509+ /* fill in immediate fcp command BDE */
9510+ iocb->un.fcpi64.bdl.bdeFlags = BUFF_TYPE_BDE_IMMED;
9511+ iocb->un.fcpi64.bdl.bdeSize = sizeof(struct fcp_cmnd);
9512+ iocb->un.fcpi64.bdl.addrLow = offsetof(IOCB_t,
9513+ unsli3.fcp_ext.icd);
9514+ iocb->un.fcpi64.bdl.addrHigh = 0;
9515+ iocb->ulpBdeCount = 0;
9516+ iocb->ulpLe = 0;
9517+ /* fill in responce BDE */
9518+ iocb->unsli3.fcp_ext.rbde.tus.f.bdeFlags = BUFF_TYPE_BDE_64;
9519+ iocb->unsli3.fcp_ext.rbde.tus.f.bdeSize =
9520+ sizeof(struct fcp_rsp);
9521+ iocb->unsli3.fcp_ext.rbde.addrLow =
9522+ putPaddrLow(pdma_phys_fcp_rsp);
9523+ iocb->unsli3.fcp_ext.rbde.addrHigh =
9524+ putPaddrHigh(pdma_phys_fcp_rsp);
9525+ } else {
9526+ iocb->un.fcpi64.bdl.bdeFlags = BUFF_TYPE_BLP_64;
9527+ iocb->un.fcpi64.bdl.bdeSize = (2 * sizeof(struct ulp_bde64));
9528+ iocb->un.fcpi64.bdl.addrLow = putPaddrLow(pdma_phys_bpl);
9529+ iocb->un.fcpi64.bdl.addrHigh = putPaddrHigh(pdma_phys_bpl);
9530+ iocb->ulpBdeCount = 1;
9531+ iocb->ulpLe = 1;
9532+ }
9533 iocb->ulpClass = CLASS3;
9534
9535 return psb;
9536@@ -313,8 +488,9 @@ lpfc_scsi_prep_dma_buf(struct lpfc_hba *phba, struct lpfc_scsi_buf *lpfc_cmd)
9537 struct fcp_cmnd *fcp_cmnd = lpfc_cmd->fcp_cmnd;
9538 struct ulp_bde64 *bpl = lpfc_cmd->fcp_bpl;
9539 IOCB_t *iocb_cmd = &lpfc_cmd->cur_iocbq.iocb;
9540+ struct ulp_bde64 *data_bde = iocb_cmd->unsli3.fcp_ext.dbde;
9541 dma_addr_t physaddr;
9542- uint32_t i, num_bde = 0;
9543+ uint32_t num_bde = 0;
9544 int nseg, datadir = scsi_cmnd->sc_data_direction;
9545
9546 /*
9547@@ -352,37 +528,159 @@ lpfc_scsi_prep_dma_buf(struct lpfc_hba *phba, struct lpfc_scsi_buf *lpfc_cmd)
9548 * during probe that limits the number of sg elements in any
9549 * single scsi command. Just run through the seg_cnt and format
9550 * the bde's.
9551+ * When using SLI-3 the driver will try to fit all the BDEs into
9552+ * the IOCB. If it can't then the BDEs get added to a BPL as it
9553+ * does for SLI-2 mode.
9554 */
9555- scsi_for_each_sg(scsi_cmnd, sgel, nseg, i) {
9556+ scsi_for_each_sg(scsi_cmnd, sgel, nseg, num_bde) {
9557 physaddr = sg_dma_address(sgel);
9558- bpl->addrLow = le32_to_cpu(putPaddrLow(physaddr));
9559- bpl->addrHigh = le32_to_cpu(putPaddrHigh(physaddr));
9560- bpl->tus.f.bdeSize = sg_dma_len(sgel);
9561- if (datadir == DMA_TO_DEVICE)
9562- bpl->tus.f.bdeFlags = 0;
9563- else
9564- bpl->tus.f.bdeFlags = BUFF_USE_RCV;
9565- bpl->tus.w = le32_to_cpu(bpl->tus.w);
9566- bpl++;
9567- num_bde++;
9568+ if (phba->sli_rev == 3 &&
9569+ nseg <= LPFC_EXT_DATA_BDE_COUNT) {
9570+ data_bde->tus.f.bdeFlags = BUFF_TYPE_BDE_64;
9571+ data_bde->tus.f.bdeSize = sg_dma_len(sgel);
9572+ data_bde->addrLow = putPaddrLow(physaddr);
9573+ data_bde->addrHigh = putPaddrHigh(physaddr);
9574+ data_bde++;
9575+ } else {
9576+ bpl->tus.f.bdeFlags = BUFF_TYPE_BDE_64;
9577+ bpl->tus.f.bdeSize = sg_dma_len(sgel);
9578+ bpl->tus.w = le32_to_cpu(bpl->tus.w);
9579+ bpl->addrLow =
9580+ le32_to_cpu(putPaddrLow(physaddr));
9581+ bpl->addrHigh =
9582+ le32_to_cpu(putPaddrHigh(physaddr));
9583+ bpl++;
9584+ }
9585 }
9586 }
9587
9588 /*
9589 * Finish initializing those IOCB fields that are dependent on the
9590- * scsi_cmnd request_buffer. Note that the bdeSize is explicitly
9591- * reinitialized since all iocb memory resources are used many times
9592- * for transmit, receive, and continuation bpl's.
9593+ * scsi_cmnd request_buffer. Note that for SLI-2 the bdeSize is
9594+ * explicitly reinitialized and for SLI-3 the extended bde count is
9595+ * explicitly reinitialized since all iocb memory resources are reused.
9596 */
9597- iocb_cmd->un.fcpi64.bdl.bdeSize = (2 * sizeof (struct ulp_bde64));
9598- iocb_cmd->un.fcpi64.bdl.bdeSize +=
9599- (num_bde * sizeof (struct ulp_bde64));
9600- iocb_cmd->ulpBdeCount = 1;
9601- iocb_cmd->ulpLe = 1;
9602+ if (phba->sli_rev == 3) {
9603+ if (num_bde > LPFC_EXT_DATA_BDE_COUNT) {
9604+ /*
9605+ * The extended IOCB format can only fit 3 BDE or a BPL.
9606+ * This I/O has more than 3 BDE so the 1st data bde will
9607+ * be a BPL that is filled in here.
9608+ */
9609+ physaddr = lpfc_cmd->dma_handle;
9610+ data_bde->tus.f.bdeFlags = BUFF_TYPE_BLP_64;
9611+ data_bde->tus.f.bdeSize = (num_bde *
9612+ sizeof(struct ulp_bde64));
9613+ physaddr += (sizeof(struct fcp_cmnd) +
9614+ sizeof(struct fcp_rsp) +
9615+ (2 * sizeof(struct ulp_bde64)));
9616+ data_bde->addrHigh = putPaddrHigh(physaddr);
9617+ data_bde->addrLow = putPaddrLow(physaddr);
9618+ /* ebde count includes the responce bde and data bpl */
9619+ iocb_cmd->unsli3.fcp_ext.ebde_count = 2;
9620+ } else {
9621+ /* ebde count includes the responce bde and data bdes */
9622+ iocb_cmd->unsli3.fcp_ext.ebde_count = (num_bde + 1);
9623+ }
9624+ } else {
9625+ iocb_cmd->un.fcpi64.bdl.bdeSize =
9626+ ((num_bde + 2) * sizeof(struct ulp_bde64));
9627+ }
9628 fcp_cmnd->fcpDl = cpu_to_be32(scsi_bufflen(scsi_cmnd));
9629 return 0;
9630 }
9631
9632+/**
9633+ * lpfc_send_scsi_error_event: Posts an event when there is SCSI error.
9634+ * @phba: Pointer to hba context object.
9635+ * @vport: Pointer to vport object.
9636+ * @lpfc_cmd: Pointer to lpfc scsi command which reported the error.
9637+ * @rsp_iocb: Pointer to response iocb object which reported error.
9638+ *
9639+ * This function posts an event when there is a SCSI command reporting
9640+ * error from the scsi device.
9641+ **/
9642+static void
9643+lpfc_send_scsi_error_event(struct lpfc_hba *phba, struct lpfc_vport *vport,
9644+ struct lpfc_scsi_buf *lpfc_cmd, struct lpfc_iocbq *rsp_iocb) {
9645+ struct scsi_cmnd *cmnd = lpfc_cmd->pCmd;
9646+ struct fcp_rsp *fcprsp = lpfc_cmd->fcp_rsp;
9647+ uint32_t resp_info = fcprsp->rspStatus2;
9648+ uint32_t scsi_status = fcprsp->rspStatus3;
9649+ uint32_t fcpi_parm = rsp_iocb->iocb.un.fcpi.fcpi_parm;
9650+ struct lpfc_fast_path_event *fast_path_evt = NULL;
9651+ struct lpfc_nodelist *pnode = lpfc_cmd->rdata->pnode;
9652+ unsigned long flags;
9653+
9654+ /* If there is queuefull or busy condition send a scsi event */
9655+ if ((cmnd->result == SAM_STAT_TASK_SET_FULL) ||
9656+ (cmnd->result == SAM_STAT_BUSY)) {
9657+ fast_path_evt = lpfc_alloc_fast_evt(phba);
9658+ if (!fast_path_evt)
9659+ return;
9660+ fast_path_evt->un.scsi_evt.event_type =
9661+ FC_REG_SCSI_EVENT;
9662+ fast_path_evt->un.scsi_evt.subcategory =
9663+ (cmnd->result == SAM_STAT_TASK_SET_FULL) ?
9664+ LPFC_EVENT_QFULL : LPFC_EVENT_DEVBSY;
9665+ fast_path_evt->un.scsi_evt.lun = cmnd->device->lun;
9666+ memcpy(&fast_path_evt->un.scsi_evt.wwpn,
9667+ &pnode->nlp_portname, sizeof(struct lpfc_name));
9668+ memcpy(&fast_path_evt->un.scsi_evt.wwnn,
9669+ &pnode->nlp_nodename, sizeof(struct lpfc_name));
9670+ } else if ((resp_info & SNS_LEN_VALID) && fcprsp->rspSnsLen &&
9671+ ((cmnd->cmnd[0] == READ_10) || (cmnd->cmnd[0] == WRITE_10))) {
9672+ fast_path_evt = lpfc_alloc_fast_evt(phba);
9673+ if (!fast_path_evt)
9674+ return;
9675+ fast_path_evt->un.check_cond_evt.scsi_event.event_type =
9676+ FC_REG_SCSI_EVENT;
9677+ fast_path_evt->un.check_cond_evt.scsi_event.subcategory =
9678+ LPFC_EVENT_CHECK_COND;
9679+ fast_path_evt->un.check_cond_evt.scsi_event.lun =
9680+ cmnd->device->lun;
9681+ memcpy(&fast_path_evt->un.check_cond_evt.scsi_event.wwpn,
9682+ &pnode->nlp_portname, sizeof(struct lpfc_name));
9683+ memcpy(&fast_path_evt->un.check_cond_evt.scsi_event.wwnn,
9684+ &pnode->nlp_nodename, sizeof(struct lpfc_name));
9685+ fast_path_evt->un.check_cond_evt.sense_key =
9686+ cmnd->sense_buffer[2] & 0xf;
9687+ fast_path_evt->un.check_cond_evt.asc = cmnd->sense_buffer[12];
9688+ fast_path_evt->un.check_cond_evt.ascq = cmnd->sense_buffer[13];
9689+ } else if ((cmnd->sc_data_direction == DMA_FROM_DEVICE) &&
9690+ fcpi_parm &&
9691+ ((be32_to_cpu(fcprsp->rspResId) != fcpi_parm) ||
9692+ ((scsi_status == SAM_STAT_GOOD) &&
9693+ !(resp_info & (RESID_UNDER | RESID_OVER))))) {
9694+ /*
9695+ * If status is good or resid does not match with fcp_param and
9696+ * there is valid fcpi_parm, then there is a read_check error
9697+ */
9698+ fast_path_evt = lpfc_alloc_fast_evt(phba);
9699+ if (!fast_path_evt)
9700+ return;
9701+ fast_path_evt->un.read_check_error.header.event_type =
9702+ FC_REG_FABRIC_EVENT;
9703+ fast_path_evt->un.read_check_error.header.subcategory =
9704+ LPFC_EVENT_FCPRDCHKERR;
9705+ memcpy(&fast_path_evt->un.read_check_error.header.wwpn,
9706+ &pnode->nlp_portname, sizeof(struct lpfc_name));
9707+ memcpy(&fast_path_evt->un.read_check_error.header.wwnn,
9708+ &pnode->nlp_nodename, sizeof(struct lpfc_name));
9709+ fast_path_evt->un.read_check_error.lun = cmnd->device->lun;
9710+ fast_path_evt->un.read_check_error.opcode = cmnd->cmnd[0];
9711+ fast_path_evt->un.read_check_error.fcpiparam =
9712+ fcpi_parm;
9713+ } else
9714+ return;
9715+
9716+ fast_path_evt->vport = vport;
9717+ spin_lock_irqsave(&phba->hbalock, flags);
9718+ list_add_tail(&fast_path_evt->work_evt.evt_listp, &phba->work_list);
9719+ spin_unlock_irqrestore(&phba->hbalock, flags);
9720+ lpfc_worker_wake_up(phba);
9721+ return;
9722+}
9723 static void
9724 lpfc_scsi_unprep_dma_buf(struct lpfc_hba * phba, struct lpfc_scsi_buf * psb)
9725 {
9726@@ -411,6 +709,7 @@ lpfc_handle_fcp_err(struct lpfc_vport *vport, struct lpfc_scsi_buf *lpfc_cmd,
9727 uint32_t rsplen = 0;
9728 uint32_t logit = LOG_FCP | LOG_FCP_ERROR;
9729
9730+
9731 /*
9732 * If this is a task management command, there is no
9733 * scsi packet associated with this lpfc_cmd. The driver
9734@@ -526,6 +825,7 @@ lpfc_handle_fcp_err(struct lpfc_vport *vport, struct lpfc_scsi_buf *lpfc_cmd,
9735
9736 out:
9737 cmnd->result = ScsiResult(host_status, scsi_status);
9738+ lpfc_send_scsi_error_event(vport->phba, vport, lpfc_cmd, rsp_iocb);
9739 }
9740
9741 static void
9742@@ -542,9 +842,11 @@ lpfc_scsi_cmd_iocb_cmpl(struct lpfc_hba *phba, struct lpfc_iocbq *pIocbIn,
9743 struct scsi_device *sdev, *tmp_sdev;
9744 int depth = 0;
9745 unsigned long flags;
9746+ struct lpfc_fast_path_event *fast_path_evt;
9747
9748 lpfc_cmd->result = pIocbOut->iocb.un.ulpWord[4];
9749 lpfc_cmd->status = pIocbOut->iocb.ulpStatus;
9750+ atomic_dec(&pnode->cmd_pending);
9751
9752 if (lpfc_cmd->status) {
9753 if (lpfc_cmd->status == IOSTAT_LOCAL_REJECT &&
9754@@ -570,12 +872,36 @@ lpfc_scsi_cmd_iocb_cmpl(struct lpfc_hba *phba, struct lpfc_iocbq *pIocbIn,
9755 break;
9756 case IOSTAT_NPORT_BSY:
9757 case IOSTAT_FABRIC_BSY:
9758- cmd->result = ScsiResult(DID_BUS_BUSY, 0);
9759+ cmd->result = ScsiResult(DID_TRANSPORT_DISRUPTED, 0);
9760+ fast_path_evt = lpfc_alloc_fast_evt(phba);
9761+ if (!fast_path_evt)
9762+ break;
9763+ fast_path_evt->un.fabric_evt.event_type =
9764+ FC_REG_FABRIC_EVENT;
9765+ fast_path_evt->un.fabric_evt.subcategory =
9766+ (lpfc_cmd->status == IOSTAT_NPORT_BSY) ?
9767+ LPFC_EVENT_PORT_BUSY : LPFC_EVENT_FABRIC_BUSY;
9768+ if (pnode && NLP_CHK_NODE_ACT(pnode)) {
9769+ memcpy(&fast_path_evt->un.fabric_evt.wwpn,
9770+ &pnode->nlp_portname,
9771+ sizeof(struct lpfc_name));
9772+ memcpy(&fast_path_evt->un.fabric_evt.wwnn,
9773+ &pnode->nlp_nodename,
9774+ sizeof(struct lpfc_name));
9775+ }
9776+ fast_path_evt->vport = vport;
9777+ fast_path_evt->work_evt.evt =
9778+ LPFC_EVT_FASTPATH_MGMT_EVT;
9779+ spin_lock_irqsave(&phba->hbalock, flags);
9780+ list_add_tail(&fast_path_evt->work_evt.evt_listp,
9781+ &phba->work_list);
9782+ spin_unlock_irqrestore(&phba->hbalock, flags);
9783+ lpfc_worker_wake_up(phba);
9784 break;
9785 case IOSTAT_LOCAL_REJECT:
9786- if (lpfc_cmd->result == RJT_UNAVAIL_PERM ||
9787+ if (lpfc_cmd->result == IOERR_INVALID_RPI ||
9788 lpfc_cmd->result == IOERR_NO_RESOURCES ||
9789- lpfc_cmd->result == RJT_LOGIN_REQUIRED) {
9790+ lpfc_cmd->result == IOERR_ABORT_REQUESTED) {
9791 cmd->result = ScsiResult(DID_REQUEUE, 0);
9792 break;
9793 } /* else: fall through */
9794@@ -586,7 +912,8 @@ lpfc_scsi_cmd_iocb_cmpl(struct lpfc_hba *phba, struct lpfc_iocbq *pIocbIn,
9795
9796 if (!pnode || !NLP_CHK_NODE_ACT(pnode)
9797 || (pnode->nlp_state != NLP_STE_MAPPED_NODE))
9798- cmd->result = ScsiResult(DID_BUS_BUSY, SAM_STAT_BUSY);
9799+ cmd->result = ScsiResult(DID_TRANSPORT_DISRUPTED,
9800+ SAM_STAT_BUSY);
9801 } else {
9802 cmd->result = ScsiResult(DID_OK, 0);
9803 }
9804@@ -602,8 +929,32 @@ lpfc_scsi_cmd_iocb_cmpl(struct lpfc_hba *phba, struct lpfc_iocbq *pIocbIn,
9805 scsi_get_resid(cmd));
9806 }
9807
9808+ lpfc_update_stats(phba, lpfc_cmd);
9809 result = cmd->result;
9810 sdev = cmd->device;
9811+ if (vport->cfg_max_scsicmpl_time &&
9812+ time_after(jiffies, lpfc_cmd->start_time +
9813+ msecs_to_jiffies(vport->cfg_max_scsicmpl_time))) {
9814+ spin_lock_irqsave(sdev->host->host_lock, flags);
9815+ if ((pnode->cmd_qdepth > atomic_read(&pnode->cmd_pending) &&
9816+ (atomic_read(&pnode->cmd_pending) > LPFC_MIN_TGT_QDEPTH) &&
9817+ ((cmd->cmnd[0] == READ_10) || (cmd->cmnd[0] == WRITE_10))))
9818+ pnode->cmd_qdepth = atomic_read(&pnode->cmd_pending);
9819+
9820+ pnode->last_change_time = jiffies;
9821+ spin_unlock_irqrestore(sdev->host->host_lock, flags);
9822+ } else if ((pnode->cmd_qdepth < LPFC_MAX_TGT_QDEPTH) &&
9823+ time_after(jiffies, pnode->last_change_time +
9824+ msecs_to_jiffies(LPFC_TGTQ_INTERVAL))) {
9825+ spin_lock_irqsave(sdev->host->host_lock, flags);
9826+ pnode->cmd_qdepth += pnode->cmd_qdepth *
9827+ LPFC_TGTQ_RAMPUP_PCENT / 100;
9828+ if (pnode->cmd_qdepth > LPFC_MAX_TGT_QDEPTH)
9829+ pnode->cmd_qdepth = LPFC_MAX_TGT_QDEPTH;
9830+ pnode->last_change_time = jiffies;
9831+ spin_unlock_irqrestore(sdev->host->host_lock, flags);
9832+ }
9833+
9834 lpfc_scsi_unprep_dma_buf(phba, lpfc_cmd);
9835 cmd->scsi_done(cmd);
9836
9837@@ -647,6 +998,9 @@ lpfc_scsi_cmd_iocb_cmpl(struct lpfc_hba *phba, struct lpfc_iocbq *pIocbIn,
9838 pnode->last_ramp_up_time = jiffies;
9839 }
9840 }
9841+ lpfc_send_sdev_queuedepth_change_event(phba, vport, pnode,
9842+ 0xFFFFFFFF,
9843+ sdev->queue_depth - 1, sdev->queue_depth);
9844 }
9845
9846 /*
9847@@ -676,6 +1030,9 @@ lpfc_scsi_cmd_iocb_cmpl(struct lpfc_hba *phba, struct lpfc_iocbq *pIocbIn,
9848 lpfc_printf_vlog(vport, KERN_WARNING, LOG_FCP,
9849 "0711 detected queue full - lun queue "
9850 "depth adjusted to %d.\n", depth);
9851+ lpfc_send_sdev_queuedepth_change_event(phba, vport,
9852+ pnode, 0xFFFFFFFF,
9853+ depth+1, depth);
9854 }
9855 }
9856
9857@@ -692,6 +1049,24 @@ lpfc_scsi_cmd_iocb_cmpl(struct lpfc_hba *phba, struct lpfc_iocbq *pIocbIn,
9858 lpfc_release_scsi_buf(phba, lpfc_cmd);
9859 }
9860
9861+/**
9862+ * lpfc_fcpcmd_to_iocb - copy the fcp_cmd data into the IOCB.
9863+ * @data: A pointer to the immediate command data portion of the IOCB.
9864+ * @fcp_cmnd: The FCP Command that is provided by the SCSI layer.
9865+ *
9866+ * The routine copies the entire FCP command from @fcp_cmnd to @data while
9867+ * byte swapping the data to big endian format for transmission on the wire.
9868+ **/
9869+static void
9870+lpfc_fcpcmd_to_iocb(uint8_t *data, struct fcp_cmnd *fcp_cmnd)
9871+{
9872+ int i, j;
9873+ for (i = 0, j = 0; i < sizeof(struct fcp_cmnd);
9874+ i += sizeof(uint32_t), j++) {
9875+ ((uint32_t *)data)[j] = cpu_to_be32(((uint32_t *)fcp_cmnd)[j]);
9876+ }
9877+}
9878+
9879 static void
9880 lpfc_scsi_prep_cmnd(struct lpfc_vport *vport, struct lpfc_scsi_buf *lpfc_cmd,
9881 struct lpfc_nodelist *pnode)
9882@@ -758,7 +1133,8 @@ lpfc_scsi_prep_cmnd(struct lpfc_vport *vport, struct lpfc_scsi_buf *lpfc_cmd,
9883 fcp_cmnd->fcpCntl3 = 0;
9884 phba->fc4ControlRequests++;
9885 }
9886-
9887+ if (phba->sli_rev == 3)
9888+ lpfc_fcpcmd_to_iocb(iocb_cmd->unsli3.fcp_ext.icd, fcp_cmnd);
9889 /*
9890 * Finish initializing those IOCB fields that are independent
9891 * of the scsi_cmnd request_buffer
9892@@ -798,11 +1174,13 @@ lpfc_scsi_prep_task_mgmt_cmd(struct lpfc_vport *vport,
9893 piocb = &piocbq->iocb;
9894
9895 fcp_cmnd = lpfc_cmd->fcp_cmnd;
9896- int_to_scsilun(lun, &lpfc_cmd->fcp_cmnd->fcp_lun);
9897+ /* Clear out any old data in the FCP command area */
9898+ memset(fcp_cmnd, 0, sizeof(struct fcp_cmnd));
9899+ int_to_scsilun(lun, &fcp_cmnd->fcp_lun);
9900 fcp_cmnd->fcpCntl2 = task_mgmt_cmd;
9901-
9902+ if (vport->phba->sli_rev == 3)
9903+ lpfc_fcpcmd_to_iocb(piocb->unsli3.fcp_ext.icd, fcp_cmnd);
9904 piocb->ulpCommand = CMD_FCP_ICMND64_CR;
9905-
9906 piocb->ulpContext = ndlp->nlp_rpi;
9907 if (ndlp->nlp_fcp_info & NLP_FCP_2_DEVICE) {
9908 piocb->ulpFCP2Rcvy = 1;
9909@@ -966,8 +1344,13 @@ lpfc_queuecommand(struct scsi_cmnd *cmnd, void (*done) (struct scsi_cmnd *))
9910 * Catch race where our node has transitioned, but the
9911 * transport is still transitioning.
9912 */
9913- if (!ndlp || !NLP_CHK_NODE_ACT(ndlp))
9914- goto out_target_busy;
9915+ if (!ndlp || !NLP_CHK_NODE_ACT(ndlp)) {
9916+ cmnd->result = ScsiResult(DID_TRANSPORT_DISRUPTED, 0);
9917+ goto out_fail_command;
9918+ }
9919+
9920+ if (atomic_read(&ndlp->cmd_pending) >= ndlp->cmd_qdepth)
9921+ goto out_host_busy;
9922
9923 lpfc_cmd = lpfc_get_scsi_buf(phba);
9924 if (lpfc_cmd == NULL) {
9925@@ -986,6 +1370,7 @@ lpfc_queuecommand(struct scsi_cmnd *cmnd, void (*done) (struct scsi_cmnd *))
9926 lpfc_cmd->pCmd = cmnd;
9927 lpfc_cmd->rdata = rdata;
9928 lpfc_cmd->timeout = 0;
9929+ lpfc_cmd->start_time = jiffies;
9930 cmnd->host_scribble = (unsigned char *)lpfc_cmd;
9931 cmnd->scsi_done = done;
9932
9933@@ -995,6 +1380,7 @@ lpfc_queuecommand(struct scsi_cmnd *cmnd, void (*done) (struct scsi_cmnd *))
9934
9935 lpfc_scsi_prep_cmnd(vport, lpfc_cmd, ndlp);
9936
9937+ atomic_inc(&ndlp->cmd_pending);
9938 err = lpfc_sli_issue_iocb(phba, &phba->sli.ring[psli->fcp_ring],
9939 &lpfc_cmd->cur_iocbq, SLI_IOCB_RET_IOCB);
9940 if (err)
9941@@ -1009,12 +1395,11 @@ lpfc_queuecommand(struct scsi_cmnd *cmnd, void (*done) (struct scsi_cmnd *))
9942 return 0;
9943
9944 out_host_busy_free_buf:
9945+ atomic_dec(&ndlp->cmd_pending);
9946 lpfc_scsi_unprep_dma_buf(phba, lpfc_cmd);
9947 lpfc_release_scsi_buf(phba, lpfc_cmd);
9948 out_host_busy:
9949 return SCSI_MLQUEUE_HOST_BUSY;
9950- out_target_busy:
9951- return SCSI_MLQUEUE_TARGET_BUSY;
9952
9953 out_fail_command:
9954 done(cmnd);
9955@@ -1146,6 +1531,7 @@ lpfc_device_reset_handler(struct scsi_cmnd *cmnd)
9956 int ret = SUCCESS;
9957 int status;
9958 int cnt;
9959+ struct lpfc_scsi_event_header scsi_event;
9960
9961 lpfc_block_error_handler(cmnd);
9962 /*
9963@@ -1164,6 +1550,19 @@ lpfc_device_reset_handler(struct scsi_cmnd *cmnd)
9964 break;
9965 pnode = rdata->pnode;
9966 }
9967+
9968+ scsi_event.event_type = FC_REG_SCSI_EVENT;
9969+ scsi_event.subcategory = LPFC_EVENT_TGTRESET;
9970+ scsi_event.lun = 0;
9971+ memcpy(scsi_event.wwpn, &pnode->nlp_portname, sizeof(struct lpfc_name));
9972+ memcpy(scsi_event.wwnn, &pnode->nlp_nodename, sizeof(struct lpfc_name));
9973+
9974+ fc_host_post_vendor_event(shost,
9975+ fc_get_event_number(),
9976+ sizeof(scsi_event),
9977+ (char *)&scsi_event,
9978+ SCSI_NL_VID_TYPE_PCI | PCI_VENDOR_ID_EMULEX);
9979+
9980 if (!rdata || pnode->nlp_state != NLP_STE_MAPPED_NODE) {
9981 lpfc_printf_vlog(vport, KERN_ERR, LOG_FCP,
9982 "0721 LUN Reset rport "
9983@@ -1243,10 +1642,23 @@ lpfc_bus_reset_handler(struct scsi_cmnd *cmnd)
9984 struct lpfc_hba *phba = vport->phba;
9985 struct lpfc_nodelist *ndlp = NULL;
9986 int match;
9987- int ret = SUCCESS, status, i;
9988+ int ret = SUCCESS, status = SUCCESS, i;
9989 int cnt;
9990 struct lpfc_scsi_buf * lpfc_cmd;
9991 unsigned long later;
9992+ struct lpfc_scsi_event_header scsi_event;
9993+
9994+ scsi_event.event_type = FC_REG_SCSI_EVENT;
9995+ scsi_event.subcategory = LPFC_EVENT_BUSRESET;
9996+ scsi_event.lun = 0;
9997+ memcpy(scsi_event.wwpn, &vport->fc_portname, sizeof(struct lpfc_name));
9998+ memcpy(scsi_event.wwnn, &vport->fc_nodename, sizeof(struct lpfc_name));
9999+
10000+ fc_host_post_vendor_event(shost,
10001+ fc_get_event_number(),
10002+ sizeof(scsi_event),
10003+ (char *)&scsi_event,
10004+ SCSI_NL_VID_TYPE_PCI | PCI_VENDOR_ID_EMULEX);
10005
10006 lpfc_block_error_handler(cmnd);
10007 /*
10008--- a/drivers/scsi/lpfc/lpfc_scsi.h
10009+++ b/drivers/scsi/lpfc/lpfc_scsi.h
10010@@ -107,6 +107,10 @@ struct fcp_cmnd {
10011
10012 };
10013
10014+struct lpfc_scsicmd_bkt {
10015+ uint32_t cmd_count;
10016+};
10017+
10018 struct lpfc_scsi_buf {
10019 struct list_head list;
10020 struct scsi_cmnd *pCmd;
10021@@ -139,6 +143,7 @@ struct lpfc_scsi_buf {
10022 */
10023 struct lpfc_iocbq cur_iocbq;
10024 wait_queue_head_t *waitq;
10025+ unsigned long start_time;
10026 };
10027
10028 #define LPFC_SCSI_DMA_EXT_SIZE 264
10029--- a/drivers/scsi/lpfc/lpfc_sli.c
10030+++ b/drivers/scsi/lpfc/lpfc_sli.c
10031@@ -32,6 +32,7 @@
10032
10033 #include "lpfc_hw.h"
10034 #include "lpfc_sli.h"
10035+#include "lpfc_nl.h"
10036 #include "lpfc_disc.h"
10037 #include "lpfc_scsi.h"
10038 #include "lpfc.h"
10039@@ -66,10 +67,16 @@ typedef enum _lpfc_iocb_type {
10040 LPFC_ABORT_IOCB
10041 } lpfc_iocb_type;
10042
10043- /* SLI-2/SLI-3 provide different sized iocbs. Given a pointer
10044- * to the start of the ring, and the slot number of the
10045- * desired iocb entry, calc a pointer to that entry.
10046- */
10047+/**
10048+ * lpfc_cmd_iocb: Get next command iocb entry in the ring.
10049+ * @phba: Pointer to HBA context object.
10050+ * @pring: Pointer to driver SLI ring object.
10051+ *
10052+ * This function returns pointer to next command iocb entry
10053+ * in the command ring. The caller must hold hbalock to prevent
10054+ * other threads consume the next command iocb.
10055+ * SLI-2/SLI-3 provide different sized iocbs.
10056+ **/
10057 static inline IOCB_t *
10058 lpfc_cmd_iocb(struct lpfc_hba *phba, struct lpfc_sli_ring *pring)
10059 {
10060@@ -77,6 +84,16 @@ lpfc_cmd_iocb(struct lpfc_hba *phba, str
10061 pring->cmdidx * phba->iocb_cmd_size);
10062 }
10063
10064+/**
10065+ * lpfc_resp_iocb: Get next response iocb entry in the ring.
10066+ * @phba: Pointer to HBA context object.
10067+ * @pring: Pointer to driver SLI ring object.
10068+ *
10069+ * This function returns pointer to next response iocb entry
10070+ * in the response ring. The caller must hold hbalock to make sure
10071+ * that no other thread consume the next response iocb.
10072+ * SLI-2/SLI-3 provide different sized iocbs.
10073+ **/
10074 static inline IOCB_t *
10075 lpfc_resp_iocb(struct lpfc_hba *phba, struct lpfc_sli_ring *pring)
10076 {
10077@@ -84,6 +101,15 @@ lpfc_resp_iocb(struct lpfc_hba *phba, st
10078 pring->rspidx * phba->iocb_rsp_size);
10079 }
10080
10081+/**
10082+ * __lpfc_sli_get_iocbq: Allocates an iocb object from iocb pool.
10083+ * @phba: Pointer to HBA context object.
10084+ *
10085+ * This function is called with hbalock held. This function
10086+ * allocates a new driver iocb object from the iocb pool. If the
10087+ * allocation is successful, it returns pointer to the newly
10088+ * allocated iocb object else it returns NULL.
10089+ **/
10090 static struct lpfc_iocbq *
10091 __lpfc_sli_get_iocbq(struct lpfc_hba *phba)
10092 {
10093@@ -94,6 +120,15 @@ __lpfc_sli_get_iocbq(struct lpfc_hba *ph
10094 return iocbq;
10095 }
10096
10097+/**
10098+ * lpfc_sli_get_iocbq: Allocates an iocb object from iocb pool.
10099+ * @phba: Pointer to HBA context object.
10100+ *
10101+ * This function is called with no lock held. This function
10102+ * allocates a new driver iocb object from the iocb pool. If the
10103+ * allocation is successful, it returns pointer to the newly
10104+ * allocated iocb object else it returns NULL.
10105+ **/
10106 struct lpfc_iocbq *
10107 lpfc_sli_get_iocbq(struct lpfc_hba *phba)
10108 {
10109@@ -106,6 +141,16 @@ lpfc_sli_get_iocbq(struct lpfc_hba *phba
10110 return iocbq;
10111 }
10112
10113+/**
10114+ * __lpfc_sli_release_iocbq: Release iocb to the iocb pool.
10115+ * @phba: Pointer to HBA context object.
10116+ * @iocbq: Pointer to driver iocb object.
10117+ *
10118+ * This function is called with hbalock held to release driver
10119+ * iocb object to the iocb pool. The iotag in the iocb object
10120+ * does not change for each use of the iocb object. This function
10121+ * clears all other fields of the iocb object when it is freed.
10122+ **/
10123 static void
10124 __lpfc_sli_release_iocbq(struct lpfc_hba *phba, struct lpfc_iocbq *iocbq)
10125 {
10126@@ -118,6 +163,14 @@ __lpfc_sli_release_iocbq(struct lpfc_hba
10127 list_add_tail(&iocbq->list, &phba->lpfc_iocb_list);
10128 }
10129
10130+/**
10131+ * lpfc_sli_release_iocbq: Release iocb to the iocb pool.
10132+ * @phba: Pointer to HBA context object.
10133+ * @iocbq: Pointer to driver iocb object.
10134+ *
10135+ * This function is called with no lock held to release the iocb to
10136+ * iocb pool.
10137+ **/
10138 void
10139 lpfc_sli_release_iocbq(struct lpfc_hba *phba, struct lpfc_iocbq *iocbq)
10140 {
10141@@ -131,10 +184,21 @@ lpfc_sli_release_iocbq(struct lpfc_hba *
10142 spin_unlock_irqrestore(&phba->hbalock, iflags);
10143 }
10144
10145-/*
10146- * Translate the iocb command to an iocb command type used to decide the final
10147- * disposition of each completed IOCB.
10148- */
10149+/**
10150+ * lpfc_sli_iocb_cmd_type: Get the iocb type.
10151+ * @iocb_cmnd : iocb command code.
10152+ *
10153+ * This function is called by ring event handler function to get the iocb type.
10154+ * This function translates the iocb command to an iocb command type used to
10155+ * decide the final disposition of each completed IOCB.
10156+ * The function returns
10157+ * LPFC_UNKNOWN_IOCB if it is an unsupported iocb
10158+ * LPFC_SOL_IOCB if it is a solicited iocb completion
10159+ * LPFC_ABORT_IOCB if it is an abort iocb
10160+ * LPFC_UNSOL_IOCB if it is an unsolicited iocb
10161+ *
10162+ * The caller is not required to hold any lock.
10163+ **/
10164 static lpfc_iocb_type
10165 lpfc_sli_iocb_cmd_type(uint8_t iocb_cmnd)
10166 {
10167@@ -230,6 +294,17 @@ lpfc_sli_iocb_cmd_type(uint8_t iocb_cmnd
10168 return type;
10169 }
10170
10171+/**
10172+ * lpfc_sli_ring_map: Issue config_ring mbox for all rings.
10173+ * @phba: Pointer to HBA context object.
10174+ *
10175+ * This function is called from SLI initialization code
10176+ * to configure every ring of the HBA's SLI interface. The
10177+ * caller is not required to hold any lock. This function issues
10178+ * a config_ring mailbox command for each ring.
10179+ * This function returns zero if successful else returns a negative
10180+ * error code.
10181+ **/
10182 static int
10183 lpfc_sli_ring_map(struct lpfc_hba *phba)
10184 {
10185@@ -262,6 +337,18 @@ lpfc_sli_ring_map(struct lpfc_hba *phba)
10186 return ret;
10187 }
10188
10189+/**
10190+ * lpfc_sli_ringtxcmpl_put: Adds new iocb to the txcmplq.
10191+ * @phba: Pointer to HBA context object.
10192+ * @pring: Pointer to driver SLI ring object.
10193+ * @piocb: Pointer to the driver iocb object.
10194+ *
10195+ * This function is called with hbalock held. The function adds the
10196+ * new iocb to txcmplq of the given ring. This function always returns
10197+ * 0. If this function is called for ELS ring, this function checks if
10198+ * there is a vport associated with the ELS command. This function also
10199+ * starts els_tmofunc timer if this is an ELS command.
10200+ **/
10201 static int
10202 lpfc_sli_ringtxcmpl_put(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,
10203 struct lpfc_iocbq *piocb)
10204@@ -282,6 +369,16 @@ lpfc_sli_ringtxcmpl_put(struct lpfc_hba
10205 return 0;
10206 }
10207
10208+/**
10209+ * lpfc_sli_ringtx_get: Get first element of the txq.
10210+ * @phba: Pointer to HBA context object.
10211+ * @pring: Pointer to driver SLI ring object.
10212+ *
10213+ * This function is called with hbalock held to get next
10214+ * iocb in txq of the given ring. If there is any iocb in
10215+ * the txq, the function returns first iocb in the list after
10216+ * removing the iocb from the list, else it returns NULL.
10217+ **/
10218 static struct lpfc_iocbq *
10219 lpfc_sli_ringtx_get(struct lpfc_hba *phba, struct lpfc_sli_ring *pring)
10220 {
10221@@ -293,14 +390,25 @@ lpfc_sli_ringtx_get(struct lpfc_hba *phb
10222 return cmd_iocb;
10223 }
10224
10225+/**
10226+ * lpfc_sli_next_iocb_slot: Get next iocb slot in the ring.
10227+ * @phba: Pointer to HBA context object.
10228+ * @pring: Pointer to driver SLI ring object.
10229+ *
10230+ * This function is called with hbalock held and the caller must post the
10231+ * iocb without releasing the lock. If the caller releases the lock,
10232+ * iocb slot returned by the function is not guaranteed to be available.
10233+ * The function returns pointer to the next available iocb slot if there
10234+ * is available slot in the ring, else it returns NULL.
10235+ * If the get index of the ring is ahead of the put index, the function
10236+ * will post an error attention event to the worker thread to take the
10237+ * HBA to offline state.
10238+ **/
10239 static IOCB_t *
10240 lpfc_sli_next_iocb_slot (struct lpfc_hba *phba, struct lpfc_sli_ring *pring)
10241 {
10242- struct lpfc_pgp *pgp = (phba->sli_rev == 3) ?
10243- &phba->slim2p->mbx.us.s3_pgp.port[pring->ringno] :
10244- &phba->slim2p->mbx.us.s2.port[pring->ringno];
10245+ struct lpfc_pgp *pgp = &phba->port_gp[pring->ringno];
10246 uint32_t max_cmd_idx = pring->numCiocb;
10247-
10248 if ((pring->next_cmdidx == pring->cmdidx) &&
10249 (++pring->next_cmdidx >= max_cmd_idx))
10250 pring->next_cmdidx = 0;
10251@@ -336,6 +444,18 @@ lpfc_sli_next_iocb_slot (struct lpfc_hba
10252 return lpfc_cmd_iocb(phba, pring);
10253 }
10254
10255+/**
10256+ * lpfc_sli_next_iotag: Get an iotag for the iocb.
10257+ * @phba: Pointer to HBA context object.
10258+ * @iocbq: Pointer to driver iocb object.
10259+ *
10260+ * This function gets an iotag for the iocb. If there is no unused iotag and
10261+ * the iocbq_lookup_len < 0xffff, this function allocates a bigger iotag_lookup
10262+ * array and assigns a new iotag.
10263+ * The function returns the allocated iotag if successful, else returns zero.
10264+ * Zero is not a valid iotag.
10265+ * The caller is not required to hold any lock.
10266+ **/
10267 uint16_t
10268 lpfc_sli_next_iotag(struct lpfc_hba *phba, struct lpfc_iocbq *iocbq)
10269 {
10270@@ -399,6 +519,20 @@ lpfc_sli_next_iotag(struct lpfc_hba *phb
10271 return 0;
10272 }
10273
10274+/**
10275+ * lpfc_sli_submit_iocb: Submit an iocb to the firmware.
10276+ * @phba: Pointer to HBA context object.
10277+ * @pring: Pointer to driver SLI ring object.
10278+ * @iocb: Pointer to iocb slot in the ring.
10279+ * @nextiocb: Pointer to driver iocb object which need to be
10280+ * posted to firmware.
10281+ *
10282+ * This function is called with hbalock held to post a new iocb to
10283+ * the firmware. This function copies the new iocb to ring iocb slot and
10284+ * updates the ring pointers. It adds the new iocb to txcmplq if there is
10285+ * a completion call back for this iocb else the function will free the
10286+ * iocb object.
10287+ **/
10288 static void
10289 lpfc_sli_submit_iocb(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,
10290 IOCB_t *iocb, struct lpfc_iocbq *nextiocb)
10291@@ -441,6 +575,18 @@ lpfc_sli_submit_iocb(struct lpfc_hba *ph
10292 writel(pring->cmdidx, &phba->host_gp[pring->ringno].cmdPutInx);
10293 }
10294
10295+/**
10296+ * lpfc_sli_update_full_ring: Update the chip attention register.
10297+ * @phba: Pointer to HBA context object.
10298+ * @pring: Pointer to driver SLI ring object.
10299+ *
10300+ * The caller is not required to hold any lock for calling this function.
10301+ * This function updates the chip attention bits for the ring to inform firmware
10302+ * that there are pending work to be done for this ring and requests an
10303+ * interrupt when there is space available in the ring. This function is
10304+ * called when the driver is unable to post more iocbs to the ring due
10305+ * to unavailability of space in the ring.
10306+ **/
10307 static void
10308 lpfc_sli_update_full_ring(struct lpfc_hba *phba, struct lpfc_sli_ring *pring)
10309 {
10310@@ -460,6 +606,15 @@ lpfc_sli_update_full_ring(struct lpfc_hb
10311 pring->stats.iocb_cmd_full++;
10312 }
10313
10314+/**
10315+ * lpfc_sli_update_ring: Update chip attention register.
10316+ * @phba: Pointer to HBA context object.
10317+ * @pring: Pointer to driver SLI ring object.
10318+ *
10319+ * This function updates the chip attention register bit for the
10320+ * given ring to inform HBA that there is more work to be done
10321+ * in this ring. The caller is not required to hold any lock.
10322+ **/
10323 static void
10324 lpfc_sli_update_ring(struct lpfc_hba *phba, struct lpfc_sli_ring *pring)
10325 {
10326@@ -468,11 +623,22 @@ lpfc_sli_update_ring(struct lpfc_hba *ph
10327 /*
10328 * Tell the HBA that there is work to do in this ring.
10329 */
10330- wmb();
10331- writel(CA_R0ATT << (ringno * 4), phba->CAregaddr);
10332- readl(phba->CAregaddr); /* flush */
10333+ if (!(phba->sli3_options & LPFC_SLI3_CRP_ENABLED)) {
10334+ wmb();
10335+ writel(CA_R0ATT << (ringno * 4), phba->CAregaddr);
10336+ readl(phba->CAregaddr); /* flush */
10337+ }
10338 }
10339
10340+/**
10341+ * lpfc_sli_resume_iocb: Process iocbs in the txq.
10342+ * @phba: Pointer to HBA context object.
10343+ * @pring: Pointer to driver SLI ring object.
10344+ *
10345+ * This function is called with hbalock held to post pending iocbs
10346+ * in the txq to the firmware. This function is called when driver
10347+ * detects space available in the ring.
10348+ **/
10349 static void
10350 lpfc_sli_resume_iocb(struct lpfc_hba *phba, struct lpfc_sli_ring *pring)
10351 {
10352@@ -504,6 +670,16 @@ lpfc_sli_resume_iocb(struct lpfc_hba *ph
10353 return;
10354 }
10355
10356+/**
10357+ * lpfc_sli_next_hbq_slot: Get next hbq entry for the HBQ.
10358+ * @phba: Pointer to HBA context object.
10359+ * @hbqno: HBQ number.
10360+ *
10361+ * This function is called with hbalock held to get the next
10362+ * available slot for the given HBQ. If there is free slot
10363+ * available for the HBQ it will return pointer to the next available
10364+ * HBQ entry else it will return NULL.
10365+ **/
10366 static struct lpfc_hbq_entry *
10367 lpfc_sli_next_hbq_slot(struct lpfc_hba *phba, uint32_t hbqno)
10368 {
10369@@ -539,6 +715,15 @@ lpfc_sli_next_hbq_slot(struct lpfc_hba *
10370 hbqp->hbqPutIdx;
10371 }
10372
10373+/**
10374+ * lpfc_sli_hbqbuf_free_all: Free all the hbq buffers.
10375+ * @phba: Pointer to HBA context object.
10376+ *
10377+ * This function is called with no lock held to free all the
10378+ * hbq buffers while uninitializing the SLI interface. It also
10379+ * frees the HBQ buffers returned by the firmware but not yet
10380+ * processed by the upper layers.
10381+ **/
10382 void
10383 lpfc_sli_hbqbuf_free_all(struct lpfc_hba *phba)
10384 {
10385@@ -584,6 +769,18 @@ lpfc_sli_hbqbuf_free_all(struct lpfc_hba
10386 spin_unlock_irqrestore(&phba->hbalock, flags);
10387 }
10388
10389+/**
10390+ * lpfc_sli_hbq_to_firmware: Post the hbq buffer to firmware.
10391+ * @phba: Pointer to HBA context object.
10392+ * @hbqno: HBQ number.
10393+ * @hbq_buf: Pointer to HBQ buffer.
10394+ *
10395+ * This function is called with the hbalock held to post a
10396+ * hbq buffer to the firmware. If the function finds an empty
10397+ * slot in the HBQ, it will post the buffer. The function will return
10398+ * pointer to the hbq entry if it successfully post the buffer
10399+ * else it will return NULL.
10400+ **/
10401 static struct lpfc_hbq_entry *
10402 lpfc_sli_hbq_to_firmware(struct lpfc_hba *phba, uint32_t hbqno,
10403 struct hbq_dmabuf *hbq_buf)
10404@@ -612,6 +809,7 @@ lpfc_sli_hbq_to_firmware(struct lpfc_hba
10405 return hbqe;
10406 }
10407
10408+/* HBQ for ELS and CT traffic. */
10409 static struct lpfc_hbq_init lpfc_els_hbq = {
10410 .rn = 1,
10411 .entry_count = 200,
10412@@ -623,6 +821,7 @@ static struct lpfc_hbq_init lpfc_els_hbq
10413 .add_count = 5,
10414 };
10415
10416+/* HBQ for the extra ring if needed */
10417 static struct lpfc_hbq_init lpfc_extra_hbq = {
10418 .rn = 1,
10419 .entry_count = 200,
10420@@ -634,51 +833,81 @@ static struct lpfc_hbq_init lpfc_extra_h
10421 .add_count = 5,
10422 };
10423
10424+/* Array of HBQs */
10425 struct lpfc_hbq_init *lpfc_hbq_defs[] = {
10426 &lpfc_els_hbq,
10427 &lpfc_extra_hbq,
10428 };
10429
10430+/**
10431+ * lpfc_sli_hbqbuf_fill_hbqs: Post more hbq buffers to HBQ.
10432+ * @phba: Pointer to HBA context object.
10433+ * @hbqno: HBQ number.
10434+ * @count: Number of HBQ buffers to be posted.
10435+ *
10436+ * This function is called with no lock held to post more hbq buffers to the
10437+ * given HBQ. The function returns the number of HBQ buffers successfully
10438+ * posted.
10439+ **/
10440 static int
10441 lpfc_sli_hbqbuf_fill_hbqs(struct lpfc_hba *phba, uint32_t hbqno, uint32_t count)
10442 {
10443- uint32_t i, start, end;
10444+ uint32_t i, posted = 0;
10445 unsigned long flags;
10446 struct hbq_dmabuf *hbq_buffer;
10447-
10448+ LIST_HEAD(hbq_buf_list);
10449 if (!phba->hbqs[hbqno].hbq_alloc_buffer)
10450 return 0;
10451
10452- start = phba->hbqs[hbqno].buffer_count;
10453- end = count + start;
10454- if (end > lpfc_hbq_defs[hbqno]->entry_count)
10455- end = lpfc_hbq_defs[hbqno]->entry_count;
10456-
10457+ if ((phba->hbqs[hbqno].buffer_count + count) >
10458+ lpfc_hbq_defs[hbqno]->entry_count)
10459+ count = lpfc_hbq_defs[hbqno]->entry_count -
10460+ phba->hbqs[hbqno].buffer_count;
10461+ if (!count)
10462+ return 0;
10463+ /* Allocate HBQ entries */
10464+ for (i = 0; i < count; i++) {
10465+ hbq_buffer = (phba->hbqs[hbqno].hbq_alloc_buffer)(phba);
10466+ if (!hbq_buffer)
10467+ break;
10468+ list_add_tail(&hbq_buffer->dbuf.list, &hbq_buf_list);
10469+ }
10470 /* Check whether HBQ is still in use */
10471 spin_lock_irqsave(&phba->hbalock, flags);
10472 if (!phba->hbq_in_use)
10473- goto out;
10474-
10475- /* Populate HBQ entries */
10476- for (i = start; i < end; i++) {
10477- hbq_buffer = (phba->hbqs[hbqno].hbq_alloc_buffer)(phba);
10478- if (!hbq_buffer)
10479- goto err;
10480- hbq_buffer->tag = (i | (hbqno << 16));
10481- if (lpfc_sli_hbq_to_firmware(phba, hbqno, hbq_buffer))
10482+ goto err;
10483+ while (!list_empty(&hbq_buf_list)) {
10484+ list_remove_head(&hbq_buf_list, hbq_buffer, struct hbq_dmabuf,
10485+ dbuf.list);
10486+ hbq_buffer->tag = (phba->hbqs[hbqno].buffer_count |
10487+ (hbqno << 16));
10488+ if (lpfc_sli_hbq_to_firmware(phba, hbqno, hbq_buffer)) {
10489 phba->hbqs[hbqno].buffer_count++;
10490- else
10491+ posted++;
10492+ } else
10493 (phba->hbqs[hbqno].hbq_free_buffer)(phba, hbq_buffer);
10494 }
10495-
10496- out:
10497 spin_unlock_irqrestore(&phba->hbalock, flags);
10498- return 0;
10499- err:
10500+ return posted;
10501+err:
10502 spin_unlock_irqrestore(&phba->hbalock, flags);
10503- return 1;
10504+ while (!list_empty(&hbq_buf_list)) {
10505+ list_remove_head(&hbq_buf_list, hbq_buffer, struct hbq_dmabuf,
10506+ dbuf.list);
10507+ (phba->hbqs[hbqno].hbq_free_buffer)(phba, hbq_buffer);
10508+ }
10509+ return 0;
10510 }
10511
10512+/**
10513+ * lpfc_sli_hbqbuf_add_hbqs: Post more HBQ buffers to firmware.
10514+ * @phba: Pointer to HBA context object.
10515+ * @qno: HBQ number.
10516+ *
10517+ * This function posts more buffers to the HBQ. This function
10518+ * is called with no lock held. The function returns the number of HBQ entries
10519+ * successfully allocated.
10520+ **/
10521 int
10522 lpfc_sli_hbqbuf_add_hbqs(struct lpfc_hba *phba, uint32_t qno)
10523 {
10524@@ -686,6 +915,15 @@ lpfc_sli_hbqbuf_add_hbqs(struct lpfc_hba
10525 lpfc_hbq_defs[qno]->add_count));
10526 }
10527
10528+/**
10529+ * lpfc_sli_hbqbuf_init_hbqs: Post initial buffers to the HBQ.
10530+ * @phba: Pointer to HBA context object.
10531+ * @qno: HBQ queue number.
10532+ *
10533+ * This function is called from SLI initialization code path with
10534+ * no lock held to post initial HBQ buffers to firmware. The
10535+ * function returns the number of HBQ entries successfully allocated.
10536+ **/
10537 static int
10538 lpfc_sli_hbqbuf_init_hbqs(struct lpfc_hba *phba, uint32_t qno)
10539 {
10540@@ -693,6 +931,16 @@ lpfc_sli_hbqbuf_init_hbqs(struct lpfc_hb
10541 lpfc_hbq_defs[qno]->init_count));
10542 }
10543
10544+/**
10545+ * lpfc_sli_hbqbuf_find: Find the hbq buffer associated with a tag.
10546+ * @phba: Pointer to HBA context object.
10547+ * @tag: Tag of the hbq buffer.
10548+ *
10549+ * This function is called with hbalock held. This function searches
10550+ * for the hbq buffer associated with the given tag in the hbq buffer
10551+ * list. If it finds the hbq buffer, it returns the hbq_buffer other wise
10552+ * it returns NULL.
10553+ **/
10554 static struct hbq_dmabuf *
10555 lpfc_sli_hbqbuf_find(struct lpfc_hba *phba, uint32_t tag)
10556 {
10557@@ -716,6 +964,15 @@ lpfc_sli_hbqbuf_find(struct lpfc_hba *ph
10558 return NULL;
10559 }
10560
10561+/**
10562+ * lpfc_sli_free_hbq: Give back the hbq buffer to firmware.
10563+ * @phba: Pointer to HBA context object.
10564+ * @hbq_buffer: Pointer to HBQ buffer.
10565+ *
10566+ * This function is called with hbalock. This function gives back
10567+ * the hbq buffer to firmware. If the HBQ does not have space to
10568+ * post the buffer, it will free the buffer.
10569+ **/
10570 void
10571 lpfc_sli_free_hbq(struct lpfc_hba *phba, struct hbq_dmabuf *hbq_buffer)
10572 {
10573@@ -729,6 +986,15 @@ lpfc_sli_free_hbq(struct lpfc_hba *phba,
10574 }
10575 }
10576
10577+/**
10578+ * lpfc_sli_chk_mbx_command: Check if the mailbox is a legitimate mailbox.
10579+ * @mbxCommand: mailbox command code.
10580+ *
10581+ * This function is called by the mailbox event handler function to verify
10582+ * that the completed mailbox command is a legitimate mailbox command. If the
10583+ * completed mailbox is not known to the function, it will return MBX_SHUTDOWN
10584+ * and the mailbox event handler will take the HBA offline.
10585+ **/
10586 static int
10587 lpfc_sli_chk_mbx_command(uint8_t mbxCommand)
10588 {
10589@@ -785,6 +1051,8 @@ lpfc_sli_chk_mbx_command(uint8_t mbxComm
10590 case MBX_REG_VPI:
10591 case MBX_UNREG_VPI:
10592 case MBX_HEARTBEAT:
10593+ case MBX_PORT_CAPABILITIES:
10594+ case MBX_PORT_IOV_CONTROL:
10595 ret = mbxCommand;
10596 break;
10597 default:
10598@@ -793,6 +1061,19 @@ lpfc_sli_chk_mbx_command(uint8_t mbxComm
10599 }
10600 return ret;
10601 }
10602+
10603+/**
10604+ * lpfc_sli_wake_mbox_wait: Completion handler for mbox issued from
10605+ * lpfc_sli_issue_mbox_wait.
10606+ * @phba: Pointer to HBA context object.
10607+ * @pmboxq: Pointer to mailbox command.
10608+ *
10609+ * This is completion handler function for mailbox commands issued from
10610+ * lpfc_sli_issue_mbox_wait function. This function is called by the
10611+ * mailbox event handler function with no lock held. This function
10612+ * will wake up thread waiting on the wait queue pointed by context1
10613+ * of the mailbox.
10614+ **/
10615 static void
10616 lpfc_sli_wake_mbox_wait(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmboxq)
10617 {
10618@@ -812,6 +1093,17 @@ lpfc_sli_wake_mbox_wait(struct lpfc_hba
10619 return;
10620 }
10621
10622+
10623+/**
10624+ * lpfc_sli_def_mbox_cmpl: Default mailbox completion handler.
10625+ * @phba: Pointer to HBA context object.
10626+ * @pmb: Pointer to mailbox object.
10627+ *
10628+ * This function is the default mailbox completion handler. It
10629+ * frees the memory resources associated with the completed mailbox
10630+ * command. If the completed command is a REG_LOGIN mailbox command,
10631+ * this function will issue a UREG_LOGIN to re-claim the RPI.
10632+ **/
10633 void
10634 lpfc_sli_def_mbox_cmpl(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)
10635 {
10636@@ -846,6 +1138,19 @@ lpfc_sli_def_mbox_cmpl(struct lpfc_hba *
10637 return;
10638 }
10639
10640+/**
10641+ * lpfc_sli_handle_mb_event: Handle mailbox completions from firmware.
10642+ * @phba: Pointer to HBA context object.
10643+ *
10644+ * This function is called with no lock held. This function processes all
10645+ * the completed mailbox commands and gives it to upper layers. The interrupt
10646+ * service routine processes mailbox completion interrupt and adds completed
10647+ * mailbox commands to the mboxq_cmpl queue and signals the worker thread.
10648+ * Worker thread call lpfc_sli_handle_mb_event, which will return the
10649+ * completed mailbox commands in mboxq_cmpl queue to the upper layers. This
10650+ * function returns the mailbox commands to the upper layer by calling the
10651+ * completion handler function of each mailbox.
10652+ **/
10653 int
10654 lpfc_sli_handle_mb_event(struct lpfc_hba *phba)
10655 {
10656@@ -953,6 +1258,18 @@ lpfc_sli_handle_mb_event(struct lpfc_hba
10657 return 0;
10658 }
10659
10660+/**
10661+ * lpfc_sli_replace_hbqbuff: Replace the HBQ buffer with a new buffer.
10662+ * @phba: Pointer to HBA context object.
10663+ * @tag: Tag for the HBQ buffer.
10664+ *
10665+ * This function is called from unsolicited event handler code path to get the
10666+ * HBQ buffer associated with an unsolicited iocb. This function is called with
10667+ * no lock held. It returns the buffer associated with the given tag and posts
10668+ * another buffer to the firmware. Note that the new buffer must be allocated
10669+ * before taking the hbalock and that the hba lock must be held until it is
10670+ * finished with the hbq entry swap.
10671+ **/
10672 static struct lpfc_dmabuf *
10673 lpfc_sli_replace_hbqbuff(struct lpfc_hba *phba, uint32_t tag)
10674 {
10675@@ -962,22 +1279,28 @@ lpfc_sli_replace_hbqbuff(struct lpfc_hba
10676 dma_addr_t phys; /* mapped address */
10677 unsigned long flags;
10678
10679+ hbqno = tag >> 16;
10680+ new_hbq_entry = (phba->hbqs[hbqno].hbq_alloc_buffer)(phba);
10681 /* Check whether HBQ is still in use */
10682 spin_lock_irqsave(&phba->hbalock, flags);
10683 if (!phba->hbq_in_use) {
10684+ if (new_hbq_entry)
10685+ (phba->hbqs[hbqno].hbq_free_buffer)(phba,
10686+ new_hbq_entry);
10687 spin_unlock_irqrestore(&phba->hbalock, flags);
10688 return NULL;
10689 }
10690
10691 hbq_entry = lpfc_sli_hbqbuf_find(phba, tag);
10692 if (hbq_entry == NULL) {
10693+ if (new_hbq_entry)
10694+ (phba->hbqs[hbqno].hbq_free_buffer)(phba,
10695+ new_hbq_entry);
10696 spin_unlock_irqrestore(&phba->hbalock, flags);
10697 return NULL;
10698 }
10699 list_del(&hbq_entry->dbuf.list);
10700
10701- hbqno = tag >> 16;
10702- new_hbq_entry = (phba->hbqs[hbqno].hbq_alloc_buffer)(phba);
10703 if (new_hbq_entry == NULL) {
10704 list_add_tail(&hbq_entry->dbuf.list, &phba->hbqbuf_in_list);
10705 spin_unlock_irqrestore(&phba->hbalock, flags);
10706@@ -997,6 +1320,18 @@ lpfc_sli_replace_hbqbuff(struct lpfc_hba
10707 return &new_hbq_entry->dbuf;
10708 }
10709
10710+/**
10711+ * lpfc_sli_get_buff: Get the buffer associated with the buffer tag.
10712+ * @phba: Pointer to HBA context object.
10713+ * @pring: Pointer to driver SLI ring object.
10714+ * @tag: buffer tag.
10715+ *
10716+ * This function is called with no lock held. When QUE_BUFTAG_BIT bit
10717+ * is set in the tag the buffer is posted for a particular exchange,
10718+ * the function will return the buffer without replacing the buffer.
10719+ * If the buffer is for unsolicited ELS or CT traffic, this function
10720+ * returns the buffer and also posts another buffer to the firmware.
10721+ **/
10722 static struct lpfc_dmabuf *
10723 lpfc_sli_get_buff(struct lpfc_hba *phba,
10724 struct lpfc_sli_ring *pring,
10725@@ -1008,6 +1343,21 @@ lpfc_sli_get_buff(struct lpfc_hba *phba,
10726 return lpfc_sli_replace_hbqbuff(phba, tag);
10727 }
10728
10729+
10730+/**
10731+ * lpfc_sli_process_unsol_iocb: Unsolicited iocb handler.
10732+ * @phba: Pointer to HBA context object.
10733+ * @pring: Pointer to driver SLI ring object.
10734+ * @saveq: Pointer to the unsolicited iocb.
10735+ *
10736+ * This function is called with no lock held by the ring event handler
10737+ * when there is an unsolicited iocb posted to the response ring by the
10738+ * firmware. This function gets the buffer associated with the iocbs
10739+ * and calls the event handler for the ring. This function handles both
10740+ * qring buffers and hbq buffers.
10741+ * When the function returns 1 the caller can free the iocb object otherwise
10742+ * upper layer functions will free the iocb objects.
10743+ **/
10744 static int
10745 lpfc_sli_process_unsol_iocb(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,
10746 struct lpfc_iocbq *saveq)
10747@@ -1192,6 +1542,18 @@ lpfc_sli_process_unsol_iocb(struct lpfc_
10748 return 1;
10749 }
10750
10751+/**
10752+ * lpfc_sli_iocbq_lookup: Find command iocb for the given response iocb.
10753+ * @phba: Pointer to HBA context object.
10754+ * @pring: Pointer to driver SLI ring object.
10755+ * @prspiocb: Pointer to response iocb object.
10756+ *
10757+ * This function looks up the iocb_lookup table to get the command iocb
10758+ * corresponding to the given response iocb using the iotag of the
10759+ * response iocb. This function is called with the hbalock held.
10760+ * This function returns the command iocb object if it finds the command
10761+ * iocb else returns NULL.
10762+ **/
10763 static struct lpfc_iocbq *
10764 lpfc_sli_iocbq_lookup(struct lpfc_hba *phba,
10765 struct lpfc_sli_ring *pring,
10766@@ -1217,6 +1579,23 @@ lpfc_sli_iocbq_lookup(struct lpfc_hba *p
10767 return NULL;
10768 }
10769
10770+/**
10771+ * lpfc_sli_process_sol_iocb: process solicited iocb completion.
10772+ * @phba: Pointer to HBA context object.
10773+ * @pring: Pointer to driver SLI ring object.
10774+ * @saveq: Pointer to the response iocb to be processed.
10775+ *
10776+ * This function is called by the ring event handler for non-fcp
10777+ * rings when there is a new response iocb in the response ring.
10778+ * The caller is not required to hold any locks. This function
10779+ * gets the command iocb associated with the response iocb and
10780+ * calls the completion handler for the command iocb. If there
10781+ * is no completion handler, the function will free the resources
10782+ * associated with command iocb. If the response iocb is for
10783+ * an already aborted command iocb, the status of the completion
10784+ * is changed to IOSTAT_LOCAL_REJECT/IOERR_SLI_ABORTED.
10785+ * This function always returns 1.
10786+ **/
10787 static int
10788 lpfc_sli_process_sol_iocb(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,
10789 struct lpfc_iocbq *saveq)
10790@@ -1233,6 +1612,17 @@ lpfc_sli_process_sol_iocb(struct lpfc_hb
10791 if (cmdiocbp) {
10792 if (cmdiocbp->iocb_cmpl) {
10793 /*
10794+ * If an ELS command failed send an event to mgmt
10795+ * application.
10796+ */
10797+ if (saveq->iocb.ulpStatus &&
10798+ (pring->ringno == LPFC_ELS_RING) &&
10799+ (cmdiocbp->iocb.ulpCommand ==
10800+ CMD_ELS_REQUEST64_CR))
10801+ lpfc_send_els_failure_event(phba,
10802+ cmdiocbp, saveq);
10803+
10804+ /*
10805 * Post all ELS completions to the worker thread.
10806 * All other are passed to the completion callback.
10807 */
10808@@ -1282,12 +1672,20 @@ lpfc_sli_process_sol_iocb(struct lpfc_hb
10809 return rc;
10810 }
10811
10812+/**
10813+ * lpfc_sli_rsp_pointers_error: Response ring pointer error handler.
10814+ * @phba: Pointer to HBA context object.
10815+ * @pring: Pointer to driver SLI ring object.
10816+ *
10817+ * This function is called from the iocb ring event handlers when
10818+ * put pointer is ahead of the get pointer for a ring. This function signal
10819+ * an error attention condition to the worker thread and the worker
10820+ * thread will transition the HBA to offline state.
10821+ **/
10822 static void
10823 lpfc_sli_rsp_pointers_error(struct lpfc_hba *phba, struct lpfc_sli_ring *pring)
10824 {
10825- struct lpfc_pgp *pgp = (phba->sli_rev == 3) ?
10826- &phba->slim2p->mbx.us.s3_pgp.port[pring->ringno] :
10827- &phba->slim2p->mbx.us.s2.port[pring->ringno];
10828+ struct lpfc_pgp *pgp = &phba->port_gp[pring->ringno];
10829 /*
10830 * Ring <ringno> handler: portRspPut <portRspPut> is bigger then
10831 * rsp ring <portRspMax>
10832@@ -1312,6 +1710,51 @@ lpfc_sli_rsp_pointers_error(struct lpfc_
10833 return;
10834 }
10835
10836+/**
10837+ * lpfc_poll_eratt: Error attention polling timer timeout handler.
10838+ * @ptr: Pointer to address of HBA context object.
10839+ *
10840+ * This function is invoked by the Error Attention polling timer when the
10841+ * timer times out. It will check the SLI Error Attention register for
10842+ * possible attention events. If so, it will post an Error Attention event
10843+ * and wake up worker thread to process it. Otherwise, it will set up the
10844+ * Error Attention polling timer for the next poll.
10845+ **/
10846+void lpfc_poll_eratt(unsigned long ptr)
10847+{
10848+ struct lpfc_hba *phba;
10849+ uint32_t eratt = 0;
10850+
10851+ phba = (struct lpfc_hba *)ptr;
10852+
10853+ /* Check chip HA register for error event */
10854+ eratt = lpfc_sli_check_eratt(phba);
10855+
10856+ if (eratt)
10857+ /* Tell the worker thread there is work to do */
10858+ lpfc_worker_wake_up(phba);
10859+ else
10860+ /* Restart the timer for next eratt poll */
10861+ mod_timer(&phba->eratt_poll, jiffies +
10862+ HZ * LPFC_ERATT_POLL_INTERVAL);
10863+ return;
10864+}
10865+
10866+/**
10867+ * lpfc_sli_poll_fcp_ring: Handle FCP ring completion in polling mode.
10868+ * @phba: Pointer to HBA context object.
10869+ *
10870+ * This function is called from lpfc_queuecommand, lpfc_poll_timeout,
10871+ * lpfc_abort_handler and lpfc_slave_configure when FCP_RING_POLLING
10872+ * is enabled.
10873+ *
10874+ * The caller does not hold any lock.
10875+ * The function processes each response iocb in the response ring until it
10876+ * finds an iocb with LE bit set and chains all the iocbs upto the iocb with
10877+ * LE bit set. The function will call the completion handler of the command iocb
10878+ * if the response iocb indicates a completion for a command iocb or it is
10879+ * an abort completion.
10880+ **/
10881 void lpfc_sli_poll_fcp_ring(struct lpfc_hba *phba)
10882 {
10883 struct lpfc_sli *psli = &phba->sli;
10884@@ -1320,7 +1763,7 @@ void lpfc_sli_poll_fcp_ring(struct lpfc_
10885 IOCB_t *entry = NULL;
10886 struct lpfc_iocbq *cmdiocbq = NULL;
10887 struct lpfc_iocbq rspiocbq;
10888- struct lpfc_pgp *pgp;
10889+ struct lpfc_pgp *pgp = &phba->port_gp[pring->ringno];
10890 uint32_t status;
10891 uint32_t portRspPut, portRspMax;
10892 int type;
10893@@ -1330,11 +1773,6 @@ void lpfc_sli_poll_fcp_ring(struct lpfc_
10894
10895 pring->stats.iocb_event++;
10896
10897- pgp = (phba->sli_rev == 3) ?
10898- &phba->slim2p->mbx.us.s3_pgp.port[pring->ringno] :
10899- &phba->slim2p->mbx.us.s2.port[pring->ringno];
10900-
10901-
10902 /*
10903 * The next available response entry should never exceed the maximum
10904 * entries. If it does, treat it as an adapter hardware error.
10905@@ -1372,8 +1810,8 @@ void lpfc_sli_poll_fcp_ring(struct lpfc_
10906 irsp->un.ulpWord[3],
10907 irsp->un.ulpWord[4],
10908 irsp->un.ulpWord[5],
10909- *(((uint32_t *) irsp) + 6),
10910- *(((uint32_t *) irsp) + 7));
10911+ *(uint32_t *)&irsp->un1,
10912+ *((uint32_t *)&irsp->un1 + 1));
10913 }
10914
10915 switch (type) {
10916@@ -1465,17 +1903,28 @@ void lpfc_sli_poll_fcp_ring(struct lpfc_
10917 return;
10918 }
10919
10920-/*
10921+/**
10922+ * lpfc_sli_handle_fast_ring_event: Handle ring events on FCP ring.
10923+ * @phba: Pointer to HBA context object.
10924+ * @pring: Pointer to driver SLI ring object.
10925+ * @mask: Host attention register mask for this ring.
10926+ *
10927+ * This function is called from the interrupt context when there is a ring
10928+ * event for the fcp ring. The caller does not hold any lock.
10929+ * The function processes each response iocb in the response ring until it
10930+ * finds an iocb with LE bit set and chains all the iocbs upto the iocb with
10931+ * LE bit set. The function will call the completion handler of the command iocb
10932+ * if the response iocb indicates a completion for a command iocb or it is
10933+ * an abort completion. The function will call lpfc_sli_process_unsol_iocb
10934+ * function if this is an unsolicited iocb.
10935 * This routine presumes LPFC_FCP_RING handling and doesn't bother
10936- * to check it explicitly.
10937- */
10938+ * to check it explicitly. This function always returns 1.
10939+ **/
10940 static int
10941 lpfc_sli_handle_fast_ring_event(struct lpfc_hba *phba,
10942 struct lpfc_sli_ring *pring, uint32_t mask)
10943 {
10944- struct lpfc_pgp *pgp = (phba->sli_rev == 3) ?
10945- &phba->slim2p->mbx.us.s3_pgp.port[pring->ringno] :
10946- &phba->slim2p->mbx.us.s2.port[pring->ringno];
10947+ struct lpfc_pgp *pgp = &phba->port_gp[pring->ringno];
10948 IOCB_t *irsp = NULL;
10949 IOCB_t *entry = NULL;
10950 struct lpfc_iocbq *cmdiocbq = NULL;
10951@@ -1548,8 +1997,8 @@ lpfc_sli_handle_fast_ring_event(struct l
10952 irsp->un.ulpWord[3],
10953 irsp->un.ulpWord[4],
10954 irsp->un.ulpWord[5],
10955- *(((uint32_t *) irsp) + 6),
10956- *(((uint32_t *) irsp) + 7));
10957+ *(uint32_t *)&irsp->un1,
10958+ *((uint32_t *)&irsp->un1 + 1));
10959 }
10960
10961 switch (type) {
10962@@ -1646,13 +2095,28 @@ lpfc_sli_handle_fast_ring_event(struct l
10963 return rc;
10964 }
10965
10966+/**
10967+ * lpfc_sli_handle_slow_ring_event: Handle ring events for non-FCP rings.
10968+ * @phba: Pointer to HBA context object.
10969+ * @pring: Pointer to driver SLI ring object.
10970+ * @mask: Host attention register mask for this ring.
10971+ *
10972+ * This function is called from the worker thread when there is a ring
10973+ * event for non-fcp rings. The caller does not hold any lock .
10974+ * The function processes each response iocb in the response ring until it
10975+ * finds an iocb with LE bit set and chains all the iocbs upto the iocb with
10976+ * LE bit set. The function will call lpfc_sli_process_sol_iocb function if the
10977+ * response iocb indicates a completion of a command iocb. The function
10978+ * will call lpfc_sli_process_unsol_iocb function if this is an unsolicited
10979+ * iocb. The function frees the resources or calls the completion handler if
10980+ * this iocb is an abort completion. The function returns 0 when the allocated
10981+ * iocbs are not freed, otherwise returns 1.
10982+ **/
10983 int
10984 lpfc_sli_handle_slow_ring_event(struct lpfc_hba *phba,
10985 struct lpfc_sli_ring *pring, uint32_t mask)
10986 {
10987- struct lpfc_pgp *pgp = (phba->sli_rev == 3) ?
10988- &phba->slim2p->mbx.us.s3_pgp.port[pring->ringno] :
10989- &phba->slim2p->mbx.us.s2.port[pring->ringno];
10990+ struct lpfc_pgp *pgp;
10991 IOCB_t *entry;
10992 IOCB_t *irsp = NULL;
10993 struct lpfc_iocbq *rspiocbp = NULL;
10994@@ -1666,6 +2130,7 @@ lpfc_sli_handle_slow_ring_event(struct l
10995 int rc = 1;
10996 unsigned long iflag;
10997
10998+ pgp = &phba->port_gp[pring->ringno];
10999 spin_lock_irqsave(&phba->hbalock, iflag);
11000 pring->stats.iocb_event++;
11001
11002@@ -1904,6 +2369,16 @@ lpfc_sli_handle_slow_ring_event(struct l
11003 return rc;
11004 }
11005
11006+/**
11007+ * lpfc_sli_abort_iocb_ring: Abort all iocbs in the ring.
11008+ * @phba: Pointer to HBA context object.
11009+ * @pring: Pointer to driver SLI ring object.
11010+ *
11011+ * This function aborts all iocbs in the given ring and frees all the iocb
11012+ * objects in txq. This function issues an abort iocb for all the iocb commands
11013+ * in txcmplq. The iocbs in the txcmplq is not guaranteed to complete before
11014+ * the return of this function. The caller is not required to hold any locks.
11015+ **/
11016 void
11017 lpfc_sli_abort_iocb_ring(struct lpfc_hba *phba, struct lpfc_sli_ring *pring)
11018 {
11019@@ -1943,6 +2418,83 @@ lpfc_sli_abort_iocb_ring(struct lpfc_hba
11020 }
11021 }
11022
11023+/**
11024+ * lpfc_sli_flush_fcp_rings: flush all iocbs in the fcp ring.
11025+ * @phba: Pointer to HBA context object.
11026+ *
11027+ * This function flushes all iocbs in the fcp ring and frees all the iocb
11028+ * objects in txq and txcmplq. This function will not issue abort iocbs
11029+ * for all the iocb commands in txcmplq, they will just be returned with
11030+ * IOERR_SLI_DOWN. This function is invoked with EEH when device's PCI
11031+ * slot has been permanently disabled.
11032+ **/
11033+void
11034+lpfc_sli_flush_fcp_rings(struct lpfc_hba *phba)
11035+{
11036+ LIST_HEAD(txq);
11037+ LIST_HEAD(txcmplq);
11038+ struct lpfc_iocbq *iocb;
11039+ IOCB_t *cmd = NULL;
11040+ struct lpfc_sli *psli = &phba->sli;
11041+ struct lpfc_sli_ring *pring;
11042+
11043+ /* Currently, only one fcp ring */
11044+ pring = &psli->ring[psli->fcp_ring];
11045+
11046+ spin_lock_irq(&phba->hbalock);
11047+ /* Retrieve everything on txq */
11048+ list_splice_init(&pring->txq, &txq);
11049+ pring->txq_cnt = 0;
11050+
11051+ /* Retrieve everything on the txcmplq */
11052+ list_splice_init(&pring->txcmplq, &txcmplq);
11053+ pring->txcmplq_cnt = 0;
11054+ spin_unlock_irq(&phba->hbalock);
11055+
11056+ /* Flush the txq */
11057+ while (!list_empty(&txq)) {
11058+ iocb = list_get_first(&txq, struct lpfc_iocbq, list);
11059+ cmd = &iocb->iocb;
11060+ list_del_init(&iocb->list);
11061+
11062+ if (!iocb->iocb_cmpl)
11063+ lpfc_sli_release_iocbq(phba, iocb);
11064+ else {
11065+ cmd->ulpStatus = IOSTAT_LOCAL_REJECT;
11066+ cmd->un.ulpWord[4] = IOERR_SLI_DOWN;
11067+ (iocb->iocb_cmpl) (phba, iocb, iocb);
11068+ }
11069+ }
11070+
11071+ /* Flush the txcmpq */
11072+ while (!list_empty(&txcmplq)) {
11073+ iocb = list_get_first(&txcmplq, struct lpfc_iocbq, list);
11074+ cmd = &iocb->iocb;
11075+ list_del_init(&iocb->list);
11076+
11077+ if (!iocb->iocb_cmpl)
11078+ lpfc_sli_release_iocbq(phba, iocb);
11079+ else {
11080+ cmd->ulpStatus = IOSTAT_LOCAL_REJECT;
11081+ cmd->un.ulpWord[4] = IOERR_SLI_DOWN;
11082+ (iocb->iocb_cmpl) (phba, iocb, iocb);
11083+ }
11084+ }
11085+}
11086+
11087+/**
11088+ * lpfc_sli_brdready: Check for host status bits.
11089+ * @phba: Pointer to HBA context object.
11090+ * @mask: Bit mask to be checked.
11091+ *
11092+ * This function reads the host status register and compares
11093+ * with the provided bit mask to check if HBA completed
11094+ * the restart. This function will wait in a loop for the
11095+ * HBA to complete restart. If the HBA does not restart within
11096+ * 15 iterations, the function will reset the HBA again. The
11097+ * function returns 1 when HBA fail to restart otherwise returns
11098+ * zero.
11099+ **/
11100 int
11101 lpfc_sli_brdready(struct lpfc_hba *phba, uint32_t mask)
11102 {
11103@@ -1990,6 +2542,13 @@ lpfc_sli_brdready(struct lpfc_hba *phba,
11104
11105 #define BARRIER_TEST_PATTERN (0xdeadbeef)
11106
11107+/**
11108+ * lpfc_reset_barrier: Make HBA ready for HBA reset.
11109+ * @phba: Pointer to HBA context object.
11110+ *
11111+ * This function is called before resetting an HBA. This
11112+ * function requests HBA to quiesce DMAs before a reset.
11113+ **/
11114 void lpfc_reset_barrier(struct lpfc_hba *phba)
11115 {
11116 uint32_t __iomem *resp_buf;
11117@@ -2063,6 +2622,17 @@ restore_hc:
11118 readl(phba->HCregaddr); /* flush */
11119 }
11120
11121+/**
11122+ * lpfc_sli_brdkill: Issue a kill_board mailbox command.
11123+ * @phba: Pointer to HBA context object.
11124+ *
11125+ * This function issues a kill_board mailbox command and waits for
11126+ * the error attention interrupt. This function is called for stopping
11127+ * the firmware processing. The caller is not required to hold any
11128+ * locks. This function calls lpfc_hba_down_post function to free
11129+ * any pending commands after the kill. The function will return 1 when it
11130+ * fails to kill the board else will return 0.
11131+ **/
11132 int
11133 lpfc_sli_brdkill(struct lpfc_hba *phba)
11134 {
11135@@ -2139,6 +2709,17 @@ lpfc_sli_brdkill(struct lpfc_hba *phba)
11136 return ha_copy & HA_ERATT ? 0 : 1;
11137 }
11138
11139+/**
11140+ * lpfc_sli_brdreset: Reset the HBA.
11141+ * @phba: Pointer to HBA context object.
11142+ *
11143+ * This function resets the HBA by writing HC_INITFF to the control
11144+ * register. After the HBA resets, this function resets all the iocb ring
11145+ * indices. This function disables PCI layer parity checking during
11146+ * the reset.
11147+ * This function returns 0 always.
11148+ * The caller is not required to hold any locks.
11149+ **/
11150 int
11151 lpfc_sli_brdreset(struct lpfc_hba *phba)
11152 {
11153@@ -2191,6 +2772,19 @@ lpfc_sli_brdreset(struct lpfc_hba *phba)
11154 return 0;
11155 }
11156
11157+/**
11158+ * lpfc_sli_brdrestart: Restart the HBA.
11159+ * @phba: Pointer to HBA context object.
11160+ *
11161+ * This function is called in the SLI initialization code path to
11162+ * restart the HBA. The caller is not required to hold any lock.
11163+ * This function writes MBX_RESTART mailbox command to the SLIM and
11164+ * resets the HBA. At the end of the function, it calls lpfc_hba_down_post
11165+ * function to free any pending commands. The function enables
11166+ * POST only during the first initialization. The function returns zero.
11167+ * The function does not guarantee completion of MBX_RESTART mailbox
11168+ * command before the return of this function.
11169+ **/
11170 int
11171 lpfc_sli_brdrestart(struct lpfc_hba *phba)
11172 {
11173@@ -2251,6 +2845,16 @@ lpfc_sli_brdrestart(struct lpfc_hba *phb
11174 return 0;
11175 }
11176
11177+/**
11178+ * lpfc_sli_chipset_init: Wait for the restart of the HBA after a restart.
11179+ * @phba: Pointer to HBA context object.
11180+ *
11181+ * This function is called after a HBA restart to wait for successful
11182+ * restart of the HBA. Successful restart of the HBA is indicated by
11183+ * HS_FFRDY and HS_MBRDY bits. If the HBA fails to restart even after 15
11184+ * iteration, the function will restart the HBA again. The function returns
11185+ * zero if HBA successfully restarted else returns negative error code.
11186+ **/
11187 static int
11188 lpfc_sli_chipset_init(struct lpfc_hba *phba)
11189 {
11190@@ -2336,12 +2940,25 @@ lpfc_sli_chipset_init(struct lpfc_hba *p
11191 return 0;
11192 }
11193
11194+/**
11195+ * lpfc_sli_hbq_count: Get the number of HBQs to be configured.
11196+ *
11197+ * This function calculates and returns the number of HBQs required to be
11198+ * configured.
11199+ **/
11200 int
11201 lpfc_sli_hbq_count(void)
11202 {
11203 return ARRAY_SIZE(lpfc_hbq_defs);
11204 }
11205
11206+/**
11207+ * lpfc_sli_hbq_entry_count: Calculate total number of hbq entries.
11208+ *
11209+ * This function adds the number of hbq entries in every HBQ to get
11210+ * the total number of hbq entries required for the HBA and returns
11211+ * the total count.
11212+ **/
11213 static int
11214 lpfc_sli_hbq_entry_count(void)
11215 {
11216@@ -2354,12 +2971,27 @@ lpfc_sli_hbq_entry_count(void)
11217 return count;
11218 }
11219
11220+/**
11221+ * lpfc_sli_hbq_size: Calculate memory required for all hbq entries.
11222+ *
11223+ * This function calculates amount of memory required for all hbq entries
11224+ * to be configured and returns the total memory required.
11225+ **/
11226 int
11227 lpfc_sli_hbq_size(void)
11228 {
11229 return lpfc_sli_hbq_entry_count() * sizeof(struct lpfc_hbq_entry);
11230 }
11231
11232+/**
11233+ * lpfc_sli_hbq_setup: configure and initialize HBQs.
11234+ * @phba: Pointer to HBA context object.
11235+ *
11236+ * This function is called during the SLI initialization to configure
11237+ * all the HBQs and post buffers to the HBQ. The caller is not
11238+ * required to hold any locks. This function will return zero if successful
11239+ * else it will return negative error code.
11240+ **/
11241 static int
11242 lpfc_sli_hbq_setup(struct lpfc_hba *phba)
11243 {
11244@@ -2415,15 +3047,26 @@ lpfc_sli_hbq_setup(struct lpfc_hba *phba
11245 mempool_free(pmb, phba->mbox_mem_pool);
11246
11247 /* Initially populate or replenish the HBQs */
11248- for (hbqno = 0; hbqno < hbq_count; ++hbqno) {
11249- if (lpfc_sli_hbqbuf_init_hbqs(phba, hbqno))
11250- return -ENOMEM;
11251- }
11252+ for (hbqno = 0; hbqno < hbq_count; ++hbqno)
11253+ lpfc_sli_hbqbuf_init_hbqs(phba, hbqno);
11254 return 0;
11255 }
11256
11257-static int
11258-lpfc_do_config_port(struct lpfc_hba *phba, int sli_mode)
11259+/**
11260+ * lpfc_sli_config_port: Issue config port mailbox command.
11261+ * @phba: Pointer to HBA context object.
11262+ * @sli_mode: sli mode - 2/3
11263+ *
11264+ * This function is called by the sli intialization code path
11265+ * to issue config_port mailbox command. This function restarts the
11266+ * HBA firmware and issues a config_port mailbox command to configure
11267+ * the SLI interface in the sli mode specified by sli_mode
11268+ * variable. The caller is not required to hold any locks.
11269+ * The function returns 0 if successful, else returns negative error
11270+ * code.
11271+ **/
11272+int
11273+lpfc_sli_config_port(struct lpfc_hba *phba, int sli_mode)
11274 {
11275 LPFC_MBOXQ_t *pmb;
11276 uint32_t resetcount = 0, rc = 0, done = 0;
11277@@ -2460,13 +3103,15 @@ lpfc_do_config_port(struct lpfc_hba *phb
11278 if (rc == -ERESTART) {
11279 phba->link_state = LPFC_LINK_UNKNOWN;
11280 continue;
11281- } else if (rc) {
11282+ } else if (rc)
11283 break;
11284- }
11285-
11286 phba->link_state = LPFC_INIT_MBX_CMDS;
11287 lpfc_config_port(phba, pmb);
11288 rc = lpfc_sli_issue_mbox(phba, pmb, MBX_POLL);
11289+ phba->sli3_options &= ~(LPFC_SLI3_NPIV_ENABLED |
11290+ LPFC_SLI3_HBQ_ENABLED |
11291+ LPFC_SLI3_CRP_ENABLED |
11292+ LPFC_SLI3_INB_ENABLED);
11293 if (rc != MBX_SUCCESS) {
11294 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
11295 "0442 Adapter failed to init, mbxCmd x%x "
11296@@ -2476,30 +3121,64 @@ lpfc_do_config_port(struct lpfc_hba *phb
11297 phba->sli.sli_flag &= ~LPFC_SLI2_ACTIVE;
11298 spin_unlock_irq(&phba->hbalock);
11299 rc = -ENXIO;
11300- } else {
11301+ } else
11302 done = 1;
11303- phba->max_vpi = (phba->max_vpi &&
11304- pmb->mb.un.varCfgPort.gmv) != 0
11305- ? pmb->mb.un.varCfgPort.max_vpi
11306- : 0;
11307- }
11308 }
11309-
11310 if (!done) {
11311 rc = -EINVAL;
11312 goto do_prep_failed;
11313 }
11314-
11315- if ((pmb->mb.un.varCfgPort.sli_mode == 3) &&
11316- (!pmb->mb.un.varCfgPort.cMA)) {
11317- rc = -ENXIO;
11318+ if (pmb->mb.un.varCfgPort.sli_mode == 3) {
11319+ if (!pmb->mb.un.varCfgPort.cMA) {
11320+ rc = -ENXIO;
11321+ goto do_prep_failed;
11322+ }
11323+ if (phba->max_vpi && pmb->mb.un.varCfgPort.gmv) {
11324+ phba->sli3_options |= LPFC_SLI3_NPIV_ENABLED;
11325+ phba->max_vpi = pmb->mb.un.varCfgPort.max_vpi;
11326+ } else
11327+ phba->max_vpi = 0;
11328+ if (pmb->mb.un.varCfgPort.gerbm)
11329+ phba->sli3_options |= LPFC_SLI3_HBQ_ENABLED;
11330+ if (pmb->mb.un.varCfgPort.gcrp)
11331+ phba->sli3_options |= LPFC_SLI3_CRP_ENABLED;
11332+ if (pmb->mb.un.varCfgPort.ginb) {
11333+ phba->sli3_options |= LPFC_SLI3_INB_ENABLED;
11334+ phba->port_gp = phba->mbox->us.s3_inb_pgp.port;
11335+ phba->inb_ha_copy = &phba->mbox->us.s3_inb_pgp.ha_copy;
11336+ phba->inb_counter = &phba->mbox->us.s3_inb_pgp.counter;
11337+ phba->inb_last_counter =
11338+ phba->mbox->us.s3_inb_pgp.counter;
11339+ } else {
11340+ phba->port_gp = phba->mbox->us.s3_pgp.port;
11341+ phba->inb_ha_copy = NULL;
11342+ phba->inb_counter = NULL;
11343+ }
11344+ } else {
11345+ phba->port_gp = phba->mbox->us.s2.port;
11346+ phba->inb_ha_copy = NULL;
11347+ phba->inb_counter = NULL;
11348+ phba->max_vpi = 0;
11349 }
11350-
11351 do_prep_failed:
11352 mempool_free(pmb, phba->mbox_mem_pool);
11353 return rc;
11354 }
11355
11356+
11357+/**
11358+ * lpfc_sli_hba_setup: SLI intialization function.
11359+ * @phba: Pointer to HBA context object.
11360+ *
11361+ * This function is the main SLI intialization function. This function
11362+ * is called by the HBA intialization code, HBA reset code and HBA
11363+ * error attention handler code. Caller is not required to hold any
11364+ * locks. This function issues config_port mailbox command to configure
11365+ * the SLI, setup iocb rings and HBQ rings. In the end the function
11366+ * calls the config_port_post function to issue init_link mailbox
11367+ * command and to start the discovery. The function will return zero
11368+ * if successful, else it will return negative error code.
11369+ **/
11370 int
11371 lpfc_sli_hba_setup(struct lpfc_hba *phba)
11372 {
11373@@ -2528,22 +3207,20 @@ lpfc_sli_hba_setup(struct lpfc_hba *phba
11374 break;
11375 }
11376
11377- rc = lpfc_do_config_port(phba, mode);
11378+ rc = lpfc_sli_config_port(phba, mode);
11379+
11380 if (rc && lpfc_sli_mode == 3)
11381 lpfc_printf_log(phba, KERN_ERR, LOG_INIT | LOG_VPORT,
11382 "1820 Unable to select SLI-3. "
11383 "Not supported by adapter.\n");
11384 if (rc && mode != 2)
11385- rc = lpfc_do_config_port(phba, 2);
11386+ rc = lpfc_sli_config_port(phba, 2);
11387 if (rc)
11388 goto lpfc_sli_hba_setup_error;
11389
11390 if (phba->sli_rev == 3) {
11391 phba->iocb_cmd_size = SLI3_IOCB_CMD_SIZE;
11392 phba->iocb_rsp_size = SLI3_IOCB_RSP_SIZE;
11393- phba->sli3_options |= LPFC_SLI3_ENABLED;
11394- phba->sli3_options |= LPFC_SLI3_HBQ_ENABLED;
11395-
11396 } else {
11397 phba->iocb_cmd_size = SLI2_IOCB_CMD_SIZE;
11398 phba->iocb_rsp_size = SLI2_IOCB_RSP_SIZE;
11399@@ -2558,8 +3235,7 @@ lpfc_sli_hba_setup(struct lpfc_hba *phba
11400 if (rc)
11401 goto lpfc_sli_hba_setup_error;
11402
11403- /* Init HBQs */
11404-
11405+ /* Init HBQs */
11406 if (phba->sli3_options & LPFC_SLI3_HBQ_ENABLED) {
11407 rc = lpfc_sli_hbq_setup(phba);
11408 if (rc)
11409@@ -2581,19 +3257,19 @@ lpfc_sli_hba_setup_error:
11410 return rc;
11411 }
11412
11413-/*! lpfc_mbox_timeout
11414- *
11415- * \pre
11416- * \post
11417- * \param hba Pointer to per struct lpfc_hba structure
11418- * \param l1 Pointer to the driver's mailbox queue.
11419- * \return
11420- * void
11421- *
11422- * \b Description:
11423+
11424+/**
11425+ * lpfc_mbox_timeout: Timeout call back function for mbox timer.
11426+ * @ptr: context object - pointer to hba structure.
11427 *
11428- * This routine handles mailbox timeout events at timer interrupt context.
11429- */
11430+ * This is the callback function for mailbox timer. The mailbox
11431+ * timer is armed when a new mailbox command is issued and the timer
11432+ * is deleted when the mailbox complete. The function is called by
11433+ * the kernel timer code when a mailbox does not complete within
11434+ * expected time. This function wakes up the worker thread to
11435+ * process the mailbox timeout and returns. All the processing is
11436+ * done by the worker thread function lpfc_mbox_timeout_handler.
11437+ **/
11438 void
11439 lpfc_mbox_timeout(unsigned long ptr)
11440 {
11441@@ -2612,6 +3288,15 @@ lpfc_mbox_timeout(unsigned long ptr)
11442 return;
11443 }
11444
11445+
11446+/**
11447+ * lpfc_mbox_timeout_handler: Worker thread function to handle mailbox timeout.
11448+ * @phba: Pointer to HBA context object.
11449+ *
11450+ * This function is called from worker thread when a mailbox command times out.
11451+ * The caller is not required to hold any locks. This function will reset the
11452+ * HBA and recover all the pending commands.
11453+ **/
11454 void
11455 lpfc_mbox_timeout_handler(struct lpfc_hba *phba)
11456 {
11457@@ -2666,6 +3351,32 @@ lpfc_mbox_timeout_handler(struct lpfc_hb
11458 return;
11459 }
11460
11461+/**
11462+ * lpfc_sli_issue_mbox: Issue a mailbox command to firmware.
11463+ * @phba: Pointer to HBA context object.
11464+ * @pmbox: Pointer to mailbox object.
11465+ * @flag: Flag indicating how the mailbox need to be processed.
11466+ *
11467+ * This function is called by discovery code and HBA management code
11468+ * to submit a mailbox command to firmware. This function gets the
11469+ * hbalock to protect the data structures.
11470+ * The mailbox command can be submitted in polling mode, in which case
11471+ * this function will wait in a polling loop for the completion of the
11472+ * mailbox.
11473+ * If the mailbox is submitted in no_wait mode (not polling) the
11474+ * function will submit the command and returns immediately without waiting
11475+ * for the mailbox completion. The no_wait is supported only when HBA
11476+ * is in SLI2/SLI3 mode - interrupts are enabled.
11477+ * The SLI interface allows only one mailbox pending at a time. If the
11478+ * mailbox is issued in polling mode and there is already a mailbox
11479+ * pending, then the function will return an error. If the mailbox is issued
11480+ * in NO_WAIT mode and there is a mailbox pending already, the function
11481+ * will return MBX_BUSY after queuing the mailbox into mailbox queue.
11482+ * The sli layer owns the mailbox object until the completion of mailbox
11483+ * command if this function return MBX_BUSY or MBX_SUCCESS. For all other
11484+ * return codes the caller owns the mailbox command after the return of
11485+ * the function.
11486+ **/
11487 int
11488 lpfc_sli_issue_mbox(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmbox, uint32_t flag)
11489 {
11490@@ -2676,7 +3387,7 @@ lpfc_sli_issue_mbox(struct lpfc_hba *phb
11491 int i;
11492 unsigned long timeout;
11493 unsigned long drvr_flag = 0;
11494- volatile uint32_t word0, ldata;
11495+ uint32_t word0, ldata;
11496 void __iomem *to_slim;
11497 int processing_queue = 0;
11498
11499@@ -2836,12 +3547,11 @@ lpfc_sli_issue_mbox(struct lpfc_hba *phb
11500
11501 if (psli->sli_flag & LPFC_SLI2_ACTIVE) {
11502 /* First copy command data to host SLIM area */
11503- lpfc_sli_pcimem_bcopy(mb, &phba->slim2p->mbx, MAILBOX_CMD_SIZE);
11504+ lpfc_sli_pcimem_bcopy(mb, phba->mbox, MAILBOX_CMD_SIZE);
11505 } else {
11506 if (mb->mbxCommand == MBX_CONFIG_PORT) {
11507 /* copy command data into host mbox for cmpl */
11508- lpfc_sli_pcimem_bcopy(mb, &phba->slim2p->mbx,
11509- MAILBOX_CMD_SIZE);
11510+ lpfc_sli_pcimem_bcopy(mb, phba->mbox, MAILBOX_CMD_SIZE);
11511 }
11512
11513 /* First copy mbox command data to HBA SLIM, skip past first
11514@@ -2851,7 +3561,7 @@ lpfc_sli_issue_mbox(struct lpfc_hba *phb
11515 MAILBOX_CMD_SIZE - sizeof (uint32_t));
11516
11517 /* Next copy over first word, with mbxOwner set */
11518- ldata = *((volatile uint32_t *)mb);
11519+ ldata = *((uint32_t *)mb);
11520 to_slim = phba->MBslimaddr;
11521 writel(ldata, to_slim);
11522 readl(to_slim); /* flush */
11523@@ -2883,7 +3593,7 @@ lpfc_sli_issue_mbox(struct lpfc_hba *phb
11524
11525 if (psli->sli_flag & LPFC_SLI2_ACTIVE) {
11526 /* First read mbox status word */
11527- word0 = *((volatile uint32_t *)&phba->slim2p->mbx);
11528+ word0 = *((uint32_t *)phba->mbox);
11529 word0 = le32_to_cpu(word0);
11530 } else {
11531 /* First read mbox status word */
11532@@ -2922,12 +3632,11 @@ lpfc_sli_issue_mbox(struct lpfc_hba *phb
11533
11534 if (psli->sli_flag & LPFC_SLI2_ACTIVE) {
11535 /* First copy command data */
11536- word0 = *((volatile uint32_t *)
11537- &phba->slim2p->mbx);
11538+ word0 = *((uint32_t *)phba->mbox);
11539 word0 = le32_to_cpu(word0);
11540 if (mb->mbxCommand == MBX_CONFIG_PORT) {
11541 MAILBOX_t *slimmb;
11542- volatile uint32_t slimword0;
11543+ uint32_t slimword0;
11544 /* Check real SLIM for any errors */
11545 slimword0 = readl(phba->MBslimaddr);
11546 slimmb = (MAILBOX_t *) & slimword0;
11547@@ -2948,8 +3657,7 @@ lpfc_sli_issue_mbox(struct lpfc_hba *phb
11548
11549 if (psli->sli_flag & LPFC_SLI2_ACTIVE) {
11550 /* copy results back to user */
11551- lpfc_sli_pcimem_bcopy(&phba->slim2p->mbx, mb,
11552- MAILBOX_CMD_SIZE);
11553+ lpfc_sli_pcimem_bcopy(phba->mbox, mb, MAILBOX_CMD_SIZE);
11554 } else {
11555 /* First copy command data */
11556 lpfc_memcpy_from_slim(mb, phba->MBslimaddr,
11557@@ -2980,9 +3688,16 @@ out_not_finished:
11558 return MBX_NOT_FINISHED;
11559 }
11560
11561-/*
11562- * Caller needs to hold lock.
11563- */
11564+/**
11565+ * __lpfc_sli_ringtx_put: Add an iocb to the txq.
11566+ * @phba: Pointer to HBA context object.
11567+ * @pring: Pointer to driver SLI ring object.
11568+ * @piocb: Pointer to address of newly added command iocb.
11569+ *
11570+ * This function is called with hbalock held to add a command
11571+ * iocb to the txq when SLI layer cannot submit the command iocb
11572+ * to the ring.
11573+ **/
11574 static void
11575 __lpfc_sli_ringtx_put(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,
11576 struct lpfc_iocbq *piocb)
11577@@ -2992,6 +3707,23 @@ __lpfc_sli_ringtx_put(struct lpfc_hba *p
11578 pring->txq_cnt++;
11579 }
11580
11581+/**
11582+ * lpfc_sli_next_iocb: Get the next iocb in the txq.
11583+ * @phba: Pointer to HBA context object.
11584+ * @pring: Pointer to driver SLI ring object.
11585+ * @piocb: Pointer to address of newly added command iocb.
11586+ *
11587+ * This function is called with hbalock held before a new
11588+ * iocb is submitted to the firmware. This function checks
11589+ * txq to flush the iocbs in txq to Firmware before
11590+ * submitting new iocbs to the Firmware.
11591+ * If there are iocbs in the txq which need to be submitted
11592+ * to firmware, lpfc_sli_next_iocb returns the first element
11593+ * of the txq after dequeuing it from txq.
11594+ * If there is no iocb in the txq then the function will return
11595+ * *piocb and *piocb is set to NULL. Caller needs to check
11596+ * *piocb to find if there are more commands in the txq.
11597+ **/
11598 static struct lpfc_iocbq *
11599 lpfc_sli_next_iocb(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,
11600 struct lpfc_iocbq **piocb)
11601@@ -3007,9 +3739,30 @@ lpfc_sli_next_iocb(struct lpfc_hba *phba
11602 return nextiocb;
11603 }
11604
11605-/*
11606- * Lockless version of lpfc_sli_issue_iocb.
11607- */
11608+/**
11609+ * __lpfc_sli_issue_iocb: Lockless version of lpfc_sli_issue_iocb.
11610+ * @phba: Pointer to HBA context object.
11611+ * @pring: Pointer to driver SLI ring object.
11612+ * @piocb: Pointer to command iocb.
11613+ * @flag: Flag indicating if this command can be put into txq.
11614+ *
11615+ * __lpfc_sli_issue_iocb is used by other functions in the driver
11616+ * to issue an iocb command to the HBA. If the PCI slot is recovering
11617+ * from error state or if HBA is resetting or if LPFC_STOP_IOCB_EVENT
11618+ * flag is turned on, the function returns IOCB_ERROR.
11619+ * When the link is down, this function allows only iocbs for
11620+ * posting buffers.
11621+ * This function finds next available slot in the command ring and
11622+ * posts the command to the available slot and writes the port
11623+ * attention register to request HBA start processing new iocb.
11624+ * If there is no slot available in the ring and
11625+ * flag & SLI_IOCB_RET_IOCB is set, the new iocb is added to the
11626+ * txq, otherwise the function returns IOCB_BUSY.
11627+ *
11628+ * This function is called with hbalock held.
11629+ * The function will return success after it successfully submit the
11630+ * iocb to firmware or after adding to the txq.
11631+ **/
11632 static int
11633 __lpfc_sli_issue_iocb(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,
11634 struct lpfc_iocbq *piocb, uint32_t flag)
11635@@ -3052,6 +3805,16 @@ __lpfc_sli_issue_iocb(struct lpfc_hba *p
11636 * can be issued if the link is not up.
11637 */
11638 switch (piocb->iocb.ulpCommand) {
11639+ case CMD_GEN_REQUEST64_CR:
11640+ case CMD_GEN_REQUEST64_CX:
11641+ if (!(phba->sli.sli_flag & LPFC_MENLO_MAINT) ||
11642+ (piocb->iocb.un.genreq64.w5.hcsw.Rctl !=
11643+ FC_FCP_CMND) ||
11644+ (piocb->iocb.un.genreq64.w5.hcsw.Type !=
11645+ MENLO_TRANSPORT_TYPE))
11646+
11647+ goto iocb_busy;
11648+ break;
11649 case CMD_QUE_RING_BUF_CN:
11650 case CMD_QUE_RING_BUF64_CN:
11651 /*
11652@@ -3106,6 +3869,19 @@ __lpfc_sli_issue_iocb(struct lpfc_hba *p
11653 }
11654
11655
11656+/**
11657+ * lpfc_sli_issue_iocb: Wrapper function for __lpfc_sli_issue_iocb.
11658+ * @phba: Pointer to HBA context object.
11659+ * @pring: Pointer to driver SLI ring object.
11660+ * @piocb: Pointer to command iocb.
11661+ * @flag: Flag indicating if this command can be put into txq.
11662+ *
11663+ * lpfc_sli_issue_iocb is a wrapper around __lpfc_sli_issue_iocb
11664+ * function. This function gets the hbalock and calls
11665+ * __lpfc_sli_issue_iocb function and will return the error returned
11666+ * by __lpfc_sli_issue_iocb function. This wrapper is used by
11667+ * functions which do not hold hbalock.
11668+ **/
11669 int
11670 lpfc_sli_issue_iocb(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,
11671 struct lpfc_iocbq *piocb, uint32_t flag)
11672@@ -3120,6 +3896,17 @@ lpfc_sli_issue_iocb(struct lpfc_hba *phb
11673 return rc;
11674 }
11675
11676+/**
11677+ * lpfc_extra_ring_setup: Extra ring setup function.
11678+ * @phba: Pointer to HBA context object.
11679+ *
11680+ * This function is called while driver attaches with the
11681+ * HBA to setup the extra ring. The extra ring is used
11682+ * only when driver needs to support target mode functionality
11683+ * or IP over FC functionalities.
11684+ *
11685+ * This function is called with no lock held.
11686+ **/
11687 static int
11688 lpfc_extra_ring_setup( struct lpfc_hba *phba)
11689 {
11690@@ -3155,6 +3942,19 @@ lpfc_extra_ring_setup( struct lpfc_hba *
11691 return 0;
11692 }
11693
11694+/**
11695+ * lpfc_sli_async_event_handler: ASYNC iocb handler function.
11696+ * @phba: Pointer to HBA context object.
11697+ * @pring: Pointer to driver SLI ring object.
11698+ * @iocbq: Pointer to iocb object.
11699+ *
11700+ * This function is called by the slow ring event handler
11701+ * function when there is an ASYNC event iocb in the ring.
11702+ * This function is called with no lock held.
11703+ * Currently this function handles only temperature related
11704+ * ASYNC events. The function decodes the temperature sensor
11705+ * event message and posts events for the management applications.
11706+ **/
11707 static void
11708 lpfc_sli_async_event_handler(struct lpfc_hba * phba,
11709 struct lpfc_sli_ring * pring, struct lpfc_iocbq * iocbq)
11710@@ -3210,6 +4010,17 @@ lpfc_sli_async_event_handler(struct lpfc
11711 }
11712
11713
11714+/**
11715+ * lpfc_sli_setup: SLI ring setup function.
11716+ * @phba: Pointer to HBA context object.
11717+ *
11718+ * lpfc_sli_setup sets up rings of the SLI interface with
11719+ * number of iocbs per ring and iotags. This function is
11720+ * called while driver attach to the HBA and before the
11721+ * interrupts are enabled. So there is no need for locking.
11722+ *
11723+ * This function always returns 0.
11724+ **/
11725 int
11726 lpfc_sli_setup(struct lpfc_hba *phba)
11727 {
11728@@ -3321,6 +4132,17 @@ lpfc_sli_setup(struct lpfc_hba *phba)
11729 return 0;
11730 }
11731
11732+/**
11733+ * lpfc_sli_queue_setup: Queue initialization function.
11734+ * @phba: Pointer to HBA context object.
11735+ *
11736+ * lpfc_sli_queue_setup sets up mailbox queues and iocb queues for each
11737+ * ring. This function also initializes ring indices of each ring.
11738+ * This function is called during the initialization of the SLI
11739+ * interface of an HBA.
11740+ * This function is called with no lock held and always returns
11741+ * 1.
11742+ **/
11743 int
11744 lpfc_sli_queue_setup(struct lpfc_hba *phba)
11745 {
11746@@ -3349,6 +4171,23 @@ lpfc_sli_queue_setup(struct lpfc_hba *ph
11747 return 1;
11748 }
11749
11750+/**
11751+ * lpfc_sli_host_down: Vport cleanup function.
11752+ * @vport: Pointer to virtual port object.
11753+ *
11754+ * lpfc_sli_host_down is called to clean up the resources
11755+ * associated with a vport before destroying virtual
11756+ * port data structures.
11757+ * This function does following operations:
11758+ * - Free discovery resources associated with this virtual
11759+ * port.
11760+ * - Free iocbs associated with this virtual port in
11761+ * the txq.
11762+ * - Send abort for all iocb commands associated with this
11763+ * vport in txcmplq.
11764+ *
11765+ * This function is called with no lock held and always returns 1.
11766+ **/
11767 int
11768 lpfc_sli_host_down(struct lpfc_vport *vport)
11769 {
11770@@ -3411,6 +4250,21 @@ lpfc_sli_host_down(struct lpfc_vport *vp
11771 return 1;
11772 }
11773
11774+/**
11775+ * lpfc_sli_hba_down: Resource cleanup function for the HBA.
11776+ * @phba: Pointer to HBA context object.
11777+ *
11778+ * This function cleans up all iocb, buffers, mailbox commands
11779+ * while shutting down the HBA. This function is called with no
11780+ * lock held and always returns 1.
11781+ * This function does the following to cleanup driver resources:
11782+ * - Free discovery resources for each virtual port
11783+ * - Cleanup any pending fabric iocbs
11784+ * - Iterate through the iocb txq and free each entry
11785+ * in the list.
11786+ * - Free up any buffer posted to the HBA
11787+ * - Free mailbox commands in the mailbox queue.
11788+ **/
11789 int
11790 lpfc_sli_hba_down(struct lpfc_hba *phba)
11791 {
11792@@ -3501,6 +4355,18 @@ lpfc_sli_hba_down(struct lpfc_hba *phba)
11793 return 1;
11794 }
11795
11796+/**
11797+ * lpfc_sli_pcimem_bcopy: SLI memory copy function.
11798+ * @srcp: Source memory pointer.
11799+ * @destp: Destination memory pointer.
11800+ * @cnt: Number of words required to be copied.
11801+ *
11802+ * This function is used for copying data between driver memory
11803+ * and the SLI memory. This function also changes the endianness
11804+ * of each word if native endianness is different from SLI
11805+ * endianness. This function can be called with or without
11806+ * lock.
11807+ **/
11808 void
11809 lpfc_sli_pcimem_bcopy(void *srcp, void *destp, uint32_t cnt)
11810 {
11811@@ -3518,6 +4384,17 @@ lpfc_sli_pcimem_bcopy(void *srcp, void *
11812 }
11813 }
11814
11815+
11816+/**
11817+ * lpfc_sli_ringpostbuf_put: Function to add a buffer to postbufq.
11818+ * @phba: Pointer to HBA context object.
11819+ * @pring: Pointer to driver SLI ring object.
11820+ * @mp: Pointer to driver buffer object.
11821+ *
11822+ * This function is called with no lock held.
11823+ * It always return zero after adding the buffer to the postbufq
11824+ * buffer list.
11825+ **/
11826 int
11827 lpfc_sli_ringpostbuf_put(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,
11828 struct lpfc_dmabuf *mp)
11829@@ -3531,6 +4408,18 @@ lpfc_sli_ringpostbuf_put(struct lpfc_hba
11830 return 0;
11831 }
11832
11833+/**
11834+ * lpfc_sli_get_buffer_tag: Tag allocation function for a buffer posted
11835+ * using CMD_QUE_XRI64_CX iocb.
11836+ * @phba: Pointer to HBA context object.
11837+ *
11838+ * When HBQ is enabled, buffers are searched based on tags. This function
11839+ * allocates a tag for buffer posted using CMD_QUE_XRI64_CX iocb. The
11840+ * tag is bit wise or-ed with QUE_BUFTAG_BIT to make sure that the tag
11841+ * does not conflict with tags of buffer posted for unsolicited events.
11842+ * The function returns the allocated tag. The function is called with
11843+ * no locks held.
11844+ **/
11845 uint32_t
11846 lpfc_sli_get_buffer_tag(struct lpfc_hba *phba)
11847 {
11848@@ -3545,6 +4434,22 @@ lpfc_sli_get_buffer_tag(struct lpfc_hba
11849 return phba->buffer_tag_count;
11850 }
11851
11852+/**
11853+ * lpfc_sli_ring_taggedbuf_get: Search HBQ buffer associated with
11854+ * posted using CMD_QUE_XRI64_CX iocb.
11855+ * @phba: Pointer to HBA context object.
11856+ * @pring: Pointer to driver SLI ring object.
11857+ * @tag: Buffer tag.
11858+ *
11859+ * Buffers posted using CMD_QUE_XRI64_CX iocb are in pring->postbufq
11860+ * list. After HBA DMA data to these buffers, CMD_IOCB_RET_XRI64_CX
11861+ * iocb is posted to the response ring with the tag of the buffer.
11862+ * This function searches the pring->postbufq list using the tag
11863+ * to find buffer associated with CMD_IOCB_RET_XRI64_CX
11864+ * iocb. If the buffer is found then lpfc_dmabuf object of the
11865+ * buffer is returned to the caller else NULL is returned.
11866+ * This function is called with no lock held.
11867+ **/
11868 struct lpfc_dmabuf *
11869 lpfc_sli_ring_taggedbuf_get(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,
11870 uint32_t tag)
11871@@ -3565,7 +4470,7 @@ lpfc_sli_ring_taggedbuf_get(struct lpfc_
11872
11873 spin_unlock_irq(&phba->hbalock);
11874 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
11875- "0410 Cannot find virtual addr for buffer tag on "
11876+ "0402 Cannot find virtual addr for buffer tag on "
11877 "ring %d Data x%lx x%p x%p x%x\n",
11878 pring->ringno, (unsigned long) tag,
11879 slp->next, slp->prev, pring->postbufq_cnt);
11880@@ -3573,6 +4478,23 @@ lpfc_sli_ring_taggedbuf_get(struct lpfc_
11881 return NULL;
11882 }
11883
11884+/**
11885+ * lpfc_sli_ringpostbuf_get: SLI2 buffer search function for
11886+ * unsolicited ct and els events.
11887+ * @phba: Pointer to HBA context object.
11888+ * @pring: Pointer to driver SLI ring object.
11889+ * @phys: DMA address of the buffer.
11890+ *
11891+ * This function searches the buffer list using the dma_address
11892+ * of unsolicited event to find the driver's lpfc_dmabuf object
11893+ * corresponding to the dma_address. The function returns the
11894+ * lpfc_dmabuf object if a buffer is found else it returns NULL.
11895+ * This function is called by the ct and els unsolicited event
11896+ * handlers to get the buffer associated with the unsolicited
11897+ * event.
11898+ *
11899+ * This function is called with no lock held.
11900+ **/
11901 struct lpfc_dmabuf *
11902 lpfc_sli_ringpostbuf_get(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,
11903 dma_addr_t phys)
11904@@ -3600,6 +4522,17 @@ lpfc_sli_ringpostbuf_get(struct lpfc_hba
11905 return NULL;
11906 }
11907
11908+/**
11909+ * lpfc_sli_abort_els_cmpl: Completion handler for the els abort iocbs.
11910+ * @phba: Pointer to HBA context object.
11911+ * @cmdiocb: Pointer to driver command iocb object.
11912+ * @rspiocb: Pointer to driver response iocb object.
11913+ *
11914+ * This function is the completion handler for the abort iocbs for
11915+ * ELS commands. This function is called from the ELS ring event
11916+ * handler with no lock held. This function frees memory resources
11917+ * associated with the abort iocb.
11918+ **/
11919 static void
11920 lpfc_sli_abort_els_cmpl(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
11921 struct lpfc_iocbq *rspiocb)
11922@@ -3665,6 +4598,17 @@ lpfc_sli_abort_els_cmpl(struct lpfc_hba
11923 return;
11924 }
11925
11926+/**
11927+ * lpfc_ignore_els_cmpl: Completion handler for aborted ELS command.
11928+ * @phba: Pointer to HBA context object.
11929+ * @cmdiocb: Pointer to driver command iocb object.
11930+ * @rspiocb: Pointer to driver response iocb object.
11931+ *
11932+ * The function is called from SLI ring event handler with no
11933+ * lock held. This function is the completion handler for ELS commands
11934+ * which are aborted. The function frees memory resources used for
11935+ * the aborted ELS commands.
11936+ **/
11937 static void
11938 lpfc_ignore_els_cmpl(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
11939 struct lpfc_iocbq *rspiocb)
11940@@ -3673,7 +4617,7 @@ lpfc_ignore_els_cmpl(struct lpfc_hba *ph
11941
11942 /* ELS cmd tag <ulpIoTag> completes */
11943 lpfc_printf_log(phba, KERN_INFO, LOG_ELS,
11944- "0133 Ignoring ELS cmd tag x%x completion Data: "
11945+ "0139 Ignoring ELS cmd tag x%x completion Data: "
11946 "x%x x%x x%x\n",
11947 irsp->ulpIoTag, irsp->ulpStatus,
11948 irsp->un.ulpWord[4], irsp->ulpTimeout);
11949@@ -3684,6 +4628,17 @@ lpfc_ignore_els_cmpl(struct lpfc_hba *ph
11950 return;
11951 }
11952
11953+/**
11954+ * lpfc_sli_issue_abort_iotag: Abort function for a command iocb.
11955+ * @phba: Pointer to HBA context object.
11956+ * @pring: Pointer to driver SLI ring object.
11957+ * @cmdiocb: Pointer to driver command iocb object.
11958+ *
11959+ * This function issues an abort iocb for the provided command
11960+ * iocb. This function is called with hbalock held.
11961+ * The function returns 0 when it fails due to memory allocation
11962+ * failure or when the command iocb is an abort request.
11963+ **/
11964 int
11965 lpfc_sli_issue_abort_iotag(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,
11966 struct lpfc_iocbq *cmdiocb)
11967@@ -3748,6 +4703,8 @@ lpfc_sli_issue_abort_iotag(struct lpfc_h
11968 iabt->un.acxri.abortIoTag, abtsiocbp->iotag);
11969 retval = __lpfc_sli_issue_iocb(phba, pring, abtsiocbp, 0);
11970
11971+ if (retval)
11972+ __lpfc_sli_release_iocbq(phba, abtsiocbp);
11973 abort_iotag_exit:
11974 /*
11975 * Caller to this routine should check for IOCB_ERROR
11976@@ -3757,6 +4714,29 @@ abort_iotag_exit:
11977 return retval;
11978 }
11979
11980+/**
11981+ * lpfc_sli_validate_fcp_iocb: Filtering function, used to find commands
11982+ * associated with a vport/SCSI target/lun.
11983+ * @iocbq: Pointer to driver iocb object.
11984+ * @vport: Pointer to driver virtual port object.
11985+ * @tgt_id: SCSI ID of the target.
11986+ * @lun_id: LUN ID of the scsi device.
11987+ * @ctx_cmd: LPFC_CTX_LUN/LPFC_CTX_TGT/LPFC_CTX_HOST
11988+ *
11989+ * This function acts as iocb filter for functions which abort or count
11990+ * all FCP iocbs pending on a lun/SCSI target/SCSI host. It will return
11991+ * 0 if the filtering criteria is met for the given iocb and will return
11992+ * 1 if the filtering criteria is not met.
11993+ * If ctx_cmd == LPFC_CTX_LUN, the function returns 0 only if the
11994+ * given iocb is for the SCSI device specified by vport, tgt_id and
11995+ * lun_id parameter.
11996+ * If ctx_cmd == LPFC_CTX_TGT, the function returns 0 only if the
11997+ * given iocb is for the SCSI target specified by vport and tgt_id
11998+ * parameters.
11999+ * If ctx_cmd == LPFC_CTX_HOST, the function returns 0 only if the
12000+ * given iocb is for the SCSI host associated with the given vport.
12001+ * This function is called with no locks held.
12002+ **/
12003 static int
12004 lpfc_sli_validate_fcp_iocb(struct lpfc_iocbq *iocbq, struct lpfc_vport *vport,
12005 uint16_t tgt_id, uint64_t lun_id,
12006@@ -3800,6 +4780,25 @@ lpfc_sli_validate_fcp_iocb(struct lpfc_i
12007 return rc;
12008 }
12009
12010+/**
12011+ * lpfc_sli_sum_iocb: Function to count the number of FCP iocbs pending.
12012+ * @vport: Pointer to virtual port.
12013+ * @tgt_id: SCSI ID of the target.
12014+ * @lun_id: LUN ID of the scsi device.
12015+ * @ctx_cmd: LPFC_CTX_LUN/LPFC_CTX_TGT/LPFC_CTX_HOST.
12016+ *
12017+ * This function returns number of FCP commands pending for the vport.
12018+ * When ctx_cmd == LPFC_CTX_LUN, the function returns number of FCP
12019+ * commands pending on the vport associated with SCSI device specified
12020+ * by tgt_id and lun_id parameters.
12021+ * When ctx_cmd == LPFC_CTX_TGT, the function returns number of FCP
12022+ * commands pending on the vport associated with SCSI target specified
12023+ * by tgt_id parameter.
12024+ * When ctx_cmd == LPFC_CTX_HOST, the function returns number of FCP
12025+ * commands pending on the vport.
12026+ * This function returns the number of iocbs which satisfy the filter.
12027+ * This function is called without any lock held.
12028+ **/
12029 int
12030 lpfc_sli_sum_iocb(struct lpfc_vport *vport, uint16_t tgt_id, uint64_t lun_id,
12031 lpfc_ctx_cmd ctx_cmd)
12032@@ -3819,6 +4818,17 @@ lpfc_sli_sum_iocb(struct lpfc_vport *vpo
12033 return sum;
12034 }
12035
12036+/**
12037+ * lpfc_sli_abort_fcp_cmpl: Completion handler function for an aborted
12038+ * FCP iocb.
12039+ * @phba: Pointer to HBA context object
12040+ * @cmdiocb: Pointer to command iocb object.
12041+ * @rspiocb: Pointer to response iocb object.
12042+ *
12043+ * This function is called when an aborted FCP iocb completes. This
12044+ * function is called by the ring event handler with no lock held.
12045+ * This function frees the iocb.
12046+ **/
12047 void
12048 lpfc_sli_abort_fcp_cmpl(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
12049 struct lpfc_iocbq *rspiocb)
12050@@ -3827,6 +4837,28 @@ lpfc_sli_abort_fcp_cmpl(struct lpfc_hba
12051 return;
12052 }
12053
12054+/**
12055+ * lpfc_sli_abort_iocb: This function issue abort for all SCSI commands
12056+ * pending on a SCSI host(vport)/target/lun.
12057+ * @vport: Pointer to virtual port.
12058+ * @pring: Pointer to driver SLI ring object.
12059+ * @tgt_id: SCSI ID of the target.
12060+ * @lun_id: LUN ID of the scsi device.
12061+ * @abort_cmd: LPFC_CTX_LUN/LPFC_CTX_TGT/LPFC_CTX_HOST.
12062+ *
12063+ * This function sends an abort command for every SCSI command
12064+ * associated with the given virtual port pending on the ring
12065+ * filtered by lpfc_sli_validate_fcp_iocb function.
12066+ * When abort_cmd == LPFC_CTX_LUN, the function sends abort only to the
12067+ * FCP iocbs associated with lun specified by tgt_id and lun_id
12068+ * parameters
12069+ * When abort_cmd == LPFC_CTX_TGT, the function sends abort only to the
12070+ * FCP iocbs associated with SCSI target specified by tgt_id parameter.
12071+ * When abort_cmd == LPFC_CTX_HOST, the function sends abort to all
12072+ * FCP iocbs associated with virtual port.
12073+ * This function returns number of iocbs it failed to abort.
12074+ * This function is called with no locks held.
12075+ **/
12076 int
12077 lpfc_sli_abort_iocb(struct lpfc_vport *vport, struct lpfc_sli_ring *pring,
12078 uint16_t tgt_id, uint64_t lun_id, lpfc_ctx_cmd abort_cmd)
12079@@ -3878,6 +4910,24 @@ lpfc_sli_abort_iocb(struct lpfc_vport *v
12080 return errcnt;
12081 }
12082
12083+/**
12084+ * lpfc_sli_wake_iocb_wait: iocb completion handler for iocb issued using
12085+ * lpfc_sli_issue_iocb_wait.
12086+ * @phba: Pointer to HBA context object.
12087+ * @cmdiocbq: Pointer to command iocb.
12088+ * @rspiocbq: Pointer to response iocb.
12089+ *
12090+ * This function is the completion handler for iocbs issued using
12091+ * lpfc_sli_issue_iocb_wait function. This function is called by the
12092+ * ring event handler function without any lock held. This function
12093+ * can be called from both worker thread context and interrupt
12094+ * context. This function also can be called from other thread which
12095+ * cleans up the SLI layer objects.
12096+ * This function copy the contents of the response iocb to the
12097+ * response iocb memory object provided by the caller of
12098+ * lpfc_sli_issue_iocb_wait and then wakes up the thread which
12099+ * sleeps for the iocb completion.
12100+ **/
12101 static void
12102 lpfc_sli_wake_iocb_wait(struct lpfc_hba *phba,
12103 struct lpfc_iocbq *cmdiocbq,
12104@@ -3899,13 +4949,36 @@ lpfc_sli_wake_iocb_wait(struct lpfc_hba
12105 return;
12106 }
12107
12108-/*
12109- * Issue the caller's iocb and wait for its completion, but no longer than the
12110- * caller's timeout. Note that iocb_flags is cleared before the
12111- * lpfc_sli_issue_call since the wake routine sets a unique value and by
12112- * definition this is a wait function.
12113- */
12114-
12115+/**
12116+ * lpfc_sli_issue_iocb_wait: Synchronous function to issue iocb commands.
12117+ * @phba: Pointer to HBA context object..
12118+ * @pring: Pointer to sli ring.
12119+ * @piocb: Pointer to command iocb.
12120+ * @prspiocbq: Pointer to response iocb.
12121+ * @timeout: Timeout in number of seconds.
12122+ *
12123+ * This function issues the iocb to firmware and waits for the
12124+ * iocb to complete. If the iocb command is not
12125+ * completed within timeout seconds, it returns IOCB_TIMEDOUT.
12126+ * Caller should not free the iocb resources if this function
12127+ * returns IOCB_TIMEDOUT.
12128+ * The function waits for the iocb completion using an
12129+ * non-interruptible wait.
12130+ * This function will sleep while waiting for iocb completion.
12131+ * So, this function should not be called from any context which
12132+ * does not allow sleeping. Due to the same reason, this function
12133+ * cannot be called with interrupt disabled.
12134+ * This function assumes that the iocb completions occur while
12135+ * this function sleep. So, this function cannot be called from
12136+ * the thread which process iocb completion for this ring.
12137+ * This function clears the iocb_flag of the iocb object before
12138+ * issuing the iocb and the iocb completion handler sets this
12139+ * flag and wakes this thread when the iocb completes.
12140+ * The contents of the response iocb will be copied to prspiocbq
12141+ * by the completion handler when the command completes.
12142+ * This function returns IOCB_SUCCESS when success.
12143+ * This function is called with no lock held.
12144+ **/
12145 int
12146 lpfc_sli_issue_iocb_wait(struct lpfc_hba *phba,
12147 struct lpfc_sli_ring *pring,
12148@@ -3963,7 +5036,7 @@ lpfc_sli_issue_iocb_wait(struct lpfc_hba
12149 }
12150 } else {
12151 lpfc_printf_log(phba, KERN_INFO, LOG_SLI,
12152- ":0332 IOCB wait issue failed, Data x%x\n",
12153+ "0332 IOCB wait issue failed, Data x%x\n",
12154 retval);
12155 retval = IOCB_ERROR;
12156 }
12157@@ -3983,6 +5056,32 @@ lpfc_sli_issue_iocb_wait(struct lpfc_hba
12158 return retval;
12159 }
12160
12161+/**
12162+ * lpfc_sli_issue_mbox_wait: Synchronous function to issue mailbox.
12163+ * @phba: Pointer to HBA context object.
12164+ * @pmboxq: Pointer to driver mailbox object.
12165+ * @timeout: Timeout in number of seconds.
12166+ *
12167+ * This function issues the mailbox to firmware and waits for the
12168+ * mailbox command to complete. If the mailbox command is not
12169+ * completed within timeout seconds, it returns MBX_TIMEOUT.
12170+ * The function waits for the mailbox completion using an
12171+ * interruptible wait. If the thread is woken up due to a
12172+ * signal, MBX_TIMEOUT error is returned to the caller. Caller
12173+ * should not free the mailbox resources, if this function returns
12174+ * MBX_TIMEOUT.
12175+ * This function will sleep while waiting for mailbox completion.
12176+ * So, this function should not be called from any context which
12177+ * does not allow sleeping. Due to the same reason, this function
12178+ * cannot be called with interrupt disabled.
12179+ * This function assumes that the mailbox completion occurs while
12180+ * this function sleep. So, this function cannot be called from
12181+ * the worker thread which processes mailbox completion.
12182+ * This function is called in the context of HBA management
12183+ * applications.
12184+ * This function returns MBX_SUCCESS when successful.
12185+ * This function is called with no lock held.
12186+ **/
12187 int
12188 lpfc_sli_issue_mbox_wait(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmboxq,
12189 uint32_t timeout)
12190@@ -4027,6 +5126,18 @@ lpfc_sli_issue_mbox_wait(struct lpfc_hba
12191 return retval;
12192 }
12193
12194+/**
12195+ * lpfc_sli_flush_mbox_queue: mailbox queue cleanup function.
12196+ * @phba: Pointer to HBA context.
12197+ *
12198+ * This function is called to cleanup any pending mailbox
12199+ * objects in the driver queue before bringing the HBA offline.
12200+ * This function is called while resetting the HBA.
12201+ * The function is called without any lock held. The function
12202+ * takes hbalock to update SLI data structure.
12203+ * This function returns 1 when there is an active mailbox
12204+ * command pending else returns 0.
12205+ **/
12206 int
12207 lpfc_sli_flush_mbox_queue(struct lpfc_hba * phba)
12208 {
12209@@ -4058,8 +5169,74 @@ lpfc_sli_flush_mbox_queue(struct lpfc_hb
12210 return (phba->sli.sli_flag & LPFC_SLI_MBOX_ACTIVE) ? 1 : 0;
12211 }
12212
12213+/**
12214+ * lpfc_sli_check_eratt: check error attention events
12215+ * @phba: Pointer to HBA context.
12216+ *
12217+ * This function is called form timer soft interrupt context to check HBA's
12218+ * error attention register bit for error attention events.
12219+ *
12220+ * This fucntion returns 1 when there is Error Attention in the Host Attention
12221+ * Register and returns 0 otherwise.
12222+ **/
12223+int
12224+lpfc_sli_check_eratt(struct lpfc_hba *phba)
12225+{
12226+ uint32_t ha_copy;
12227+
12228+ /* If somebody is waiting to handle an eratt, don't process it
12229+ * here. The brdkill function will do this.
12230+ */
12231+ if (phba->link_flag & LS_IGNORE_ERATT)
12232+ return 0;
12233+
12234+ /* Check if interrupt handler handles this ERATT */
12235+ spin_lock_irq(&phba->hbalock);
12236+ if (phba->hba_flag & HBA_ERATT_HANDLED) {
12237+ /* Interrupt handler has handled ERATT */
12238+ spin_unlock_irq(&phba->hbalock);
12239+ return 0;
12240+ }
12241+
12242+ /* Read chip Host Attention (HA) register */
12243+ ha_copy = readl(phba->HAregaddr);
12244+ if (ha_copy & HA_ERATT) {
12245+ /* Read host status register to retrieve error event */
12246+ lpfc_sli_read_hs(phba);
12247+ /* Set the driver HA work bitmap */
12248+ phba->work_ha |= HA_ERATT;
12249+ /* Indicate polling handles this ERATT */
12250+ phba->hba_flag |= HBA_ERATT_HANDLED;
12251+ spin_unlock_irq(&phba->hbalock);
12252+ return 1;
12253+ }
12254+ spin_unlock_irq(&phba->hbalock);
12255+ return 0;
12256+}
12257+
12258+/**
12259+ * lpfc_sp_intr_handler: The slow-path interrupt handler of lpfc driver.
12260+ * @irq: Interrupt number.
12261+ * @dev_id: The device context pointer.
12262+ *
12263+ * This function is directly called from the PCI layer as an interrupt
12264+ * service routine when the device is enabled with MSI-X multi-message
12265+ * interrupt mode and there are slow-path events in the HBA. However,
12266+ * when the device is enabled with either MSI or Pin-IRQ interrupt mode,
12267+ * this function is called as part of the device-level interrupt handler.
12268+ * When the PCI slot is in error recovery or the HBA is undergoing
12269+ * initialization, the interrupt handler will not process the interrupt.
12270+ * The link attention and ELS ring attention events are handled by the
12271+ * worker thread. The interrupt handler signals the worker thread and
12272+ * and returns for these events. This function is called without any
12273+ * lock held. It gets the hbalock to access and update SLI data
12274+ * structures.
12275+ *
12276+ * This function returns IRQ_HANDLED when interrupt is handled else it
12277+ * returns IRQ_NONE.
12278+ **/
12279 irqreturn_t
12280-lpfc_intr_handler(int irq, void *dev_id)
12281+lpfc_sp_intr_handler(int irq, void *dev_id)
12282 {
12283 struct lpfc_hba *phba;
12284 uint32_t ha_copy;
12285@@ -4078,48 +5255,52 @@ lpfc_intr_handler(int irq, void *dev_id)
12286 * Get the driver's phba structure from the dev_id and
12287 * assume the HBA is not interrupting.
12288 */
12289- phba = (struct lpfc_hba *) dev_id;
12290+ phba = (struct lpfc_hba *)dev_id;
12291
12292 if (unlikely(!phba))
12293 return IRQ_NONE;
12294
12295- /* If the pci channel is offline, ignore all the interrupts. */
12296- if (unlikely(pci_channel_offline(phba->pcidev)))
12297- return IRQ_NONE;
12298-
12299- phba->sli.slistat.sli_intr++;
12300-
12301 /*
12302- * Call the HBA to see if it is interrupting. If not, don't claim
12303- * the interrupt
12304- */
12305-
12306- /* Ignore all interrupts during initialization. */
12307- if (unlikely(phba->link_state < LPFC_LINK_DOWN))
12308- return IRQ_NONE;
12309-
12310- /*
12311- * Read host attention register to determine interrupt source
12312- * Clear Attention Sources, except Error Attention (to
12313- * preserve status) and Link Attention
12314- */
12315- spin_lock(&phba->hbalock);
12316- ha_copy = readl(phba->HAregaddr);
12317- /* If somebody is waiting to handle an eratt don't process it
12318- * here. The brdkill function will do this.
12319+ * Stuff needs to be attented to when this function is invoked as an
12320+ * individual interrupt handler in MSI-X multi-message interrupt mode
12321 */
12322- if (phba->link_flag & LS_IGNORE_ERATT)
12323- ha_copy &= ~HA_ERATT;
12324- writel((ha_copy & ~(HA_LATT | HA_ERATT)), phba->HAregaddr);
12325- readl(phba->HAregaddr); /* flush */
12326- spin_unlock(&phba->hbalock);
12327-
12328- if (unlikely(!ha_copy))
12329- return IRQ_NONE;
12330+ if (phba->intr_type == MSIX) {
12331+ /* If the pci channel is offline, ignore all the interrupts */
12332+ if (unlikely(pci_channel_offline(phba->pcidev)))
12333+ return IRQ_NONE;
12334+ /* Update device-level interrupt statistics */
12335+ phba->sli.slistat.sli_intr++;
12336+ /* Ignore all interrupts during initialization. */
12337+ if (unlikely(phba->link_state < LPFC_LINK_DOWN))
12338+ return IRQ_NONE;
12339+ /* Need to read HA REG for slow-path events */
12340+ spin_lock(&phba->hbalock);
12341+ ha_copy = readl(phba->HAregaddr);
12342+ /* If somebody is waiting to handle an eratt don't process it
12343+ * here. The brdkill function will do this.
12344+ */
12345+ if (phba->link_flag & LS_IGNORE_ERATT)
12346+ ha_copy &= ~HA_ERATT;
12347+ /* Check the need for handling ERATT in interrupt handler */
12348+ if (ha_copy & HA_ERATT) {
12349+ if (phba->hba_flag & HBA_ERATT_HANDLED)
12350+ /* ERATT polling has handled ERATT */
12351+ ha_copy &= ~HA_ERATT;
12352+ else
12353+ /* Indicate interrupt handler handles ERATT */
12354+ phba->hba_flag |= HBA_ERATT_HANDLED;
12355+ }
12356+ /* Clear up only attention source related to slow-path */
12357+ writel((ha_copy & (HA_MBATT | HA_R2_CLR_MSK)),
12358+ phba->HAregaddr);
12359+ readl(phba->HAregaddr); /* flush */
12360+ spin_unlock(&phba->hbalock);
12361+ } else
12362+ ha_copy = phba->ha_copy;
12363
12364 work_ha_copy = ha_copy & phba->work_ha_mask;
12365
12366- if (unlikely(work_ha_copy)) {
12367+ if (work_ha_copy) {
12368 if (work_ha_copy & HA_LATT) {
12369 if (phba->sli.sli_flag & LPFC_PROCESS_LA) {
12370 /*
12371@@ -4138,7 +5319,7 @@ lpfc_intr_handler(int irq, void *dev_id)
12372 work_ha_copy &= ~HA_LATT;
12373 }
12374
12375- if (work_ha_copy & ~(HA_ERATT|HA_MBATT|HA_LATT)) {
12376+ if (work_ha_copy & ~(HA_ERATT | HA_MBATT | HA_LATT)) {
12377 /*
12378 * Turn off Slow Rings interrupts, LPFC_ELS_RING is
12379 * the only slow ring.
12380@@ -4179,31 +5360,13 @@ lpfc_intr_handler(int irq, void *dev_id)
12381 spin_unlock(&phba->hbalock);
12382 }
12383 }
12384-
12385- if (work_ha_copy & HA_ERATT) {
12386- /*
12387- * There was a link/board error. Read the
12388- * status register to retrieve the error event
12389- * and process it.
12390- */
12391- phba->sli.slistat.err_attn_event++;
12392- /* Save status info */
12393- phba->work_hs = readl(phba->HSregaddr);
12394- phba->work_status[0] = readl(phba->MBslimaddr + 0xa8);
12395- phba->work_status[1] = readl(phba->MBslimaddr + 0xac);
12396-
12397- /* Clear Chip error bit */
12398- writel(HA_ERATT, phba->HAregaddr);
12399- readl(phba->HAregaddr); /* flush */
12400- phba->pport->stopped = 1;
12401- }
12402-
12403 spin_lock(&phba->hbalock);
12404- if ((work_ha_copy & HA_MBATT) &&
12405- (phba->sli.mbox_active)) {
12406+ if (work_ha_copy & HA_ERATT)
12407+ lpfc_sli_read_hs(phba);
12408+ if ((work_ha_copy & HA_MBATT) && (phba->sli.mbox_active)) {
12409 pmb = phba->sli.mbox_active;
12410 pmbox = &pmb->mb;
12411- mbox = &phba->slim2p->mbx;
12412+ mbox = phba->mbox;
12413 vport = pmb->vport;
12414
12415 /* First check out the status word */
12416@@ -4270,7 +5433,7 @@ lpfc_intr_handler(int irq, void *dev_id)
12417 lpfc_printf_log(phba,
12418 KERN_ERR,
12419 LOG_MBOX | LOG_SLI,
12420- "0306 rc should have"
12421+ "0350 rc should have"
12422 "been MBX_BUSY");
12423 goto send_current_mbox;
12424 }
12425@@ -4283,6 +5446,7 @@ lpfc_intr_handler(int irq, void *dev_id)
12426 }
12427 } else
12428 spin_unlock(&phba->hbalock);
12429+
12430 if ((work_ha_copy & HA_MBATT) &&
12431 (phba->sli.mbox_active == NULL)) {
12432 send_current_mbox:
12433@@ -4302,15 +5466,74 @@ send_current_mbox:
12434 spin_unlock(&phba->hbalock);
12435 lpfc_worker_wake_up(phba);
12436 }
12437+ return IRQ_HANDLED;
12438
12439- ha_copy &= ~(phba->work_ha_mask);
12440+} /* lpfc_sp_intr_handler */
12441+
12442+/**
12443+ * lpfc_fp_intr_handler: The fast-path interrupt handler of lpfc driver.
12444+ * @irq: Interrupt number.
12445+ * @dev_id: The device context pointer.
12446+ *
12447+ * This function is directly called from the PCI layer as an interrupt
12448+ * service routine when the device is enabled with MSI-X multi-message
12449+ * interrupt mode and there is a fast-path FCP IOCB ring event in the
12450+ * HBA. However, when the device is enabled with either MSI or Pin-IRQ
12451+ * interrupt mode, this function is called as part of the device-level
12452+ * interrupt handler. When the PCI slot is in error recovery or the HBA
12453+ * is undergoing initialization, the interrupt handler will not process
12454+ * the interrupt. The SCSI FCP fast-path ring event are handled in the
12455+ * intrrupt context. This function is called without any lock held. It
12456+ * gets the hbalock to access and update SLI data structures.
12457+ *
12458+ * This function returns IRQ_HANDLED when interrupt is handled else it
12459+ * returns IRQ_NONE.
12460+ **/
12461+irqreturn_t
12462+lpfc_fp_intr_handler(int irq, void *dev_id)
12463+{
12464+ struct lpfc_hba *phba;
12465+ uint32_t ha_copy;
12466+ unsigned long status;
12467+
12468+ /* Get the driver's phba structure from the dev_id and
12469+ * assume the HBA is not interrupting.
12470+ */
12471+ phba = (struct lpfc_hba *) dev_id;
12472+
12473+ if (unlikely(!phba))
12474+ return IRQ_NONE;
12475+
12476+ /*
12477+ * Stuff needs to be attented to when this function is invoked as an
12478+ * individual interrupt handler in MSI-X multi-message interrupt mode
12479+ */
12480+ if (phba->intr_type == MSIX) {
12481+ /* If pci channel is offline, ignore all the interrupts */
12482+ if (unlikely(pci_channel_offline(phba->pcidev)))
12483+ return IRQ_NONE;
12484+ /* Update device-level interrupt statistics */
12485+ phba->sli.slistat.sli_intr++;
12486+ /* Ignore all interrupts during initialization. */
12487+ if (unlikely(phba->link_state < LPFC_LINK_DOWN))
12488+ return IRQ_NONE;
12489+ /* Need to read HA REG for FCP ring and other ring events */
12490+ ha_copy = readl(phba->HAregaddr);
12491+ /* Clear up only attention source related to fast-path */
12492+ spin_lock(&phba->hbalock);
12493+ writel((ha_copy & (HA_R0_CLR_MSK | HA_R1_CLR_MSK)),
12494+ phba->HAregaddr);
12495+ readl(phba->HAregaddr); /* flush */
12496+ spin_unlock(&phba->hbalock);
12497+ } else
12498+ ha_copy = phba->ha_copy;
12499
12500 /*
12501- * Process all events on FCP ring. Take the optimized path for
12502- * FCP IO. Any other IO is slow path and is handled by
12503- * the worker thread.
12504+ * Process all events on FCP ring. Take the optimized path for FCP IO.
12505 */
12506- status = (ha_copy & (HA_RXMASK << (4*LPFC_FCP_RING)));
12507+ ha_copy &= ~(phba->work_ha_mask);
12508+
12509+ status = (ha_copy & (HA_RXMASK << (4*LPFC_FCP_RING)));
12510 status >>= (4*LPFC_FCP_RING);
12511 if (status & HA_RXMASK)
12512 lpfc_sli_handle_fast_ring_event(phba,
12513@@ -4319,11 +5542,10 @@ send_current_mbox:
12514
12515 if (phba->cfg_multi_ring_support == 2) {
12516 /*
12517- * Process all events on extra ring. Take the optimized path
12518- * for extra ring IO. Any other IO is slow path and is handled
12519- * by the worker thread.
12520+ * Process all events on extra ring. Take the optimized path
12521+ * for extra ring IO.
12522 */
12523- status = (ha_copy & (HA_RXMASK << (4*LPFC_EXTRA_RING)));
12524+ status = (ha_copy & (HA_RXMASK << (4*LPFC_EXTRA_RING)));
12525 status >>= (4*LPFC_EXTRA_RING);
12526 if (status & HA_RXMASK) {
12527 lpfc_sli_handle_fast_ring_event(phba,
12528@@ -4332,5 +5554,106 @@ send_current_mbox:
12529 }
12530 }
12531 return IRQ_HANDLED;
12532+} /* lpfc_fp_intr_handler */
12533+
12534+/**
12535+ * lpfc_intr_handler: The device-level interrupt handler of lpfc driver.
12536+ * @irq: Interrupt number.
12537+ * @dev_id: The device context pointer.
12538+ *
12539+ * This function is the device-level interrupt handler called from the PCI
12540+ * layer when either MSI or Pin-IRQ interrupt mode is enabled and there is
12541+ * an event in the HBA which requires driver attention. This function
12542+ * invokes the slow-path interrupt attention handling function and fast-path
12543+ * interrupt attention handling function in turn to process the relevant
12544+ * HBA attention events. This function is called without any lock held. It
12545+ * gets the hbalock to access and update SLI data structures.
12546+ *
12547+ * This function returns IRQ_HANDLED when interrupt is handled, else it
12548+ * returns IRQ_NONE.
12549+ **/
12550+irqreturn_t
12551+lpfc_intr_handler(int irq, void *dev_id)
12552+{
12553+ struct lpfc_hba *phba;
12554+ irqreturn_t sp_irq_rc, fp_irq_rc;
12555+ unsigned long status1, status2;
12556+
12557+ /*
12558+ * Get the driver's phba structure from the dev_id and
12559+ * assume the HBA is not interrupting.
12560+ */
12561+ phba = (struct lpfc_hba *) dev_id;
12562+
12563+ if (unlikely(!phba))
12564+ return IRQ_NONE;
12565+
12566+ /* If the pci channel is offline, ignore all the interrupts. */
12567+ if (unlikely(pci_channel_offline(phba->pcidev)))
12568+ return IRQ_NONE;
12569+
12570+ /* Update device level interrupt statistics */
12571+ phba->sli.slistat.sli_intr++;
12572+
12573+ /* Ignore all interrupts during initialization. */
12574+ if (unlikely(phba->link_state < LPFC_LINK_DOWN))
12575+ return IRQ_NONE;
12576+
12577+ spin_lock(&phba->hbalock);
12578+ phba->ha_copy = readl(phba->HAregaddr);
12579+ if (unlikely(!phba->ha_copy)) {
12580+ spin_unlock(&phba->hbalock);
12581+ return IRQ_NONE;
12582+ } else if (phba->ha_copy & HA_ERATT) {
12583+ if (phba->hba_flag & HBA_ERATT_HANDLED)
12584+ /* ERATT polling has handled ERATT */
12585+ phba->ha_copy &= ~HA_ERATT;
12586+ else
12587+ /* Indicate interrupt handler handles ERATT */
12588+ phba->hba_flag |= HBA_ERATT_HANDLED;
12589+ }
12590+
12591+ /* Clear attention sources except link and error attentions */
12592+ writel((phba->ha_copy & ~(HA_LATT | HA_ERATT)), phba->HAregaddr);
12593+ readl(phba->HAregaddr); /* flush */
12594+ spin_unlock(&phba->hbalock);
12595+
12596+ /*
12597+ * Invokes slow-path host attention interrupt handling as appropriate.
12598+ */
12599+
12600+ /* status of events with mailbox and link attention */
12601+ status1 = phba->ha_copy & (HA_MBATT | HA_LATT | HA_ERATT);
12602+
12603+ /* status of events with ELS ring */
12604+ status2 = (phba->ha_copy & (HA_RXMASK << (4*LPFC_ELS_RING)));
12605+ status2 >>= (4*LPFC_ELS_RING);
12606+
12607+ if (status1 || (status2 & HA_RXMASK))
12608+ sp_irq_rc = lpfc_sp_intr_handler(irq, dev_id);
12609+ else
12610+ sp_irq_rc = IRQ_NONE;
12611+
12612+ /*
12613+ * Invoke fast-path host attention interrupt handling as appropriate.
12614+ */
12615+
12616+ /* status of events with FCP ring */
12617+ status1 = (phba->ha_copy & (HA_RXMASK << (4*LPFC_FCP_RING)));
12618+ status1 >>= (4*LPFC_FCP_RING);
12619+
12620+ /* status of events with extra ring */
12621+ if (phba->cfg_multi_ring_support == 2) {
12622+ status2 = (phba->ha_copy & (HA_RXMASK << (4*LPFC_EXTRA_RING)));
12623+ status2 >>= (4*LPFC_EXTRA_RING);
12624+ } else
12625+ status2 = 0;
12626+
12627+ if ((status1 & HA_RXMASK) || (status2 & HA_RXMASK))
12628+ fp_irq_rc = lpfc_fp_intr_handler(irq, dev_id);
12629+ else
12630+ fp_irq_rc = IRQ_NONE;
12631
12632-} /* lpfc_intr_handler */
12633+ /* Return device-level interrupt handling status */
12634+ return (sp_irq_rc == IRQ_HANDLED) ? sp_irq_rc : fp_irq_rc;
12635+} /* lpfc_intr_handler */
12636--- a/drivers/scsi/lpfc/lpfc_sli.h
12637+++ b/drivers/scsi/lpfc/lpfc_sli.h
12638@@ -233,6 +233,7 @@ struct lpfc_sli {
12639 #define LPFC_SLI2_ACTIVE 0x200 /* SLI2 overlay in firmware is active */
12640 #define LPFC_PROCESS_LA 0x400 /* Able to process link attention */
12641 #define LPFC_BLOCK_MGMT_IO 0x800 /* Don't allow mgmt mbx or iocb cmds */
12642+#define LPFC_MENLO_MAINT 0x1000 /* need for menl fw download */
12643
12644 struct lpfc_sli_ring ring[LPFC_MAX_RING];
12645 int fcp_ring; /* ring used for FCP initiator commands */
12646--- a/drivers/scsi/lpfc/lpfc_version.h
12647+++ b/drivers/scsi/lpfc/lpfc_version.h
12648@@ -18,9 +18,11 @@
12649 * included with this package. *
12650 *******************************************************************/
12651
12652-#define LPFC_DRIVER_VERSION "8.2.7"
12653+#define LPFC_DRIVER_VERSION "8.2.8"
12654
12655-#define LPFC_DRIVER_NAME "lpfc"
12656+#define LPFC_DRIVER_NAME "lpfc"
12657+#define LPFC_SP_DRIVER_HANDLER_NAME "lpfc:sp"
12658+#define LPFC_FP_DRIVER_HANDLER_NAME "lpfc:fp"
12659
12660 #define LPFC_MODULE_DESC "Emulex LightPulse Fibre Channel SCSI driver " \
12661 LPFC_DRIVER_VERSION
12662--- a/drivers/scsi/lpfc/lpfc_vport.c
12663+++ b/drivers/scsi/lpfc/lpfc_vport.c
12664@@ -34,6 +34,7 @@
12665 #include <scsi/scsi_transport_fc.h>
12666 #include "lpfc_hw.h"
12667 #include "lpfc_sli.h"
12668+#include "lpfc_nl.h"
12669 #include "lpfc_disc.h"
12670 #include "lpfc_scsi.h"
12671 #include "lpfc.h"
12672@@ -204,6 +205,77 @@ lpfc_unique_wwpn(struct lpfc_hba *phba,
12673 return 1;
12674 }
12675
12676+/**
12677+ * lpfc_discovery_wait: Wait for driver discovery to quiesce.
12678+ * @vport: The virtual port for which this call is being executed.
12679+ *
12680+ * This driver calls this routine specifically from lpfc_vport_delete
12681+ * to enforce a synchronous execution of vport
12682+ * delete relative to discovery activities. The
12683+ * lpfc_vport_delete routine should not return until it
12684+ * can reasonably guarantee that discovery has quiesced.
12685+ * Post FDISC LOGO, the driver must wait until its SAN teardown is
12686+ * complete and all resources recovered before allowing
12687+ * cleanup.
12688+ *
12689+ * This routine does not require any locks held.
12690+ **/
12691+static void lpfc_discovery_wait(struct lpfc_vport *vport)
12692+{
12693+ struct lpfc_hba *phba = vport->phba;
12694+ uint32_t wait_flags = 0;
12695+ unsigned long wait_time_max;
12696+ unsigned long start_time;
12697+
12698+ wait_flags = FC_RSCN_MODE | FC_RSCN_DISCOVERY | FC_NLP_MORE |
12699+ FC_RSCN_DEFERRED | FC_NDISC_ACTIVE | FC_DISC_TMO;
12700+
12701+ /*
12702+ * The time constraint on this loop is a balance between the
12703+ * fabric RA_TOV value and dev_loss tmo. The driver's
12704+ * devloss_tmo is 10 giving this loop a 3x multiplier minimally.
12705+ */
12706+ wait_time_max = msecs_to_jiffies(((phba->fc_ratov * 3) + 3) * 1000);
12707+ wait_time_max += jiffies;
12708+ start_time = jiffies;
12709+ while (time_before(jiffies, wait_time_max)) {
12710+ if ((vport->num_disc_nodes > 0) ||
12711+ (vport->fc_flag & wait_flags) ||
12712+ ((vport->port_state > LPFC_VPORT_FAILED) &&
12713+ (vport->port_state < LPFC_VPORT_READY))) {
12714+ lpfc_printf_log(phba, KERN_INFO, LOG_VPORT,
12715+ "1833 Vport discovery quiesce Wait:"
12716+ " vpi x%x state x%x fc_flags x%x"
12717+ " num_nodes x%x, waiting 1000 msecs"
12718+ " total wait msecs x%x\n",
12719+ vport->vpi, vport->port_state,
12720+ vport->fc_flag, vport->num_disc_nodes,
12721+ jiffies_to_msecs(jiffies - start_time));
12722+ msleep(1000);
12723+ } else {
12724+ /* Base case. Wait variants satisfied. Break out */
12725+ lpfc_printf_log(phba, KERN_INFO, LOG_VPORT,
12726+ "1834 Vport discovery quiesced:"
12727+ " vpi x%x state x%x fc_flags x%x"
12728+ " wait msecs x%x\n",
12729+ vport->vpi, vport->port_state,
12730+ vport->fc_flag,
12731+ jiffies_to_msecs(jiffies
12732+ - start_time));
12733+ break;
12734+ }
12735+ }
12736+
12737+ if (time_after(jiffies, wait_time_max))
12738+ lpfc_printf_log(phba, KERN_ERR, LOG_VPORT,
12739+ "1835 Vport discovery quiesce failed:"
12740+ " vpi x%x state x%x fc_flags x%x"
12741+ " wait msecs x%x\n",
12742+ vport->vpi, vport->port_state,
12743+ vport->fc_flag,
12744+ jiffies_to_msecs(jiffies - start_time));
12745+}
12746+
12747 int
12748 lpfc_vport_create(struct fc_vport *fc_vport, bool disable)
12749 {
12750@@ -506,8 +578,12 @@ lpfc_vport_delete(struct fc_vport *fc_vp
12751 * initiated after we've disposed of all other resources associated
12752 * with the port.
12753 */
12754- if (!scsi_host_get(shost) || !scsi_host_get(shost))
12755+ if (!scsi_host_get(shost))
12756+ return VPORT_INVAL;
12757+ if (!scsi_host_get(shost)) {
12758+ scsi_host_put(shost);
12759 return VPORT_INVAL;
12760+ }
12761 spin_lock_irq(&phba->hbalock);
12762 vport->load_flag |= FC_UNLOADING;
12763 spin_unlock_irq(&phba->hbalock);
12764@@ -597,11 +673,16 @@ lpfc_vport_delete(struct fc_vport *fc_vp
12765 }
12766 vport->unreg_vpi_cmpl = VPORT_INVAL;
12767 timeout = msecs_to_jiffies(phba->fc_ratov * 2000);
12768+ if (ndlp->nlp_state == NLP_STE_UNUSED_NODE)
12769+ goto skip_logo;
12770 if (!lpfc_issue_els_npiv_logo(vport, ndlp))
12771 while (vport->unreg_vpi_cmpl == VPORT_INVAL && timeout)
12772 timeout = schedule_timeout(timeout);
12773 }
12774
12775+ if (!(phba->pport->load_flag & FC_UNLOADING))
12776+ lpfc_discovery_wait(vport);
12777+
12778 skip_logo:
12779 lpfc_cleanup(vport);
12780 lpfc_sli_host_down(vport);
12781@@ -615,8 +696,10 @@ skip_logo:
12782 * Completion of unreg_vpi (lpfc_mbx_cmpl_unreg_vpi)
12783 * does the scsi_host_put() to release the vport.
12784 */
12785- lpfc_mbx_unreg_vpi(vport);
12786- }
12787+ if (lpfc_mbx_unreg_vpi(vport))
12788+ scsi_host_put(shost);
12789+ } else
12790+ scsi_host_put(shost);
12791
12792 lpfc_free_vpi(phba, vport->vpi);
12793 vport->work_port_events = 0;
12794@@ -663,3 +746,82 @@ lpfc_destroy_vport_work_array(struct lpf
12795 scsi_host_put(lpfc_shost_from_vport(vports[i]));
12796 kfree(vports);
12797 }
12798+
12799+
12800+/**
12801+ * lpfc_vport_reset_stat_data: Reset the statistical data for the vport.
12802+ * @vport: Pointer to vport object.
12803+ *
12804+ * This function resets the statistical data for the vport. This function
12805+ * is called with the host_lock held
12806+ **/
12807+void
12808+lpfc_vport_reset_stat_data(struct lpfc_vport *vport)
12809+{
12810+ struct lpfc_nodelist *ndlp = NULL, *next_ndlp = NULL;
12811+
12812+ list_for_each_entry_safe(ndlp, next_ndlp, &vport->fc_nodes, nlp_listp) {
12813+ if (!NLP_CHK_NODE_ACT(ndlp))
12814+ continue;
12815+ if (ndlp->lat_data)
12816+ memset(ndlp->lat_data, 0, LPFC_MAX_BUCKET_COUNT *
12817+ sizeof(struct lpfc_scsicmd_bkt));
12818+ }
12819+}
12820+
12821+
12822+/**
12823+ * lpfc_alloc_bucket: Allocate data buffer required for collecting
12824+ * statistical data.
12825+ * @vport: Pointer to vport object.
12826+ *
12827+ * This function allocates data buffer required for all the FC
12828+ * nodes of the vport to collect statistical data.
12829+ **/
12830+void
12831+lpfc_alloc_bucket(struct lpfc_vport *vport)
12832+{
12833+ struct lpfc_nodelist *ndlp = NULL, *next_ndlp = NULL;
12834+
12835+ list_for_each_entry_safe(ndlp, next_ndlp, &vport->fc_nodes, nlp_listp) {
12836+ if (!NLP_CHK_NODE_ACT(ndlp))
12837+ continue;
12838+
12839+ kfree(ndlp->lat_data);
12840+ ndlp->lat_data = NULL;
12841+
12842+ if (ndlp->nlp_state == NLP_STE_MAPPED_NODE) {
12843+ ndlp->lat_data = kcalloc(LPFC_MAX_BUCKET_COUNT,
12844+ sizeof(struct lpfc_scsicmd_bkt),
12845+ GFP_ATOMIC);
12846+
12847+ if (!ndlp->lat_data)
12848+ lpfc_printf_vlog(vport, KERN_ERR, LOG_NODE,
12849+ "0287 lpfc_alloc_bucket failed to "
12850+ "allocate statistical data buffer DID "
12851+ "0x%x\n", ndlp->nlp_DID);
12852+ }
12853+ }
12854+}
12855+
12856+/**
12857+ * lpfc_free_bucket: Free data buffer required for collecting
12858+ * statistical data.
12859+ * @vport: Pointer to vport object.
12860+ *
12861+ * Th function frees statistical data buffer of all the FC
12862+ * nodes of the vport.
12863+ **/
12864+void
12865+lpfc_free_bucket(struct lpfc_vport *vport)
12866+{
12867+ struct lpfc_nodelist *ndlp = NULL, *next_ndlp = NULL;
12868+
12869+ list_for_each_entry_safe(ndlp, next_ndlp, &vport->fc_nodes, nlp_listp) {
12870+ if (!NLP_CHK_NODE_ACT(ndlp))
12871+ continue;
12872+
12873+ kfree(ndlp->lat_data);
12874+ ndlp->lat_data = NULL;
12875+ }
12876+}
12877--- a/drivers/scsi/lpfc/lpfc_vport.h
12878+++ b/drivers/scsi/lpfc/lpfc_vport.h
12879@@ -112,4 +112,8 @@ struct vport_cmd_tag {
12880 void lpfc_vport_set_state(struct lpfc_vport *vport,
12881 enum fc_vport_state new_state);
12882
12883+void lpfc_vport_reset_stat_data(struct lpfc_vport *);
12884+void lpfc_alloc_bucket(struct lpfc_vport *);
12885+void lpfc_free_bucket(struct lpfc_vport *);
12886+
12887 #endif /* H_LPFC_VPORT */