diff options
author | James Smart <James.Smart@Emulex.Com> | 2007-06-17 20:56:36 -0400 |
---|---|---|
committer | James Bottomley <jejb@mulgrave.il.steeleye.com> | 2007-06-17 23:05:45 -0400 |
commit | 2e0fef85e098f6794956b8b80b111179fbb4cbb7 (patch) | |
tree | f632090be67f95e9a637eeb044938ba1591e848f /drivers/scsi/lpfc/lpfc_sli.c | |
parent | 4c2baaaf2ba4875d1d2d59b3b3e1216d3277b17a (diff) |
[SCSI] lpfc: NPIV: split ports
The driver is reorganized to separate the handling of the adapter from
the handling of the FC port. Adapter handling includes submissions of
command requests, receiving responses, and managing adapter resources.
The FC port includes the discovery engine, login handling, and the
mapping of a Scsi_Host on the "port". Although not a large functional
change, as it touches core structures and functions, resulting in a
large text delta.
Signed-off-by: James Smart <James.Smart@emulex.com>
Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
Diffstat (limited to 'drivers/scsi/lpfc/lpfc_sli.c')
-rw-r--r-- | drivers/scsi/lpfc/lpfc_sli.c | 727 |
1 files changed, 366 insertions, 361 deletions
diff --git a/drivers/scsi/lpfc/lpfc_sli.c b/drivers/scsi/lpfc/lpfc_sli.c index a1e721459e2b..1edac15eed40 100644 --- a/drivers/scsi/lpfc/lpfc_sli.c +++ b/drivers/scsi/lpfc/lpfc_sli.c | |||
@@ -52,9 +52,9 @@ | |||
52 | "Data: x%x x%x x%x\n", \ | 52 | "Data: x%x x%x x%x\n", \ |
53 | phba->brd_no, \ | 53 | phba->brd_no, \ |
54 | mb->mbxCommand, \ | 54 | mb->mbxCommand, \ |
55 | phba->hba_state, \ | 55 | phba->pport->port_state, \ |
56 | psli->sli_flag, \ | 56 | psli->sli_flag, \ |
57 | flag); | 57 | flag) |
58 | 58 | ||
59 | 59 | ||
60 | /* There are only four IOCB completion types. */ | 60 | /* There are only four IOCB completion types. */ |
@@ -65,8 +65,8 @@ typedef enum _lpfc_iocb_type { | |||
65 | LPFC_ABORT_IOCB | 65 | LPFC_ABORT_IOCB |
66 | } lpfc_iocb_type; | 66 | } lpfc_iocb_type; |
67 | 67 | ||
68 | struct lpfc_iocbq * | 68 | static struct lpfc_iocbq * |
69 | lpfc_sli_get_iocbq(struct lpfc_hba * phba) | 69 | __lpfc_sli_get_iocbq(struct lpfc_hba *phba) |
70 | { | 70 | { |
71 | struct list_head *lpfc_iocb_list = &phba->lpfc_iocb_list; | 71 | struct list_head *lpfc_iocb_list = &phba->lpfc_iocb_list; |
72 | struct lpfc_iocbq * iocbq = NULL; | 72 | struct lpfc_iocbq * iocbq = NULL; |
@@ -75,10 +75,22 @@ lpfc_sli_get_iocbq(struct lpfc_hba * phba) | |||
75 | return iocbq; | 75 | return iocbq; |
76 | } | 76 | } |
77 | 77 | ||
78 | struct lpfc_iocbq * | ||
79 | lpfc_sli_get_iocbq(struct lpfc_hba *phba) | ||
80 | { | ||
81 | struct lpfc_iocbq * iocbq = NULL; | ||
82 | unsigned long iflags; | ||
83 | |||
84 | spin_lock_irqsave(&phba->hbalock, iflags); | ||
85 | iocbq = __lpfc_sli_get_iocbq(phba); | ||
86 | spin_unlock_irqrestore(&phba->hbalock, iflags); | ||
87 | return iocbq; | ||
88 | } | ||
89 | |||
78 | void | 90 | void |
79 | lpfc_sli_release_iocbq(struct lpfc_hba * phba, struct lpfc_iocbq * iocbq) | 91 | __lpfc_sli_release_iocbq(struct lpfc_hba *phba, struct lpfc_iocbq *iocbq) |
80 | { | 92 | { |
81 | size_t start_clean = (size_t)(&((struct lpfc_iocbq *)NULL)->iocb); | 93 | size_t start_clean = offsetof(struct lpfc_iocbq, iocb); |
82 | 94 | ||
83 | /* | 95 | /* |
84 | * Clean all volatile data fields, preserve iotag and node struct. | 96 | * Clean all volatile data fields, preserve iotag and node struct. |
@@ -87,6 +99,19 @@ lpfc_sli_release_iocbq(struct lpfc_hba * phba, struct lpfc_iocbq * iocbq) | |||
87 | list_add_tail(&iocbq->list, &phba->lpfc_iocb_list); | 99 | list_add_tail(&iocbq->list, &phba->lpfc_iocb_list); |
88 | } | 100 | } |
89 | 101 | ||
102 | void | ||
103 | lpfc_sli_release_iocbq(struct lpfc_hba *phba, struct lpfc_iocbq *iocbq) | ||
104 | { | ||
105 | unsigned long iflags; | ||
106 | |||
107 | /* | ||
108 | * Clean all volatile data fields, preserve iotag and node struct. | ||
109 | */ | ||
110 | spin_lock_irqsave(&phba->hbalock, iflags); | ||
111 | __lpfc_sli_release_iocbq(phba, iocbq); | ||
112 | spin_unlock_irqrestore(&phba->hbalock, iflags); | ||
113 | } | ||
114 | |||
90 | /* | 115 | /* |
91 | * Translate the iocb command to an iocb command type used to decide the final | 116 | * Translate the iocb command to an iocb command type used to decide the final |
92 | * disposition of each completed IOCB. | 117 | * disposition of each completed IOCB. |
@@ -166,14 +191,14 @@ lpfc_sli_iocb_cmd_type(uint8_t iocb_cmnd) | |||
166 | } | 191 | } |
167 | 192 | ||
168 | static int | 193 | static int |
169 | lpfc_sli_ring_map(struct lpfc_hba * phba, LPFC_MBOXQ_t *pmb) | 194 | lpfc_sli_ring_map(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb) |
170 | { | 195 | { |
171 | struct lpfc_sli *psli = &phba->sli; | 196 | struct lpfc_sli *psli = &phba->sli; |
172 | MAILBOX_t *pmbox = &pmb->mb; | 197 | MAILBOX_t *pmbox = &pmb->mb; |
173 | int i, rc; | 198 | int i, rc; |
174 | 199 | ||
175 | for (i = 0; i < psli->num_rings; i++) { | 200 | for (i = 0; i < psli->num_rings; i++) { |
176 | phba->hba_state = LPFC_INIT_MBX_CMDS; | 201 | phba->link_state = LPFC_INIT_MBX_CMDS; |
177 | lpfc_config_ring(phba, i, pmb); | 202 | lpfc_config_ring(phba, i, pmb); |
178 | rc = lpfc_sli_issue_mbox(phba, pmb, MBX_POLL); | 203 | rc = lpfc_sli_issue_mbox(phba, pmb, MBX_POLL); |
179 | if (rc != MBX_SUCCESS) { | 204 | if (rc != MBX_SUCCESS) { |
@@ -187,7 +212,7 @@ lpfc_sli_ring_map(struct lpfc_hba * phba, LPFC_MBOXQ_t *pmb) | |||
187 | pmbox->mbxCommand, | 212 | pmbox->mbxCommand, |
188 | pmbox->mbxStatus, | 213 | pmbox->mbxStatus, |
189 | i); | 214 | i); |
190 | phba->hba_state = LPFC_HBA_ERROR; | 215 | phba->link_state = LPFC_HBA_ERROR; |
191 | return -ENXIO; | 216 | return -ENXIO; |
192 | } | 217 | } |
193 | } | 218 | } |
@@ -195,20 +220,20 @@ lpfc_sli_ring_map(struct lpfc_hba * phba, LPFC_MBOXQ_t *pmb) | |||
195 | } | 220 | } |
196 | 221 | ||
197 | static int | 222 | static int |
198 | lpfc_sli_ringtxcmpl_put(struct lpfc_hba * phba, | 223 | lpfc_sli_ringtxcmpl_put(struct lpfc_hba *phba, struct lpfc_sli_ring *pring, |
199 | struct lpfc_sli_ring * pring, struct lpfc_iocbq * piocb) | 224 | struct lpfc_iocbq *piocb) |
200 | { | 225 | { |
201 | list_add_tail(&piocb->list, &pring->txcmplq); | 226 | list_add_tail(&piocb->list, &pring->txcmplq); |
202 | pring->txcmplq_cnt++; | 227 | pring->txcmplq_cnt++; |
203 | if (unlikely(pring->ringno == LPFC_ELS_RING)) | 228 | if (unlikely(pring->ringno == LPFC_ELS_RING)) |
204 | mod_timer(&phba->els_tmofunc, | 229 | mod_timer(&piocb->vport->els_tmofunc, |
205 | jiffies + HZ * (phba->fc_ratov << 1)); | 230 | jiffies + HZ * (phba->fc_ratov << 1)); |
206 | 231 | ||
207 | return (0); | 232 | return 0; |
208 | } | 233 | } |
209 | 234 | ||
210 | static struct lpfc_iocbq * | 235 | static struct lpfc_iocbq * |
211 | lpfc_sli_ringtx_get(struct lpfc_hba * phba, struct lpfc_sli_ring * pring) | 236 | lpfc_sli_ringtx_get(struct lpfc_hba *phba, struct lpfc_sli_ring *pring) |
212 | { | 237 | { |
213 | struct list_head *dlp; | 238 | struct list_head *dlp; |
214 | struct lpfc_iocbq *cmd_iocb; | 239 | struct lpfc_iocbq *cmd_iocb; |
@@ -224,7 +249,7 @@ lpfc_sli_ringtx_get(struct lpfc_hba * phba, struct lpfc_sli_ring * pring) | |||
224 | */ | 249 | */ |
225 | pring->txq_cnt--; | 250 | pring->txq_cnt--; |
226 | } | 251 | } |
227 | return (cmd_iocb); | 252 | return cmd_iocb; |
228 | } | 253 | } |
229 | 254 | ||
230 | static IOCB_t * | 255 | static IOCB_t * |
@@ -249,7 +274,7 @@ lpfc_sli_next_iocb_slot (struct lpfc_hba *phba, struct lpfc_sli_ring *pring) | |||
249 | phba->brd_no, pring->ringno, | 274 | phba->brd_no, pring->ringno, |
250 | pring->local_getidx, max_cmd_idx); | 275 | pring->local_getidx, max_cmd_idx); |
251 | 276 | ||
252 | phba->hba_state = LPFC_HBA_ERROR; | 277 | phba->link_state = LPFC_HBA_ERROR; |
253 | /* | 278 | /* |
254 | * All error attention handlers are posted to | 279 | * All error attention handlers are posted to |
255 | * worker thread | 280 | * worker thread |
@@ -272,33 +297,30 @@ lpfc_sli_next_iocb_slot (struct lpfc_hba *phba, struct lpfc_sli_ring *pring) | |||
272 | } | 297 | } |
273 | 298 | ||
274 | uint16_t | 299 | uint16_t |
275 | lpfc_sli_next_iotag(struct lpfc_hba * phba, struct lpfc_iocbq * iocbq) | 300 | lpfc_sli_next_iotag(struct lpfc_hba *phba, struct lpfc_iocbq *iocbq) |
276 | { | 301 | { |
277 | struct lpfc_iocbq ** new_arr; | 302 | struct lpfc_iocbq **new_arr; |
278 | struct lpfc_iocbq ** old_arr; | 303 | struct lpfc_iocbq **old_arr; |
279 | size_t new_len; | 304 | size_t new_len; |
280 | struct lpfc_sli *psli = &phba->sli; | 305 | struct lpfc_sli *psli = &phba->sli; |
281 | uint16_t iotag; | 306 | uint16_t iotag; |
282 | 307 | ||
283 | spin_lock_irq(phba->host->host_lock); | 308 | spin_lock_irq(&phba->hbalock); |
284 | iotag = psli->last_iotag; | 309 | iotag = psli->last_iotag; |
285 | if(++iotag < psli->iocbq_lookup_len) { | 310 | if(++iotag < psli->iocbq_lookup_len) { |
286 | psli->last_iotag = iotag; | 311 | psli->last_iotag = iotag; |
287 | psli->iocbq_lookup[iotag] = iocbq; | 312 | psli->iocbq_lookup[iotag] = iocbq; |
288 | spin_unlock_irq(phba->host->host_lock); | 313 | spin_unlock_irq(&phba->hbalock); |
289 | iocbq->iotag = iotag; | 314 | iocbq->iotag = iotag; |
290 | return iotag; | 315 | return iotag; |
291 | } | 316 | } else if (psli->iocbq_lookup_len < (0xffff |
292 | else if (psli->iocbq_lookup_len < (0xffff | ||
293 | - LPFC_IOCBQ_LOOKUP_INCREMENT)) { | 317 | - LPFC_IOCBQ_LOOKUP_INCREMENT)) { |
294 | new_len = psli->iocbq_lookup_len + LPFC_IOCBQ_LOOKUP_INCREMENT; | 318 | new_len = psli->iocbq_lookup_len + LPFC_IOCBQ_LOOKUP_INCREMENT; |
295 | spin_unlock_irq(phba->host->host_lock); | 319 | spin_unlock_irq(&phba->hbalock); |
296 | new_arr = kmalloc(new_len * sizeof (struct lpfc_iocbq *), | 320 | new_arr = kzalloc(new_len * sizeof (struct lpfc_iocbq *), |
297 | GFP_KERNEL); | 321 | GFP_KERNEL); |
298 | if (new_arr) { | 322 | if (new_arr) { |
299 | memset((char *)new_arr, 0, | 323 | spin_lock_irq(&phba->hbalock); |
300 | new_len * sizeof (struct lpfc_iocbq *)); | ||
301 | spin_lock_irq(phba->host->host_lock); | ||
302 | old_arr = psli->iocbq_lookup; | 324 | old_arr = psli->iocbq_lookup; |
303 | if (new_len <= psli->iocbq_lookup_len) { | 325 | if (new_len <= psli->iocbq_lookup_len) { |
304 | /* highly unprobable case */ | 326 | /* highly unprobable case */ |
@@ -307,11 +329,11 @@ lpfc_sli_next_iotag(struct lpfc_hba * phba, struct lpfc_iocbq * iocbq) | |||
307 | if(++iotag < psli->iocbq_lookup_len) { | 329 | if(++iotag < psli->iocbq_lookup_len) { |
308 | psli->last_iotag = iotag; | 330 | psli->last_iotag = iotag; |
309 | psli->iocbq_lookup[iotag] = iocbq; | 331 | psli->iocbq_lookup[iotag] = iocbq; |
310 | spin_unlock_irq(phba->host->host_lock); | 332 | spin_unlock_irq(&phba->hbalock); |
311 | iocbq->iotag = iotag; | 333 | iocbq->iotag = iotag; |
312 | return iotag; | 334 | return iotag; |
313 | } | 335 | } |
314 | spin_unlock_irq(phba->host->host_lock); | 336 | spin_unlock_irq(&phba->hbalock); |
315 | return 0; | 337 | return 0; |
316 | } | 338 | } |
317 | if (psli->iocbq_lookup) | 339 | if (psli->iocbq_lookup) |
@@ -322,13 +344,13 @@ lpfc_sli_next_iotag(struct lpfc_hba * phba, struct lpfc_iocbq * iocbq) | |||
322 | psli->iocbq_lookup_len = new_len; | 344 | psli->iocbq_lookup_len = new_len; |
323 | psli->last_iotag = iotag; | 345 | psli->last_iotag = iotag; |
324 | psli->iocbq_lookup[iotag] = iocbq; | 346 | psli->iocbq_lookup[iotag] = iocbq; |
325 | spin_unlock_irq(phba->host->host_lock); | 347 | spin_unlock_irq(&phba->hbalock); |
326 | iocbq->iotag = iotag; | 348 | iocbq->iotag = iotag; |
327 | kfree(old_arr); | 349 | kfree(old_arr); |
328 | return iotag; | 350 | return iotag; |
329 | } | 351 | } |
330 | } else | 352 | } else |
331 | spin_unlock_irq(phba->host->host_lock); | 353 | spin_unlock_irq(&phba->hbalock); |
332 | 354 | ||
333 | lpfc_printf_log(phba, KERN_ERR,LOG_SLI, | 355 | lpfc_printf_log(phba, KERN_ERR,LOG_SLI, |
334 | "%d:0318 Failed to allocate IOTAG.last IOTAG is %d\n", | 356 | "%d:0318 Failed to allocate IOTAG.last IOTAG is %d\n", |
@@ -361,7 +383,7 @@ lpfc_sli_submit_iocb(struct lpfc_hba *phba, struct lpfc_sli_ring *pring, | |||
361 | if (nextiocb->iocb_cmpl) | 383 | if (nextiocb->iocb_cmpl) |
362 | lpfc_sli_ringtxcmpl_put(phba, pring, nextiocb); | 384 | lpfc_sli_ringtxcmpl_put(phba, pring, nextiocb); |
363 | else | 385 | else |
364 | lpfc_sli_release_iocbq(phba, nextiocb); | 386 | __lpfc_sli_release_iocbq(phba, nextiocb); |
365 | 387 | ||
366 | /* | 388 | /* |
367 | * Let the HBA know what IOCB slot will be the next one the | 389 | * Let the HBA know what IOCB slot will be the next one the |
@@ -373,8 +395,7 @@ lpfc_sli_submit_iocb(struct lpfc_hba *phba, struct lpfc_sli_ring *pring, | |||
373 | } | 395 | } |
374 | 396 | ||
375 | static void | 397 | static void |
376 | lpfc_sli_update_full_ring(struct lpfc_hba * phba, | 398 | lpfc_sli_update_full_ring(struct lpfc_hba *phba, struct lpfc_sli_ring *pring) |
377 | struct lpfc_sli_ring *pring) | ||
378 | { | 399 | { |
379 | int ringno = pring->ringno; | 400 | int ringno = pring->ringno; |
380 | 401 | ||
@@ -393,8 +414,7 @@ lpfc_sli_update_full_ring(struct lpfc_hba * phba, | |||
393 | } | 414 | } |
394 | 415 | ||
395 | static void | 416 | static void |
396 | lpfc_sli_update_ring(struct lpfc_hba * phba, | 417 | lpfc_sli_update_ring(struct lpfc_hba *phba, struct lpfc_sli_ring *pring) |
397 | struct lpfc_sli_ring *pring) | ||
398 | { | 418 | { |
399 | int ringno = pring->ringno; | 419 | int ringno = pring->ringno; |
400 | 420 | ||
@@ -407,7 +427,7 @@ lpfc_sli_update_ring(struct lpfc_hba * phba, | |||
407 | } | 427 | } |
408 | 428 | ||
409 | static void | 429 | static void |
410 | lpfc_sli_resume_iocb(struct lpfc_hba * phba, struct lpfc_sli_ring * pring) | 430 | lpfc_sli_resume_iocb(struct lpfc_hba *phba, struct lpfc_sli_ring *pring) |
411 | { | 431 | { |
412 | IOCB_t *iocb; | 432 | IOCB_t *iocb; |
413 | struct lpfc_iocbq *nextiocb; | 433 | struct lpfc_iocbq *nextiocb; |
@@ -420,7 +440,7 @@ lpfc_sli_resume_iocb(struct lpfc_hba * phba, struct lpfc_sli_ring * pring) | |||
420 | * (d) IOCB processing is not blocked by the outstanding mbox command. | 440 | * (d) IOCB processing is not blocked by the outstanding mbox command. |
421 | */ | 441 | */ |
422 | if (pring->txq_cnt && | 442 | if (pring->txq_cnt && |
423 | (phba->hba_state > LPFC_LINK_DOWN) && | 443 | lpfc_is_link_up(phba) && |
424 | (pring->ringno != phba->sli.fcp_ring || | 444 | (pring->ringno != phba->sli.fcp_ring || |
425 | phba->sli.sli_flag & LPFC_PROCESS_LA) && | 445 | phba->sli.sli_flag & LPFC_PROCESS_LA) && |
426 | !(pring->flag & LPFC_STOP_IOCB_MBX)) { | 446 | !(pring->flag & LPFC_STOP_IOCB_MBX)) { |
@@ -440,11 +460,13 @@ lpfc_sli_resume_iocb(struct lpfc_hba * phba, struct lpfc_sli_ring * pring) | |||
440 | 460 | ||
441 | /* lpfc_sli_turn_on_ring is only called by lpfc_sli_handle_mb_event below */ | 461 | /* lpfc_sli_turn_on_ring is only called by lpfc_sli_handle_mb_event below */ |
442 | static void | 462 | static void |
443 | lpfc_sli_turn_on_ring(struct lpfc_hba * phba, int ringno) | 463 | lpfc_sli_turn_on_ring(struct lpfc_hba *phba, int ringno) |
444 | { | 464 | { |
445 | struct lpfc_pgp *pgp = &phba->slim2p->mbx.us.s2.port[ringno]; | 465 | struct lpfc_pgp *pgp = &phba->slim2p->mbx.us.s2.port[ringno]; |
466 | unsigned long iflags; | ||
446 | 467 | ||
447 | /* If the ring is active, flag it */ | 468 | /* If the ring is active, flag it */ |
469 | spin_lock_irqsave(&phba->hbalock, iflags); | ||
448 | if (phba->sli.ring[ringno].cmdringaddr) { | 470 | if (phba->sli.ring[ringno].cmdringaddr) { |
449 | if (phba->sli.ring[ringno].flag & LPFC_STOP_IOCB_MBX) { | 471 | if (phba->sli.ring[ringno].flag & LPFC_STOP_IOCB_MBX) { |
450 | phba->sli.ring[ringno].flag &= ~LPFC_STOP_IOCB_MBX; | 472 | phba->sli.ring[ringno].flag &= ~LPFC_STOP_IOCB_MBX; |
@@ -453,11 +475,10 @@ lpfc_sli_turn_on_ring(struct lpfc_hba * phba, int ringno) | |||
453 | */ | 475 | */ |
454 | phba->sli.ring[ringno].local_getidx | 476 | phba->sli.ring[ringno].local_getidx |
455 | = le32_to_cpu(pgp->cmdGetInx); | 477 | = le32_to_cpu(pgp->cmdGetInx); |
456 | spin_lock_irq(phba->host->host_lock); | ||
457 | lpfc_sli_resume_iocb(phba, &phba->sli.ring[ringno]); | 478 | lpfc_sli_resume_iocb(phba, &phba->sli.ring[ringno]); |
458 | spin_unlock_irq(phba->host->host_lock); | ||
459 | } | 479 | } |
460 | } | 480 | } |
481 | spin_unlock_irqrestore(&phba->hbalock, iflags); | ||
461 | } | 482 | } |
462 | 483 | ||
463 | static int | 484 | static int |
@@ -517,10 +538,10 @@ lpfc_sli_chk_mbx_command(uint8_t mbxCommand) | |||
517 | ret = MBX_SHUTDOWN; | 538 | ret = MBX_SHUTDOWN; |
518 | break; | 539 | break; |
519 | } | 540 | } |
520 | return (ret); | 541 | return ret; |
521 | } | 542 | } |
522 | static void | 543 | static void |
523 | lpfc_sli_wake_mbox_wait(struct lpfc_hba * phba, LPFC_MBOXQ_t * pmboxq) | 544 | lpfc_sli_wake_mbox_wait(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmboxq) |
524 | { | 545 | { |
525 | wait_queue_head_t *pdone_q; | 546 | wait_queue_head_t *pdone_q; |
526 | 547 | ||
@@ -536,7 +557,7 @@ lpfc_sli_wake_mbox_wait(struct lpfc_hba * phba, LPFC_MBOXQ_t * pmboxq) | |||
536 | } | 557 | } |
537 | 558 | ||
538 | void | 559 | void |
539 | lpfc_sli_def_mbox_cmpl(struct lpfc_hba * phba, LPFC_MBOXQ_t * pmb) | 560 | lpfc_sli_def_mbox_cmpl(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb) |
540 | { | 561 | { |
541 | struct lpfc_dmabuf *mp; | 562 | struct lpfc_dmabuf *mp; |
542 | uint16_t rpi; | 563 | uint16_t rpi; |
@@ -553,9 +574,9 @@ lpfc_sli_def_mbox_cmpl(struct lpfc_hba * phba, LPFC_MBOXQ_t * pmb) | |||
553 | * If a REG_LOGIN succeeded after node is destroyed or node | 574 | * If a REG_LOGIN succeeded after node is destroyed or node |
554 | * is in re-discovery driver need to cleanup the RPI. | 575 | * is in re-discovery driver need to cleanup the RPI. |
555 | */ | 576 | */ |
556 | if (!(phba->fc_flag & FC_UNLOADING) && | 577 | if (!(phba->pport->load_flag & FC_UNLOADING) && |
557 | (pmb->mb.mbxCommand == MBX_REG_LOGIN64) && | 578 | pmb->mb.mbxCommand == MBX_REG_LOGIN64 && |
558 | (!pmb->mb.mbxStatus)) { | 579 | !pmb->mb.mbxStatus) { |
559 | 580 | ||
560 | rpi = pmb->mb.un.varWords[0]; | 581 | rpi = pmb->mb.un.varWords[0]; |
561 | lpfc_unreg_login(phba, rpi, pmb); | 582 | lpfc_unreg_login(phba, rpi, pmb); |
@@ -565,24 +586,22 @@ lpfc_sli_def_mbox_cmpl(struct lpfc_hba * phba, LPFC_MBOXQ_t * pmb) | |||
565 | return; | 586 | return; |
566 | } | 587 | } |
567 | 588 | ||
568 | mempool_free( pmb, phba->mbox_mem_pool); | 589 | mempool_free(pmb, phba->mbox_mem_pool); |
569 | return; | 590 | return; |
570 | } | 591 | } |
571 | 592 | ||
572 | int | 593 | int |
573 | lpfc_sli_handle_mb_event(struct lpfc_hba * phba) | 594 | lpfc_sli_handle_mb_event(struct lpfc_hba *phba) |
574 | { | 595 | { |
575 | MAILBOX_t *mbox; | 596 | MAILBOX_t *mbox, *pmbox; |
576 | MAILBOX_t *pmbox; | ||
577 | LPFC_MBOXQ_t *pmb; | 597 | LPFC_MBOXQ_t *pmb; |
578 | struct lpfc_sli *psli; | ||
579 | int i, rc; | 598 | int i, rc; |
580 | uint32_t process_next; | 599 | uint32_t process_next; |
600 | unsigned long iflags; | ||
581 | 601 | ||
582 | psli = &phba->sli; | ||
583 | /* We should only get here if we are in SLI2 mode */ | 602 | /* We should only get here if we are in SLI2 mode */ |
584 | if (!(phba->sli.sli_flag & LPFC_SLI2_ACTIVE)) { | 603 | if (!(phba->sli.sli_flag & LPFC_SLI2_ACTIVE)) { |
585 | return (1); | 604 | return 1; |
586 | } | 605 | } |
587 | 606 | ||
588 | phba->sli.slistat.mbox_event++; | 607 | phba->sli.slistat.mbox_event++; |
@@ -616,15 +635,18 @@ lpfc_sli_handle_mb_event(struct lpfc_hba * phba) | |||
616 | pmbox->mbxCommand, | 635 | pmbox->mbxCommand, |
617 | pmbox->mbxStatus); | 636 | pmbox->mbxStatus); |
618 | 637 | ||
619 | spin_lock_irq(phba->host->host_lock); | 638 | spin_lock_irq(&phba->hbalock); |
620 | phba->sli.sli_flag |= LPFC_SLI_MBOX_ACTIVE; | 639 | phba->sli.sli_flag |= LPFC_SLI_MBOX_ACTIVE; |
621 | spin_unlock_irq(phba->host->host_lock); | 640 | spin_unlock_irq(&phba->hbalock); |
622 | return (1); | 641 | return 1; |
623 | } | 642 | } |
624 | 643 | ||
625 | mbout: | 644 | mbout: |
626 | del_timer_sync(&phba->sli.mbox_tmo); | 645 | del_timer_sync(&phba->sli.mbox_tmo); |
627 | phba->work_hba_events &= ~WORKER_MBOX_TMO; | 646 | |
647 | spin_lock_irqsave(&phba->pport->work_port_lock, iflags); | ||
648 | phba->pport->work_port_events &= ~WORKER_MBOX_TMO; | ||
649 | spin_unlock_irqrestore(&phba->pport->work_port_lock, iflags); | ||
628 | 650 | ||
629 | /* | 651 | /* |
630 | * It is a fatal error if unknown mbox command completion. | 652 | * It is a fatal error if unknown mbox command completion. |
@@ -639,10 +661,10 @@ lpfc_sli_handle_mb_event(struct lpfc_hba * phba) | |||
639 | "%d:0323 Unknown Mailbox command %x Cmpl\n", | 661 | "%d:0323 Unknown Mailbox command %x Cmpl\n", |
640 | phba->brd_no, | 662 | phba->brd_no, |
641 | pmbox->mbxCommand); | 663 | pmbox->mbxCommand); |
642 | phba->hba_state = LPFC_HBA_ERROR; | 664 | phba->link_state = LPFC_HBA_ERROR; |
643 | phba->work_hs = HS_FFER3; | 665 | phba->work_hs = HS_FFER3; |
644 | lpfc_handle_eratt(phba); | 666 | lpfc_handle_eratt(phba); |
645 | return (0); | 667 | return 0; |
646 | } | 668 | } |
647 | 669 | ||
648 | phba->sli.mbox_active = NULL; | 670 | phba->sli.mbox_active = NULL; |
@@ -659,15 +681,15 @@ lpfc_sli_handle_mb_event(struct lpfc_hba * phba) | |||
659 | pmbox->mbxCommand, | 681 | pmbox->mbxCommand, |
660 | pmbox->mbxStatus, | 682 | pmbox->mbxStatus, |
661 | pmbox->un.varWords[0], | 683 | pmbox->un.varWords[0], |
662 | phba->hba_state); | 684 | phba->pport->port_state); |
663 | pmbox->mbxStatus = 0; | 685 | pmbox->mbxStatus = 0; |
664 | pmbox->mbxOwner = OWN_HOST; | 686 | pmbox->mbxOwner = OWN_HOST; |
665 | spin_lock_irq(phba->host->host_lock); | 687 | spin_lock_irq(&phba->hbalock); |
666 | phba->sli.sli_flag &= ~LPFC_SLI_MBOX_ACTIVE; | 688 | phba->sli.sli_flag &= ~LPFC_SLI_MBOX_ACTIVE; |
667 | spin_unlock_irq(phba->host->host_lock); | 689 | spin_unlock_irq(&phba->hbalock); |
668 | rc = lpfc_sli_issue_mbox(phba, pmb, MBX_NOWAIT); | 690 | rc = lpfc_sli_issue_mbox(phba, pmb, MBX_NOWAIT); |
669 | if (rc == MBX_SUCCESS) | 691 | if (rc == MBX_SUCCESS) |
670 | return (0); | 692 | return 0; |
671 | } | 693 | } |
672 | } | 694 | } |
673 | 695 | ||
@@ -699,12 +721,12 @@ lpfc_sli_handle_mb_event(struct lpfc_hba * phba) | |||
699 | 721 | ||
700 | do { | 722 | do { |
701 | process_next = 0; /* by default don't loop */ | 723 | process_next = 0; /* by default don't loop */ |
702 | spin_lock_irq(phba->host->host_lock); | 724 | spin_lock_irq(&phba->hbalock); |
703 | phba->sli.sli_flag &= ~LPFC_SLI_MBOX_ACTIVE; | 725 | phba->sli.sli_flag &= ~LPFC_SLI_MBOX_ACTIVE; |
704 | 726 | ||
705 | /* Process next mailbox command if there is one */ | 727 | /* Process next mailbox command if there is one */ |
706 | if ((pmb = lpfc_mbox_get(phba))) { | 728 | if ((pmb = lpfc_mbox_get(phba))) { |
707 | spin_unlock_irq(phba->host->host_lock); | 729 | spin_unlock_irq(&phba->hbalock); |
708 | rc = lpfc_sli_issue_mbox(phba, pmb, MBX_NOWAIT); | 730 | rc = lpfc_sli_issue_mbox(phba, pmb, MBX_NOWAIT); |
709 | if (rc == MBX_NOT_FINISHED) { | 731 | if (rc == MBX_NOT_FINISHED) { |
710 | pmb->mb.mbxStatus = MBX_NOT_FINISHED; | 732 | pmb->mb.mbxStatus = MBX_NOT_FINISHED; |
@@ -713,7 +735,7 @@ lpfc_sli_handle_mb_event(struct lpfc_hba * phba) | |||
713 | continue; /* loop back */ | 735 | continue; /* loop back */ |
714 | } | 736 | } |
715 | } else { | 737 | } else { |
716 | spin_unlock_irq(phba->host->host_lock); | 738 | spin_unlock_irq(&phba->hbalock); |
717 | /* Turn on IOCB processing */ | 739 | /* Turn on IOCB processing */ |
718 | for (i = 0; i < phba->sli.num_rings; i++) | 740 | for (i = 0; i < phba->sli.num_rings; i++) |
719 | lpfc_sli_turn_on_ring(phba, i); | 741 | lpfc_sli_turn_on_ring(phba, i); |
@@ -721,7 +743,7 @@ lpfc_sli_handle_mb_event(struct lpfc_hba * phba) | |||
721 | 743 | ||
722 | } while (process_next); | 744 | } while (process_next); |
723 | 745 | ||
724 | return (0); | 746 | return 0; |
725 | } | 747 | } |
726 | static int | 748 | static int |
727 | lpfc_sli_process_unsol_iocb(struct lpfc_hba *phba, struct lpfc_sli_ring *pring, | 749 | lpfc_sli_process_unsol_iocb(struct lpfc_hba *phba, struct lpfc_sli_ring *pring, |
@@ -795,9 +817,9 @@ lpfc_sli_process_unsol_iocb(struct lpfc_hba *phba, struct lpfc_sli_ring *pring, | |||
795 | } | 817 | } |
796 | 818 | ||
797 | static struct lpfc_iocbq * | 819 | static struct lpfc_iocbq * |
798 | lpfc_sli_iocbq_lookup(struct lpfc_hba * phba, | 820 | lpfc_sli_iocbq_lookup(struct lpfc_hba *phba, |
799 | struct lpfc_sli_ring * pring, | 821 | struct lpfc_sli_ring *pring, |
800 | struct lpfc_iocbq * prspiocb) | 822 | struct lpfc_iocbq *prspiocb) |
801 | { | 823 | { |
802 | struct lpfc_iocbq *cmd_iocb = NULL; | 824 | struct lpfc_iocbq *cmd_iocb = NULL; |
803 | uint16_t iotag; | 825 | uint16_t iotag; |
@@ -821,16 +843,18 @@ lpfc_sli_iocbq_lookup(struct lpfc_hba * phba, | |||
821 | } | 843 | } |
822 | 844 | ||
823 | static int | 845 | static int |
824 | lpfc_sli_process_sol_iocb(struct lpfc_hba * phba, struct lpfc_sli_ring * pring, | 846 | lpfc_sli_process_sol_iocb(struct lpfc_hba *phba, struct lpfc_sli_ring *pring, |
825 | struct lpfc_iocbq *saveq) | 847 | struct lpfc_iocbq *saveq) |
826 | { | 848 | { |
827 | struct lpfc_iocbq * cmdiocbp; | 849 | struct lpfc_iocbq *cmdiocbp; |
828 | int rc = 1; | 850 | int rc = 1; |
829 | unsigned long iflag; | 851 | unsigned long iflag; |
830 | 852 | ||
831 | /* Based on the iotag field, get the cmd IOCB from the txcmplq */ | 853 | /* Based on the iotag field, get the cmd IOCB from the txcmplq */ |
832 | spin_lock_irqsave(phba->host->host_lock, iflag); | 854 | spin_lock_irqsave(&phba->hbalock, iflag); |
833 | cmdiocbp = lpfc_sli_iocbq_lookup(phba, pring, saveq); | 855 | cmdiocbp = lpfc_sli_iocbq_lookup(phba, pring, saveq); |
856 | spin_unlock_irqrestore(&phba->hbalock, iflag); | ||
857 | |||
834 | if (cmdiocbp) { | 858 | if (cmdiocbp) { |
835 | if (cmdiocbp->iocb_cmpl) { | 859 | if (cmdiocbp->iocb_cmpl) { |
836 | /* | 860 | /* |
@@ -846,17 +870,8 @@ lpfc_sli_process_sol_iocb(struct lpfc_hba * phba, struct lpfc_sli_ring * pring, | |||
846 | saveq->iocb.un.ulpWord[4] = | 870 | saveq->iocb.un.ulpWord[4] = |
847 | IOERR_SLI_ABORTED; | 871 | IOERR_SLI_ABORTED; |
848 | } | 872 | } |
849 | spin_unlock_irqrestore(phba->host->host_lock, | ||
850 | iflag); | ||
851 | (cmdiocbp->iocb_cmpl) (phba, cmdiocbp, saveq); | ||
852 | spin_lock_irqsave(phba->host->host_lock, iflag); | ||
853 | } | ||
854 | else { | ||
855 | spin_unlock_irqrestore(phba->host->host_lock, | ||
856 | iflag); | ||
857 | (cmdiocbp->iocb_cmpl) (phba, cmdiocbp, saveq); | ||
858 | spin_lock_irqsave(phba->host->host_lock, iflag); | ||
859 | } | 873 | } |
874 | (cmdiocbp->iocb_cmpl) (phba, cmdiocbp, saveq); | ||
860 | } else | 875 | } else |
861 | lpfc_sli_release_iocbq(phba, cmdiocbp); | 876 | lpfc_sli_release_iocbq(phba, cmdiocbp); |
862 | } else { | 877 | } else { |
@@ -885,12 +900,11 @@ lpfc_sli_process_sol_iocb(struct lpfc_hba * phba, struct lpfc_sli_ring * pring, | |||
885 | } | 900 | } |
886 | } | 901 | } |
887 | 902 | ||
888 | spin_unlock_irqrestore(phba->host->host_lock, iflag); | ||
889 | return rc; | 903 | return rc; |
890 | } | 904 | } |
891 | 905 | ||
892 | static void lpfc_sli_rsp_pointers_error(struct lpfc_hba * phba, | 906 | static void |
893 | struct lpfc_sli_ring * pring) | 907 | lpfc_sli_rsp_pointers_error(struct lpfc_hba *phba, struct lpfc_sli_ring *pring) |
894 | { | 908 | { |
895 | struct lpfc_pgp *pgp = &phba->slim2p->mbx.us.s2.port[pring->ringno]; | 909 | struct lpfc_pgp *pgp = &phba->slim2p->mbx.us.s2.port[pring->ringno]; |
896 | /* | 910 | /* |
@@ -904,7 +918,7 @@ static void lpfc_sli_rsp_pointers_error(struct lpfc_hba * phba, | |||
904 | le32_to_cpu(pgp->rspPutInx), | 918 | le32_to_cpu(pgp->rspPutInx), |
905 | pring->numRiocb); | 919 | pring->numRiocb); |
906 | 920 | ||
907 | phba->hba_state = LPFC_HBA_ERROR; | 921 | phba->link_state = LPFC_HBA_ERROR; |
908 | 922 | ||
909 | /* | 923 | /* |
910 | * All error attention handlers are posted to | 924 | * All error attention handlers are posted to |
@@ -918,10 +932,10 @@ static void lpfc_sli_rsp_pointers_error(struct lpfc_hba * phba, | |||
918 | return; | 932 | return; |
919 | } | 933 | } |
920 | 934 | ||
921 | void lpfc_sli_poll_fcp_ring(struct lpfc_hba * phba) | 935 | void lpfc_sli_poll_fcp_ring(struct lpfc_hba *phba) |
922 | { | 936 | { |
923 | struct lpfc_sli * psli = &phba->sli; | 937 | struct lpfc_sli *psli = &phba->sli; |
924 | struct lpfc_sli_ring * pring = &psli->ring[LPFC_FCP_RING]; | 938 | struct lpfc_sli_ring *pring = &psli->ring[LPFC_FCP_RING]; |
925 | IOCB_t *irsp = NULL; | 939 | IOCB_t *irsp = NULL; |
926 | IOCB_t *entry = NULL; | 940 | IOCB_t *entry = NULL; |
927 | struct lpfc_iocbq *cmdiocbq = NULL; | 941 | struct lpfc_iocbq *cmdiocbq = NULL; |
@@ -933,6 +947,7 @@ void lpfc_sli_poll_fcp_ring(struct lpfc_hba * phba) | |||
933 | uint32_t rsp_cmpl = 0; | 947 | uint32_t rsp_cmpl = 0; |
934 | void __iomem *to_slim; | 948 | void __iomem *to_slim; |
935 | uint32_t ha_copy; | 949 | uint32_t ha_copy; |
950 | unsigned long iflags; | ||
936 | 951 | ||
937 | pring->stats.iocb_event++; | 952 | pring->stats.iocb_event++; |
938 | 953 | ||
@@ -960,7 +975,7 @@ void lpfc_sli_poll_fcp_ring(struct lpfc_hba * phba) | |||
960 | 975 | ||
961 | lpfc_sli_pcimem_bcopy((uint32_t *) entry, | 976 | lpfc_sli_pcimem_bcopy((uint32_t *) entry, |
962 | (uint32_t *) &rspiocbq.iocb, | 977 | (uint32_t *) &rspiocbq.iocb, |
963 | sizeof (IOCB_t)); | 978 | sizeof(IOCB_t)); |
964 | irsp = &rspiocbq.iocb; | 979 | irsp = &rspiocbq.iocb; |
965 | type = lpfc_sli_iocb_cmd_type(irsp->ulpCommand & CMD_IOCB_MASK); | 980 | type = lpfc_sli_iocb_cmd_type(irsp->ulpCommand & CMD_IOCB_MASK); |
966 | pring->stats.iocb_rsp++; | 981 | pring->stats.iocb_rsp++; |
@@ -998,8 +1013,10 @@ void lpfc_sli_poll_fcp_ring(struct lpfc_hba * phba) | |||
998 | break; | 1013 | break; |
999 | } | 1014 | } |
1000 | 1015 | ||
1016 | spin_lock_irqsave(&phba->hbalock, iflags); | ||
1001 | cmdiocbq = lpfc_sli_iocbq_lookup(phba, pring, | 1017 | cmdiocbq = lpfc_sli_iocbq_lookup(phba, pring, |
1002 | &rspiocbq); | 1018 | &rspiocbq); |
1019 | spin_unlock_irqrestore(&phba->hbalock, iflags); | ||
1003 | if ((cmdiocbq) && (cmdiocbq->iocb_cmpl)) { | 1020 | if ((cmdiocbq) && (cmdiocbq->iocb_cmpl)) { |
1004 | (cmdiocbq->iocb_cmpl)(phba, cmdiocbq, | 1021 | (cmdiocbq->iocb_cmpl)(phba, cmdiocbq, |
1005 | &rspiocbq); | 1022 | &rspiocbq); |
@@ -1045,13 +1062,16 @@ void lpfc_sli_poll_fcp_ring(struct lpfc_hba * phba) | |||
1045 | ha_copy >>= (LPFC_FCP_RING * 4); | 1062 | ha_copy >>= (LPFC_FCP_RING * 4); |
1046 | 1063 | ||
1047 | if ((rsp_cmpl > 0) && (ha_copy & HA_R0RE_REQ)) { | 1064 | if ((rsp_cmpl > 0) && (ha_copy & HA_R0RE_REQ)) { |
1065 | spin_lock_irqsave(&phba->hbalock, iflags); | ||
1048 | pring->stats.iocb_rsp_full++; | 1066 | pring->stats.iocb_rsp_full++; |
1049 | status = ((CA_R0ATT | CA_R0RE_RSP) << (LPFC_FCP_RING * 4)); | 1067 | status = ((CA_R0ATT | CA_R0RE_RSP) << (LPFC_FCP_RING * 4)); |
1050 | writel(status, phba->CAregaddr); | 1068 | writel(status, phba->CAregaddr); |
1051 | readl(phba->CAregaddr); | 1069 | readl(phba->CAregaddr); |
1070 | spin_unlock_irqrestore(&phba->hbalock, iflags); | ||
1052 | } | 1071 | } |
1053 | if ((ha_copy & HA_R0CE_RSP) && | 1072 | if ((ha_copy & HA_R0CE_RSP) && |
1054 | (pring->flag & LPFC_CALL_RING_AVAILABLE)) { | 1073 | (pring->flag & LPFC_CALL_RING_AVAILABLE)) { |
1074 | spin_lock_irqsave(&phba->hbalock, iflags); | ||
1055 | pring->flag &= ~LPFC_CALL_RING_AVAILABLE; | 1075 | pring->flag &= ~LPFC_CALL_RING_AVAILABLE; |
1056 | pring->stats.iocb_cmd_empty++; | 1076 | pring->stats.iocb_cmd_empty++; |
1057 | 1077 | ||
@@ -1062,6 +1082,7 @@ void lpfc_sli_poll_fcp_ring(struct lpfc_hba * phba) | |||
1062 | if ((pring->lpfc_sli_cmd_available)) | 1082 | if ((pring->lpfc_sli_cmd_available)) |
1063 | (pring->lpfc_sli_cmd_available) (phba, pring); | 1083 | (pring->lpfc_sli_cmd_available) (phba, pring); |
1064 | 1084 | ||
1085 | spin_unlock_irqrestore(&phba->hbalock, iflags); | ||
1065 | } | 1086 | } |
1066 | 1087 | ||
1067 | return; | 1088 | return; |
@@ -1072,10 +1093,10 @@ void lpfc_sli_poll_fcp_ring(struct lpfc_hba * phba) | |||
1072 | * to check it explicitly. | 1093 | * to check it explicitly. |
1073 | */ | 1094 | */ |
1074 | static int | 1095 | static int |
1075 | lpfc_sli_handle_fast_ring_event(struct lpfc_hba * phba, | 1096 | lpfc_sli_handle_fast_ring_event(struct lpfc_hba *phba, |
1076 | struct lpfc_sli_ring * pring, uint32_t mask) | 1097 | struct lpfc_sli_ring *pring, uint32_t mask) |
1077 | { | 1098 | { |
1078 | struct lpfc_pgp *pgp = &phba->slim2p->mbx.us.s2.port[pring->ringno]; | 1099 | struct lpfc_pgp *pgp = &phba->slim2p->mbx.us.s2.port[pring->ringno]; |
1079 | IOCB_t *irsp = NULL; | 1100 | IOCB_t *irsp = NULL; |
1080 | IOCB_t *entry = NULL; | 1101 | IOCB_t *entry = NULL; |
1081 | struct lpfc_iocbq *cmdiocbq = NULL; | 1102 | struct lpfc_iocbq *cmdiocbq = NULL; |
@@ -1086,9 +1107,9 @@ lpfc_sli_handle_fast_ring_event(struct lpfc_hba * phba, | |||
1086 | lpfc_iocb_type type; | 1107 | lpfc_iocb_type type; |
1087 | unsigned long iflag; | 1108 | unsigned long iflag; |
1088 | uint32_t rsp_cmpl = 0; | 1109 | uint32_t rsp_cmpl = 0; |
1089 | void __iomem *to_slim; | 1110 | void __iomem *to_slim; |
1090 | 1111 | ||
1091 | spin_lock_irqsave(phba->host->host_lock, iflag); | 1112 | spin_lock_irqsave(&phba->hbalock, iflag); |
1092 | pring->stats.iocb_event++; | 1113 | pring->stats.iocb_event++; |
1093 | 1114 | ||
1094 | /* | 1115 | /* |
@@ -1099,7 +1120,7 @@ lpfc_sli_handle_fast_ring_event(struct lpfc_hba * phba, | |||
1099 | portRspPut = le32_to_cpu(pgp->rspPutInx); | 1120 | portRspPut = le32_to_cpu(pgp->rspPutInx); |
1100 | if (unlikely(portRspPut >= portRspMax)) { | 1121 | if (unlikely(portRspPut >= portRspMax)) { |
1101 | lpfc_sli_rsp_pointers_error(phba, pring); | 1122 | lpfc_sli_rsp_pointers_error(phba, pring); |
1102 | spin_unlock_irqrestore(phba->host->host_lock, iflag); | 1123 | spin_unlock_irqrestore(&phba->hbalock, iflag); |
1103 | return 1; | 1124 | return 1; |
1104 | } | 1125 | } |
1105 | 1126 | ||
@@ -1117,7 +1138,7 @@ lpfc_sli_handle_fast_ring_event(struct lpfc_hba * phba, | |||
1117 | 1138 | ||
1118 | lpfc_sli_pcimem_bcopy((uint32_t *) entry, | 1139 | lpfc_sli_pcimem_bcopy((uint32_t *) entry, |
1119 | (uint32_t *) &rspiocbq.iocb, | 1140 | (uint32_t *) &rspiocbq.iocb, |
1120 | sizeof (IOCB_t)); | 1141 | sizeof(IOCB_t)); |
1121 | INIT_LIST_HEAD(&(rspiocbq.list)); | 1142 | INIT_LIST_HEAD(&(rspiocbq.list)); |
1122 | irsp = &rspiocbq.iocb; | 1143 | irsp = &rspiocbq.iocb; |
1123 | 1144 | ||
@@ -1161,19 +1182,19 @@ lpfc_sli_handle_fast_ring_event(struct lpfc_hba * phba, | |||
1161 | (cmdiocbq->iocb_cmpl)(phba, cmdiocbq, | 1182 | (cmdiocbq->iocb_cmpl)(phba, cmdiocbq, |
1162 | &rspiocbq); | 1183 | &rspiocbq); |
1163 | } else { | 1184 | } else { |
1164 | spin_unlock_irqrestore( | 1185 | spin_unlock_irqrestore(&phba->hbalock, |
1165 | phba->host->host_lock, iflag); | 1186 | iflag); |
1166 | (cmdiocbq->iocb_cmpl)(phba, cmdiocbq, | 1187 | (cmdiocbq->iocb_cmpl)(phba, cmdiocbq, |
1167 | &rspiocbq); | 1188 | &rspiocbq); |
1168 | spin_lock_irqsave(phba->host->host_lock, | 1189 | spin_lock_irqsave(&phba->hbalock, |
1169 | iflag); | 1190 | iflag); |
1170 | } | 1191 | } |
1171 | } | 1192 | } |
1172 | break; | 1193 | break; |
1173 | case LPFC_UNSOL_IOCB: | 1194 | case LPFC_UNSOL_IOCB: |
1174 | spin_unlock_irqrestore(phba->host->host_lock, iflag); | 1195 | spin_unlock_irqrestore(&phba->hbalock, iflag); |
1175 | lpfc_sli_process_unsol_iocb(phba, pring, &rspiocbq); | 1196 | lpfc_sli_process_unsol_iocb(phba, pring, &rspiocbq); |
1176 | spin_lock_irqsave(phba->host->host_lock, iflag); | 1197 | spin_lock_irqsave(&phba->hbalock, iflag); |
1177 | break; | 1198 | break; |
1178 | default: | 1199 | default: |
1179 | if (irsp->ulpCommand == CMD_ADAPTER_MSG) { | 1200 | if (irsp->ulpCommand == CMD_ADAPTER_MSG) { |
@@ -1228,31 +1249,31 @@ lpfc_sli_handle_fast_ring_event(struct lpfc_hba * phba, | |||
1228 | 1249 | ||
1229 | } | 1250 | } |
1230 | 1251 | ||
1231 | spin_unlock_irqrestore(phba->host->host_lock, iflag); | 1252 | spin_unlock_irqrestore(&phba->hbalock, iflag); |
1232 | return rc; | 1253 | return rc; |
1233 | } | 1254 | } |
1234 | 1255 | ||
1235 | 1256 | ||
1236 | int | 1257 | int |
1237 | lpfc_sli_handle_slow_ring_event(struct lpfc_hba * phba, | 1258 | lpfc_sli_handle_slow_ring_event(struct lpfc_hba *phba, |
1238 | struct lpfc_sli_ring * pring, uint32_t mask) | 1259 | struct lpfc_sli_ring *pring, uint32_t mask) |
1239 | { | 1260 | { |
1261 | struct lpfc_pgp *pgp = &phba->slim2p->mbx.us.s2.port[pring->ringno]; | ||
1240 | IOCB_t *entry; | 1262 | IOCB_t *entry; |
1241 | IOCB_t *irsp = NULL; | 1263 | IOCB_t *irsp = NULL; |
1242 | struct lpfc_iocbq *rspiocbp = NULL; | 1264 | struct lpfc_iocbq *rspiocbp = NULL; |
1243 | struct lpfc_iocbq *next_iocb; | 1265 | struct lpfc_iocbq *next_iocb; |
1244 | struct lpfc_iocbq *cmdiocbp; | 1266 | struct lpfc_iocbq *cmdiocbp; |
1245 | struct lpfc_iocbq *saveq; | 1267 | struct lpfc_iocbq *saveq; |
1246 | struct lpfc_pgp *pgp = &phba->slim2p->mbx.us.s2.port[pring->ringno]; | ||
1247 | uint8_t iocb_cmd_type; | 1268 | uint8_t iocb_cmd_type; |
1248 | lpfc_iocb_type type; | 1269 | lpfc_iocb_type type; |
1249 | uint32_t status, free_saveq; | 1270 | uint32_t status, free_saveq; |
1250 | uint32_t portRspPut, portRspMax; | 1271 | uint32_t portRspPut, portRspMax; |
1251 | int rc = 1; | 1272 | int rc = 1; |
1252 | unsigned long iflag; | 1273 | unsigned long iflag; |
1253 | void __iomem *to_slim; | 1274 | void __iomem *to_slim; |
1254 | 1275 | ||
1255 | spin_lock_irqsave(phba->host->host_lock, iflag); | 1276 | spin_lock_irqsave(&phba->hbalock, iflag); |
1256 | pring->stats.iocb_event++; | 1277 | pring->stats.iocb_event++; |
1257 | 1278 | ||
1258 | /* | 1279 | /* |
@@ -1274,8 +1295,8 @@ lpfc_sli_handle_slow_ring_event(struct lpfc_hba * phba, | |||
1274 | phba->brd_no, | 1295 | phba->brd_no, |
1275 | pring->ringno, portRspPut, portRspMax); | 1296 | pring->ringno, portRspPut, portRspMax); |
1276 | 1297 | ||
1277 | phba->hba_state = LPFC_HBA_ERROR; | 1298 | phba->link_state = LPFC_HBA_ERROR; |
1278 | spin_unlock_irqrestore(phba->host->host_lock, iflag); | 1299 | spin_unlock_irqrestore(&phba->hbalock, iflag); |
1279 | 1300 | ||
1280 | phba->work_hs = HS_FFER3; | 1301 | phba->work_hs = HS_FFER3; |
1281 | lpfc_handle_eratt(phba); | 1302 | lpfc_handle_eratt(phba); |
@@ -1299,14 +1320,14 @@ lpfc_sli_handle_slow_ring_event(struct lpfc_hba * phba, | |||
1299 | * received. | 1320 | * received. |
1300 | */ | 1321 | */ |
1301 | entry = IOCB_ENTRY(pring->rspringaddr, pring->rspidx); | 1322 | entry = IOCB_ENTRY(pring->rspringaddr, pring->rspidx); |
1302 | rspiocbp = lpfc_sli_get_iocbq(phba); | 1323 | rspiocbp = __lpfc_sli_get_iocbq(phba); |
1303 | if (rspiocbp == NULL) { | 1324 | if (rspiocbp == NULL) { |
1304 | printk(KERN_ERR "%s: out of buffers! Failing " | 1325 | printk(KERN_ERR "%s: out of buffers! Failing " |
1305 | "completion.\n", __FUNCTION__); | 1326 | "completion.\n", __FUNCTION__); |
1306 | break; | 1327 | break; |
1307 | } | 1328 | } |
1308 | 1329 | ||
1309 | lpfc_sli_pcimem_bcopy(entry, &rspiocbp->iocb, sizeof (IOCB_t)); | 1330 | lpfc_sli_pcimem_bcopy(entry, &rspiocbp->iocb, sizeof(IOCB_t)); |
1310 | irsp = &rspiocbp->iocb; | 1331 | irsp = &rspiocbp->iocb; |
1311 | 1332 | ||
1312 | if (++pring->rspidx >= portRspMax) | 1333 | if (++pring->rspidx >= portRspMax) |
@@ -1366,17 +1387,17 @@ lpfc_sli_handle_slow_ring_event(struct lpfc_hba * phba, | |||
1366 | iocb_cmd_type = irsp->ulpCommand & CMD_IOCB_MASK; | 1387 | iocb_cmd_type = irsp->ulpCommand & CMD_IOCB_MASK; |
1367 | type = lpfc_sli_iocb_cmd_type(iocb_cmd_type); | 1388 | type = lpfc_sli_iocb_cmd_type(iocb_cmd_type); |
1368 | if (type == LPFC_SOL_IOCB) { | 1389 | if (type == LPFC_SOL_IOCB) { |
1369 | spin_unlock_irqrestore(phba->host->host_lock, | 1390 | spin_unlock_irqrestore(&phba->hbalock, |
1370 | iflag); | 1391 | iflag); |
1371 | rc = lpfc_sli_process_sol_iocb(phba, pring, | 1392 | rc = lpfc_sli_process_sol_iocb(phba, pring, |
1372 | saveq); | 1393 | saveq); |
1373 | spin_lock_irqsave(phba->host->host_lock, iflag); | 1394 | spin_lock_irqsave(&phba->hbalock, iflag); |
1374 | } else if (type == LPFC_UNSOL_IOCB) { | 1395 | } else if (type == LPFC_UNSOL_IOCB) { |
1375 | spin_unlock_irqrestore(phba->host->host_lock, | 1396 | spin_unlock_irqrestore(&phba->hbalock, |
1376 | iflag); | 1397 | iflag); |
1377 | rc = lpfc_sli_process_unsol_iocb(phba, pring, | 1398 | rc = lpfc_sli_process_unsol_iocb(phba, pring, |
1378 | saveq); | 1399 | saveq); |
1379 | spin_lock_irqsave(phba->host->host_lock, iflag); | 1400 | spin_lock_irqsave(&phba->hbalock, iflag); |
1380 | } else if (type == LPFC_ABORT_IOCB) { | 1401 | } else if (type == LPFC_ABORT_IOCB) { |
1381 | if ((irsp->ulpCommand != CMD_XRI_ABORTED_CX) && | 1402 | if ((irsp->ulpCommand != CMD_XRI_ABORTED_CX) && |
1382 | ((cmdiocbp = | 1403 | ((cmdiocbp = |
@@ -1386,15 +1407,15 @@ lpfc_sli_handle_slow_ring_event(struct lpfc_hba * phba, | |||
1386 | routine */ | 1407 | routine */ |
1387 | if (cmdiocbp->iocb_cmpl) { | 1408 | if (cmdiocbp->iocb_cmpl) { |
1388 | spin_unlock_irqrestore( | 1409 | spin_unlock_irqrestore( |
1389 | phba->host->host_lock, | 1410 | &phba->hbalock, |
1390 | iflag); | 1411 | iflag); |
1391 | (cmdiocbp->iocb_cmpl) (phba, | 1412 | (cmdiocbp->iocb_cmpl) (phba, |
1392 | cmdiocbp, saveq); | 1413 | cmdiocbp, saveq); |
1393 | spin_lock_irqsave( | 1414 | spin_lock_irqsave( |
1394 | phba->host->host_lock, | 1415 | &phba->hbalock, |
1395 | iflag); | 1416 | iflag); |
1396 | } else | 1417 | } else |
1397 | lpfc_sli_release_iocbq(phba, | 1418 | __lpfc_sli_release_iocbq(phba, |
1398 | cmdiocbp); | 1419 | cmdiocbp); |
1399 | } | 1420 | } |
1400 | } else if (type == LPFC_UNKNOWN_IOCB) { | 1421 | } else if (type == LPFC_UNKNOWN_IOCB) { |
@@ -1425,17 +1446,13 @@ lpfc_sli_handle_slow_ring_event(struct lpfc_hba * phba, | |||
1425 | } | 1446 | } |
1426 | 1447 | ||
1427 | if (free_saveq) { | 1448 | if (free_saveq) { |
1428 | if (!list_empty(&saveq->list)) { | 1449 | list_for_each_entry_safe(rspiocbp, next_iocb, |
1429 | list_for_each_entry_safe(rspiocbp, | 1450 | &saveq->list, list) { |
1430 | next_iocb, | 1451 | list_del(&rspiocbp->list); |
1431 | &saveq->list, | 1452 | __lpfc_sli_release_iocbq(phba, |
1432 | list) { | 1453 | rspiocbp); |
1433 | list_del(&rspiocbp->list); | ||
1434 | lpfc_sli_release_iocbq(phba, | ||
1435 | rspiocbp); | ||
1436 | } | ||
1437 | } | 1454 | } |
1438 | lpfc_sli_release_iocbq(phba, saveq); | 1455 | __lpfc_sli_release_iocbq(phba, saveq); |
1439 | } | 1456 | } |
1440 | } | 1457 | } |
1441 | 1458 | ||
@@ -1470,24 +1487,21 @@ lpfc_sli_handle_slow_ring_event(struct lpfc_hba * phba, | |||
1470 | 1487 | ||
1471 | } | 1488 | } |
1472 | 1489 | ||
1473 | spin_unlock_irqrestore(phba->host->host_lock, iflag); | 1490 | spin_unlock_irqrestore(&phba->hbalock, iflag); |
1474 | return rc; | 1491 | return rc; |
1475 | } | 1492 | } |
1476 | 1493 | ||
1477 | int | 1494 | void |
1478 | lpfc_sli_abort_iocb_ring(struct lpfc_hba *phba, struct lpfc_sli_ring *pring) | 1495 | lpfc_sli_abort_iocb_ring(struct lpfc_hba *phba, struct lpfc_sli_ring *pring) |
1479 | { | 1496 | { |
1480 | LIST_HEAD(completions); | 1497 | LIST_HEAD(completions); |
1481 | struct lpfc_iocbq *iocb, *next_iocb; | 1498 | struct lpfc_iocbq *iocb, *next_iocb; |
1482 | IOCB_t *cmd = NULL; | 1499 | IOCB_t *cmd = NULL; |
1483 | int errcnt; | ||
1484 | |||
1485 | errcnt = 0; | ||
1486 | 1500 | ||
1487 | /* Error everything on txq and txcmplq | 1501 | /* Error everything on txq and txcmplq |
1488 | * First do the txq. | 1502 | * First do the txq. |
1489 | */ | 1503 | */ |
1490 | spin_lock_irq(phba->host->host_lock); | 1504 | spin_lock_irq(&phba->hbalock); |
1491 | list_splice_init(&pring->txq, &completions); | 1505 | list_splice_init(&pring->txq, &completions); |
1492 | pring->txq_cnt = 0; | 1506 | pring->txq_cnt = 0; |
1493 | 1507 | ||
@@ -1495,26 +1509,25 @@ lpfc_sli_abort_iocb_ring(struct lpfc_hba *phba, struct lpfc_sli_ring *pring) | |||
1495 | list_for_each_entry_safe(iocb, next_iocb, &pring->txcmplq, list) | 1509 | list_for_each_entry_safe(iocb, next_iocb, &pring->txcmplq, list) |
1496 | lpfc_sli_issue_abort_iotag(phba, pring, iocb); | 1510 | lpfc_sli_issue_abort_iotag(phba, pring, iocb); |
1497 | 1511 | ||
1498 | spin_unlock_irq(phba->host->host_lock); | 1512 | spin_unlock_irq(&phba->hbalock); |
1499 | 1513 | ||
1500 | while (!list_empty(&completions)) { | 1514 | while (!list_empty(&completions)) { |
1501 | iocb = list_get_first(&completions, struct lpfc_iocbq, list); | 1515 | iocb = list_get_first(&completions, struct lpfc_iocbq, list); |
1502 | cmd = &iocb->iocb; | 1516 | cmd = &iocb->iocb; |
1503 | list_del(&iocb->list); | 1517 | list_del(&iocb->list); |
1504 | 1518 | ||
1505 | if (iocb->iocb_cmpl) { | 1519 | if (!iocb->iocb_cmpl) |
1520 | lpfc_sli_release_iocbq(phba, iocb); | ||
1521 | else { | ||
1506 | cmd->ulpStatus = IOSTAT_LOCAL_REJECT; | 1522 | cmd->ulpStatus = IOSTAT_LOCAL_REJECT; |
1507 | cmd->un.ulpWord[4] = IOERR_SLI_ABORTED; | 1523 | cmd->un.ulpWord[4] = IOERR_SLI_ABORTED; |
1508 | (iocb->iocb_cmpl) (phba, iocb, iocb); | 1524 | (iocb->iocb_cmpl) (phba, iocb, iocb); |
1509 | } else | 1525 | } |
1510 | lpfc_sli_release_iocbq(phba, iocb); | ||
1511 | } | 1526 | } |
1512 | |||
1513 | return errcnt; | ||
1514 | } | 1527 | } |
1515 | 1528 | ||
1516 | int | 1529 | int |
1517 | lpfc_sli_brdready(struct lpfc_hba * phba, uint32_t mask) | 1530 | lpfc_sli_brdready(struct lpfc_hba *phba, uint32_t mask) |
1518 | { | 1531 | { |
1519 | uint32_t status; | 1532 | uint32_t status; |
1520 | int i = 0; | 1533 | int i = 0; |
@@ -1541,7 +1554,8 @@ lpfc_sli_brdready(struct lpfc_hba * phba, uint32_t mask) | |||
1541 | msleep(2500); | 1554 | msleep(2500); |
1542 | 1555 | ||
1543 | if (i == 15) { | 1556 | if (i == 15) { |
1544 | phba->hba_state = LPFC_STATE_UNKNOWN; /* Do post */ | 1557 | /* Do post */ |
1558 | phba->pport->port_state = LPFC_STATE_UNKNOWN; | ||
1545 | lpfc_sli_brdrestart(phba); | 1559 | lpfc_sli_brdrestart(phba); |
1546 | } | 1560 | } |
1547 | /* Read the HBA Host Status Register */ | 1561 | /* Read the HBA Host Status Register */ |
@@ -1550,7 +1564,7 @@ lpfc_sli_brdready(struct lpfc_hba * phba, uint32_t mask) | |||
1550 | 1564 | ||
1551 | /* Check to see if any errors occurred during init */ | 1565 | /* Check to see if any errors occurred during init */ |
1552 | if ((status & HS_FFERM) || (i >= 20)) { | 1566 | if ((status & HS_FFERM) || (i >= 20)) { |
1553 | phba->hba_state = LPFC_HBA_ERROR; | 1567 | phba->link_state = LPFC_HBA_ERROR; |
1554 | retval = 1; | 1568 | retval = 1; |
1555 | } | 1569 | } |
1556 | 1570 | ||
@@ -1559,7 +1573,7 @@ lpfc_sli_brdready(struct lpfc_hba * phba, uint32_t mask) | |||
1559 | 1573 | ||
1560 | #define BARRIER_TEST_PATTERN (0xdeadbeef) | 1574 | #define BARRIER_TEST_PATTERN (0xdeadbeef) |
1561 | 1575 | ||
1562 | void lpfc_reset_barrier(struct lpfc_hba * phba) | 1576 | void lpfc_reset_barrier(struct lpfc_hba *phba) |
1563 | { | 1577 | { |
1564 | uint32_t __iomem *resp_buf; | 1578 | uint32_t __iomem *resp_buf; |
1565 | uint32_t __iomem *mbox_buf; | 1579 | uint32_t __iomem *mbox_buf; |
@@ -1584,12 +1598,12 @@ void lpfc_reset_barrier(struct lpfc_hba * phba) | |||
1584 | hc_copy = readl(phba->HCregaddr); | 1598 | hc_copy = readl(phba->HCregaddr); |
1585 | writel((hc_copy & ~HC_ERINT_ENA), phba->HCregaddr); | 1599 | writel((hc_copy & ~HC_ERINT_ENA), phba->HCregaddr); |
1586 | readl(phba->HCregaddr); /* flush */ | 1600 | readl(phba->HCregaddr); /* flush */ |
1587 | phba->fc_flag |= FC_IGNORE_ERATT; | 1601 | phba->link_flag |= LS_IGNORE_ERATT; |
1588 | 1602 | ||
1589 | if (readl(phba->HAregaddr) & HA_ERATT) { | 1603 | if (readl(phba->HAregaddr) & HA_ERATT) { |
1590 | /* Clear Chip error bit */ | 1604 | /* Clear Chip error bit */ |
1591 | writel(HA_ERATT, phba->HAregaddr); | 1605 | writel(HA_ERATT, phba->HAregaddr); |
1592 | phba->stopped = 1; | 1606 | phba->pport->stopped = 1; |
1593 | } | 1607 | } |
1594 | 1608 | ||
1595 | mbox = 0; | 1609 | mbox = 0; |
@@ -1606,7 +1620,7 @@ void lpfc_reset_barrier(struct lpfc_hba * phba) | |||
1606 | 1620 | ||
1607 | if (readl(resp_buf + 1) != ~(BARRIER_TEST_PATTERN)) { | 1621 | if (readl(resp_buf + 1) != ~(BARRIER_TEST_PATTERN)) { |
1608 | if (phba->sli.sli_flag & LPFC_SLI2_ACTIVE || | 1622 | if (phba->sli.sli_flag & LPFC_SLI2_ACTIVE || |
1609 | phba->stopped) | 1623 | phba->pport->stopped) |
1610 | goto restore_hc; | 1624 | goto restore_hc; |
1611 | else | 1625 | else |
1612 | goto clear_errat; | 1626 | goto clear_errat; |
@@ -1623,17 +1637,17 @@ clear_errat: | |||
1623 | 1637 | ||
1624 | if (readl(phba->HAregaddr) & HA_ERATT) { | 1638 | if (readl(phba->HAregaddr) & HA_ERATT) { |
1625 | writel(HA_ERATT, phba->HAregaddr); | 1639 | writel(HA_ERATT, phba->HAregaddr); |
1626 | phba->stopped = 1; | 1640 | phba->pport->stopped = 1; |
1627 | } | 1641 | } |
1628 | 1642 | ||
1629 | restore_hc: | 1643 | restore_hc: |
1630 | phba->fc_flag &= ~FC_IGNORE_ERATT; | 1644 | phba->link_flag &= ~LS_IGNORE_ERATT; |
1631 | writel(hc_copy, phba->HCregaddr); | 1645 | writel(hc_copy, phba->HCregaddr); |
1632 | readl(phba->HCregaddr); /* flush */ | 1646 | readl(phba->HCregaddr); /* flush */ |
1633 | } | 1647 | } |
1634 | 1648 | ||
1635 | int | 1649 | int |
1636 | lpfc_sli_brdkill(struct lpfc_hba * phba) | 1650 | lpfc_sli_brdkill(struct lpfc_hba *phba) |
1637 | { | 1651 | { |
1638 | struct lpfc_sli *psli; | 1652 | struct lpfc_sli *psli; |
1639 | LPFC_MBOXQ_t *pmb; | 1653 | LPFC_MBOXQ_t *pmb; |
@@ -1650,7 +1664,7 @@ lpfc_sli_brdkill(struct lpfc_hba * phba) | |||
1650 | LOG_SLI, | 1664 | LOG_SLI, |
1651 | "%d:0329 Kill HBA Data: x%x x%x\n", | 1665 | "%d:0329 Kill HBA Data: x%x x%x\n", |
1652 | phba->brd_no, | 1666 | phba->brd_no, |
1653 | phba->hba_state, | 1667 | phba->pport->port_state, |
1654 | psli->sli_flag); | 1668 | psli->sli_flag); |
1655 | 1669 | ||
1656 | if ((pmb = (LPFC_MBOXQ_t *) mempool_alloc(phba->mbox_mem_pool, | 1670 | if ((pmb = (LPFC_MBOXQ_t *) mempool_alloc(phba->mbox_mem_pool, |
@@ -1658,13 +1672,13 @@ lpfc_sli_brdkill(struct lpfc_hba * phba) | |||
1658 | return 1; | 1672 | return 1; |
1659 | 1673 | ||
1660 | /* Disable the error attention */ | 1674 | /* Disable the error attention */ |
1661 | spin_lock_irq(phba->host->host_lock); | 1675 | spin_lock_irq(&phba->hbalock); |
1662 | status = readl(phba->HCregaddr); | 1676 | status = readl(phba->HCregaddr); |
1663 | status &= ~HC_ERINT_ENA; | 1677 | status &= ~HC_ERINT_ENA; |
1664 | writel(status, phba->HCregaddr); | 1678 | writel(status, phba->HCregaddr); |
1665 | readl(phba->HCregaddr); /* flush */ | 1679 | readl(phba->HCregaddr); /* flush */ |
1666 | phba->fc_flag |= FC_IGNORE_ERATT; | 1680 | phba->link_flag |= LS_IGNORE_ERATT; |
1667 | spin_unlock_irq(phba->host->host_lock); | 1681 | spin_unlock_irq(&phba->hbalock); |
1668 | 1682 | ||
1669 | lpfc_kill_board(phba, pmb); | 1683 | lpfc_kill_board(phba, pmb); |
1670 | pmb->mbox_cmpl = lpfc_sli_def_mbox_cmpl; | 1684 | pmb->mbox_cmpl = lpfc_sli_def_mbox_cmpl; |
@@ -1673,9 +1687,9 @@ lpfc_sli_brdkill(struct lpfc_hba * phba) | |||
1673 | if (retval != MBX_SUCCESS) { | 1687 | if (retval != MBX_SUCCESS) { |
1674 | if (retval != MBX_BUSY) | 1688 | if (retval != MBX_BUSY) |
1675 | mempool_free(pmb, phba->mbox_mem_pool); | 1689 | mempool_free(pmb, phba->mbox_mem_pool); |
1676 | spin_lock_irq(phba->host->host_lock); | 1690 | spin_lock_irq(&phba->hbalock); |
1677 | phba->fc_flag &= ~FC_IGNORE_ERATT; | 1691 | phba->link_flag &= ~LS_IGNORE_ERATT; |
1678 | spin_unlock_irq(phba->host->host_lock); | 1692 | spin_unlock_irq(&phba->hbalock); |
1679 | return 1; | 1693 | return 1; |
1680 | } | 1694 | } |
1681 | 1695 | ||
@@ -1698,22 +1712,22 @@ lpfc_sli_brdkill(struct lpfc_hba * phba) | |||
1698 | del_timer_sync(&psli->mbox_tmo); | 1712 | del_timer_sync(&psli->mbox_tmo); |
1699 | if (ha_copy & HA_ERATT) { | 1713 | if (ha_copy & HA_ERATT) { |
1700 | writel(HA_ERATT, phba->HAregaddr); | 1714 | writel(HA_ERATT, phba->HAregaddr); |
1701 | phba->stopped = 1; | 1715 | phba->pport->stopped = 1; |
1702 | } | 1716 | } |
1703 | spin_lock_irq(phba->host->host_lock); | 1717 | spin_lock_irq(&phba->hbalock); |
1704 | psli->sli_flag &= ~LPFC_SLI_MBOX_ACTIVE; | 1718 | psli->sli_flag &= ~LPFC_SLI_MBOX_ACTIVE; |
1705 | phba->fc_flag &= ~FC_IGNORE_ERATT; | 1719 | phba->link_flag &= ~LS_IGNORE_ERATT; |
1706 | spin_unlock_irq(phba->host->host_lock); | 1720 | spin_unlock_irq(&phba->hbalock); |
1707 | 1721 | ||
1708 | psli->mbox_active = NULL; | 1722 | psli->mbox_active = NULL; |
1709 | lpfc_hba_down_post(phba); | 1723 | lpfc_hba_down_post(phba); |
1710 | phba->hba_state = LPFC_HBA_ERROR; | 1724 | phba->link_state = LPFC_HBA_ERROR; |
1711 | 1725 | ||
1712 | return (ha_copy & HA_ERATT ? 0 : 1); | 1726 | return ha_copy & HA_ERATT ? 0 : 1; |
1713 | } | 1727 | } |
1714 | 1728 | ||
1715 | int | 1729 | int |
1716 | lpfc_sli_brdreset(struct lpfc_hba * phba) | 1730 | lpfc_sli_brdreset(struct lpfc_hba *phba) |
1717 | { | 1731 | { |
1718 | struct lpfc_sli *psli; | 1732 | struct lpfc_sli *psli; |
1719 | struct lpfc_sli_ring *pring; | 1733 | struct lpfc_sli_ring *pring; |
@@ -1725,12 +1739,12 @@ lpfc_sli_brdreset(struct lpfc_hba * phba) | |||
1725 | /* Reset HBA */ | 1739 | /* Reset HBA */ |
1726 | lpfc_printf_log(phba, KERN_INFO, LOG_SLI, | 1740 | lpfc_printf_log(phba, KERN_INFO, LOG_SLI, |
1727 | "%d:0325 Reset HBA Data: x%x x%x\n", phba->brd_no, | 1741 | "%d:0325 Reset HBA Data: x%x x%x\n", phba->brd_no, |
1728 | phba->hba_state, psli->sli_flag); | 1742 | phba->pport->port_state, psli->sli_flag); |
1729 | 1743 | ||
1730 | /* perform board reset */ | 1744 | /* perform board reset */ |
1731 | phba->fc_eventTag = 0; | 1745 | phba->fc_eventTag = 0; |
1732 | phba->fc_myDID = 0; | 1746 | phba->pport->fc_myDID = 0; |
1733 | phba->fc_prevDID = 0; | 1747 | phba->pport->fc_prevDID = 0; |
1734 | 1748 | ||
1735 | /* Turn off parity checking and serr during the physical reset */ | 1749 | /* Turn off parity checking and serr during the physical reset */ |
1736 | pci_read_config_word(phba->pcidev, PCI_COMMAND, &cfg_value); | 1750 | pci_read_config_word(phba->pcidev, PCI_COMMAND, &cfg_value); |
@@ -1760,12 +1774,12 @@ lpfc_sli_brdreset(struct lpfc_hba * phba) | |||
1760 | pring->missbufcnt = 0; | 1774 | pring->missbufcnt = 0; |
1761 | } | 1775 | } |
1762 | 1776 | ||
1763 | phba->hba_state = LPFC_WARM_START; | 1777 | phba->link_state = LPFC_WARM_START; |
1764 | return 0; | 1778 | return 0; |
1765 | } | 1779 | } |
1766 | 1780 | ||
1767 | int | 1781 | int |
1768 | lpfc_sli_brdrestart(struct lpfc_hba * phba) | 1782 | lpfc_sli_brdrestart(struct lpfc_hba *phba) |
1769 | { | 1783 | { |
1770 | MAILBOX_t *mb; | 1784 | MAILBOX_t *mb; |
1771 | struct lpfc_sli *psli; | 1785 | struct lpfc_sli *psli; |
@@ -1773,14 +1787,14 @@ lpfc_sli_brdrestart(struct lpfc_hba * phba) | |||
1773 | volatile uint32_t word0; | 1787 | volatile uint32_t word0; |
1774 | void __iomem *to_slim; | 1788 | void __iomem *to_slim; |
1775 | 1789 | ||
1776 | spin_lock_irq(phba->host->host_lock); | 1790 | spin_lock_irq(&phba->hbalock); |
1777 | 1791 | ||
1778 | psli = &phba->sli; | 1792 | psli = &phba->sli; |
1779 | 1793 | ||
1780 | /* Restart HBA */ | 1794 | /* Restart HBA */ |
1781 | lpfc_printf_log(phba, KERN_INFO, LOG_SLI, | 1795 | lpfc_printf_log(phba, KERN_INFO, LOG_SLI, |
1782 | "%d:0337 Restart HBA Data: x%x x%x\n", phba->brd_no, | 1796 | "%d:0337 Restart HBA Data: x%x x%x\n", phba->brd_no, |
1783 | phba->hba_state, psli->sli_flag); | 1797 | phba->pport->port_state, psli->sli_flag); |
1784 | 1798 | ||
1785 | word0 = 0; | 1799 | word0 = 0; |
1786 | mb = (MAILBOX_t *) &word0; | 1800 | mb = (MAILBOX_t *) &word0; |
@@ -1794,7 +1808,7 @@ lpfc_sli_brdrestart(struct lpfc_hba * phba) | |||
1794 | readl(to_slim); /* flush */ | 1808 | readl(to_slim); /* flush */ |
1795 | 1809 | ||
1796 | /* Only skip post after fc_ffinit is completed */ | 1810 | /* Only skip post after fc_ffinit is completed */ |
1797 | if (phba->hba_state) { | 1811 | if (phba->pport->port_state) { |
1798 | skip_post = 1; | 1812 | skip_post = 1; |
1799 | word0 = 1; /* This is really setting up word1 */ | 1813 | word0 = 1; /* This is really setting up word1 */ |
1800 | } else { | 1814 | } else { |
@@ -1806,10 +1820,10 @@ lpfc_sli_brdrestart(struct lpfc_hba * phba) | |||
1806 | readl(to_slim); /* flush */ | 1820 | readl(to_slim); /* flush */ |
1807 | 1821 | ||
1808 | lpfc_sli_brdreset(phba); | 1822 | lpfc_sli_brdreset(phba); |
1809 | phba->stopped = 0; | 1823 | phba->pport->stopped = 0; |
1810 | phba->hba_state = LPFC_INIT_START; | 1824 | phba->link_state = LPFC_INIT_START; |
1811 | 1825 | ||
1812 | spin_unlock_irq(phba->host->host_lock); | 1826 | spin_unlock_irq(&phba->hbalock); |
1813 | 1827 | ||
1814 | memset(&psli->lnk_stat_offsets, 0, sizeof(psli->lnk_stat_offsets)); | 1828 | memset(&psli->lnk_stat_offsets, 0, sizeof(psli->lnk_stat_offsets)); |
1815 | psli->stats_start = get_seconds(); | 1829 | psli->stats_start = get_seconds(); |
@@ -1850,7 +1864,7 @@ lpfc_sli_chipset_init(struct lpfc_hba *phba) | |||
1850 | "timeout, status reg x%x\n", | 1864 | "timeout, status reg x%x\n", |
1851 | phba->brd_no, | 1865 | phba->brd_no, |
1852 | status); | 1866 | status); |
1853 | phba->hba_state = LPFC_HBA_ERROR; | 1867 | phba->link_state = LPFC_HBA_ERROR; |
1854 | return -ETIMEDOUT; | 1868 | return -ETIMEDOUT; |
1855 | } | 1869 | } |
1856 | 1870 | ||
@@ -1866,7 +1880,7 @@ lpfc_sli_chipset_init(struct lpfc_hba *phba) | |||
1866 | "chipset, status reg x%x\n", | 1880 | "chipset, status reg x%x\n", |
1867 | phba->brd_no, | 1881 | phba->brd_no, |
1868 | status); | 1882 | status); |
1869 | phba->hba_state = LPFC_HBA_ERROR; | 1883 | phba->link_state = LPFC_HBA_ERROR; |
1870 | return -EIO; | 1884 | return -EIO; |
1871 | } | 1885 | } |
1872 | 1886 | ||
@@ -1879,7 +1893,8 @@ lpfc_sli_chipset_init(struct lpfc_hba *phba) | |||
1879 | } | 1893 | } |
1880 | 1894 | ||
1881 | if (i == 15) { | 1895 | if (i == 15) { |
1882 | phba->hba_state = LPFC_STATE_UNKNOWN; /* Do post */ | 1896 | /* Do post */ |
1897 | phba->pport->port_state = LPFC_STATE_UNKNOWN; | ||
1883 | lpfc_sli_brdrestart(phba); | 1898 | lpfc_sli_brdrestart(phba); |
1884 | } | 1899 | } |
1885 | /* Read the HBA Host Status Register */ | 1900 | /* Read the HBA Host Status Register */ |
@@ -1897,7 +1912,7 @@ lpfc_sli_chipset_init(struct lpfc_hba *phba) | |||
1897 | "status reg x%x\n", | 1912 | "status reg x%x\n", |
1898 | phba->brd_no, | 1913 | phba->brd_no, |
1899 | status); | 1914 | status); |
1900 | phba->hba_state = LPFC_HBA_ERROR; | 1915 | phba->link_state = LPFC_HBA_ERROR; |
1901 | return -EIO; | 1916 | return -EIO; |
1902 | } | 1917 | } |
1903 | 1918 | ||
@@ -1912,31 +1927,31 @@ lpfc_sli_chipset_init(struct lpfc_hba *phba) | |||
1912 | } | 1927 | } |
1913 | 1928 | ||
1914 | int | 1929 | int |
1915 | lpfc_sli_hba_setup(struct lpfc_hba * phba) | 1930 | lpfc_sli_hba_setup(struct lpfc_hba *phba) |
1916 | { | 1931 | { |
1917 | LPFC_MBOXQ_t *pmb; | 1932 | LPFC_MBOXQ_t *pmb; |
1918 | uint32_t resetcount = 0, rc = 0, done = 0; | 1933 | uint32_t resetcount = 0, rc = 0, done = 0; |
1919 | 1934 | ||
1920 | pmb = (LPFC_MBOXQ_t *) mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); | 1935 | pmb = (LPFC_MBOXQ_t *) mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); |
1921 | if (!pmb) { | 1936 | if (!pmb) { |
1922 | phba->hba_state = LPFC_HBA_ERROR; | 1937 | phba->link_state = LPFC_HBA_ERROR; |
1923 | return -ENOMEM; | 1938 | return -ENOMEM; |
1924 | } | 1939 | } |
1925 | 1940 | ||
1926 | while (resetcount < 2 && !done) { | 1941 | while (resetcount < 2 && !done) { |
1927 | spin_lock_irq(phba->host->host_lock); | 1942 | spin_lock_irq(&phba->hbalock); |
1928 | phba->sli.sli_flag |= LPFC_SLI_MBOX_ACTIVE; | 1943 | phba->sli.sli_flag |= LPFC_SLI_MBOX_ACTIVE; |
1929 | spin_unlock_irq(phba->host->host_lock); | 1944 | spin_unlock_irq(&phba->hbalock); |
1930 | phba->hba_state = LPFC_STATE_UNKNOWN; | 1945 | phba->pport->port_state = LPFC_STATE_UNKNOWN; |
1931 | lpfc_sli_brdrestart(phba); | 1946 | lpfc_sli_brdrestart(phba); |
1932 | msleep(2500); | 1947 | msleep(2500); |
1933 | rc = lpfc_sli_chipset_init(phba); | 1948 | rc = lpfc_sli_chipset_init(phba); |
1934 | if (rc) | 1949 | if (rc) |
1935 | break; | 1950 | break; |
1936 | 1951 | ||
1937 | spin_lock_irq(phba->host->host_lock); | 1952 | spin_lock_irq(&phba->hbalock); |
1938 | phba->sli.sli_flag &= ~LPFC_SLI_MBOX_ACTIVE; | 1953 | phba->sli.sli_flag &= ~LPFC_SLI_MBOX_ACTIVE; |
1939 | spin_unlock_irq(phba->host->host_lock); | 1954 | spin_unlock_irq(&phba->hbalock); |
1940 | resetcount++; | 1955 | resetcount++; |
1941 | 1956 | ||
1942 | /* Call pre CONFIG_PORT mailbox command initialization. A value of 0 | 1957 | /* Call pre CONFIG_PORT mailbox command initialization. A value of 0 |
@@ -1946,13 +1961,13 @@ lpfc_sli_hba_setup(struct lpfc_hba * phba) | |||
1946 | */ | 1961 | */ |
1947 | rc = lpfc_config_port_prep(phba); | 1962 | rc = lpfc_config_port_prep(phba); |
1948 | if (rc == -ERESTART) { | 1963 | if (rc == -ERESTART) { |
1949 | phba->hba_state = 0; | 1964 | phba->pport->port_state = 0; |
1950 | continue; | 1965 | continue; |
1951 | } else if (rc) { | 1966 | } else if (rc) { |
1952 | break; | 1967 | break; |
1953 | } | 1968 | } |
1954 | 1969 | ||
1955 | phba->hba_state = LPFC_INIT_MBX_CMDS; | 1970 | phba->link_state = LPFC_INIT_MBX_CMDS; |
1956 | lpfc_config_port(phba, pmb); | 1971 | lpfc_config_port(phba, pmb); |
1957 | rc = lpfc_sli_issue_mbox(phba, pmb, MBX_POLL); | 1972 | rc = lpfc_sli_issue_mbox(phba, pmb, MBX_POLL); |
1958 | if (rc == MBX_SUCCESS) | 1973 | if (rc == MBX_SUCCESS) |
@@ -1963,7 +1978,10 @@ lpfc_sli_hba_setup(struct lpfc_hba * phba) | |||
1963 | "CONFIG_PORT, mbxStatus x%x Data: x%x\n", | 1978 | "CONFIG_PORT, mbxStatus x%x Data: x%x\n", |
1964 | phba->brd_no, pmb->mb.mbxCommand, | 1979 | phba->brd_no, pmb->mb.mbxCommand, |
1965 | pmb->mb.mbxStatus, 0); | 1980 | pmb->mb.mbxStatus, 0); |
1981 | spin_lock_irq(&phba->hbalock); | ||
1966 | phba->sli.sli_flag &= ~LPFC_SLI2_ACTIVE; | 1982 | phba->sli.sli_flag &= ~LPFC_SLI2_ACTIVE; |
1983 | spin_unlock_irq(&phba->hbalock); | ||
1984 | rc = -ENXIO; | ||
1967 | } | 1985 | } |
1968 | } | 1986 | } |
1969 | if (!done) | 1987 | if (!done) |
@@ -1982,7 +2000,7 @@ lpfc_sli_hba_setup(struct lpfc_hba * phba) | |||
1982 | 2000 | ||
1983 | goto lpfc_sli_hba_setup_exit; | 2001 | goto lpfc_sli_hba_setup_exit; |
1984 | lpfc_sli_hba_setup_error: | 2002 | lpfc_sli_hba_setup_error: |
1985 | phba->hba_state = LPFC_HBA_ERROR; | 2003 | phba->link_state = LPFC_HBA_ERROR; |
1986 | lpfc_sli_hba_setup_exit: | 2004 | lpfc_sli_hba_setup_exit: |
1987 | mempool_free(pmb, phba->mbox_mem_pool); | 2005 | mempool_free(pmb, phba->mbox_mem_pool); |
1988 | return rc; | 2006 | return rc; |
@@ -2004,36 +2022,34 @@ lpfc_sli_hba_setup_exit: | |||
2004 | void | 2022 | void |
2005 | lpfc_mbox_timeout(unsigned long ptr) | 2023 | lpfc_mbox_timeout(unsigned long ptr) |
2006 | { | 2024 | { |
2007 | struct lpfc_hba *phba; | 2025 | struct lpfc_hba *phba = (struct lpfc_hba *) phba; |
2008 | unsigned long iflag; | 2026 | unsigned long iflag; |
2027 | uint32_t tmo_posted; | ||
2009 | 2028 | ||
2010 | phba = (struct lpfc_hba *)ptr; | 2029 | spin_lock_irqsave(&phba->pport->work_port_lock, iflag); |
2011 | spin_lock_irqsave(phba->host->host_lock, iflag); | 2030 | tmo_posted = (phba->pport->work_port_events & WORKER_MBOX_TMO) == 0; |
2012 | if (!(phba->work_hba_events & WORKER_MBOX_TMO)) { | 2031 | if (!tmo_posted) |
2013 | phba->work_hba_events |= WORKER_MBOX_TMO; | 2032 | phba->pport->work_port_events |= WORKER_MBOX_TMO; |
2033 | spin_unlock_irqrestore(&phba->pport->work_port_lock, iflag); | ||
2034 | |||
2035 | if (!tmo_posted) { | ||
2014 | if (phba->work_wait) | 2036 | if (phba->work_wait) |
2015 | wake_up(phba->work_wait); | 2037 | wake_up(phba->work_wait); |
2016 | } | 2038 | } |
2017 | spin_unlock_irqrestore(phba->host->host_lock, iflag); | ||
2018 | } | 2039 | } |
2019 | 2040 | ||
2020 | void | 2041 | void |
2021 | lpfc_mbox_timeout_handler(struct lpfc_hba *phba) | 2042 | lpfc_mbox_timeout_handler(struct lpfc_hba *phba) |
2022 | { | 2043 | { |
2023 | LPFC_MBOXQ_t *pmbox; | 2044 | LPFC_MBOXQ_t *pmbox = phba->sli.mbox_active; |
2024 | MAILBOX_t *mb; | 2045 | MAILBOX_t *mb = &pmbox->mb; |
2025 | struct lpfc_sli *psli = &phba->sli; | 2046 | struct lpfc_sli *psli = &phba->sli; |
2026 | struct lpfc_sli_ring *pring; | 2047 | struct lpfc_sli_ring *pring; |
2027 | 2048 | ||
2028 | spin_lock_irq(phba->host->host_lock); | 2049 | if (!(phba->pport->work_port_events & WORKER_MBOX_TMO)) { |
2029 | if (!(phba->work_hba_events & WORKER_MBOX_TMO)) { | ||
2030 | spin_unlock_irq(phba->host->host_lock); | ||
2031 | return; | 2050 | return; |
2032 | } | 2051 | } |
2033 | 2052 | ||
2034 | pmbox = phba->sli.mbox_active; | ||
2035 | mb = &pmbox->mb; | ||
2036 | |||
2037 | /* Mbox cmd <mbxCommand> timeout */ | 2053 | /* Mbox cmd <mbxCommand> timeout */ |
2038 | lpfc_printf_log(phba, | 2054 | lpfc_printf_log(phba, |
2039 | KERN_ERR, | 2055 | KERN_ERR, |
@@ -2041,7 +2057,7 @@ lpfc_mbox_timeout_handler(struct lpfc_hba *phba) | |||
2041 | "%d:0310 Mailbox command x%x timeout Data: x%x x%x x%p\n", | 2057 | "%d:0310 Mailbox command x%x timeout Data: x%x x%x x%p\n", |
2042 | phba->brd_no, | 2058 | phba->brd_no, |
2043 | mb->mbxCommand, | 2059 | mb->mbxCommand, |
2044 | phba->hba_state, | 2060 | phba->pport->port_state, |
2045 | phba->sli.sli_flag, | 2061 | phba->sli.sli_flag, |
2046 | phba->sli.mbox_active); | 2062 | phba->sli.mbox_active); |
2047 | 2063 | ||
@@ -2049,11 +2065,14 @@ lpfc_mbox_timeout_handler(struct lpfc_hba *phba) | |||
2049 | * would get IOCB_ERROR from lpfc_sli_issue_iocb, allowing | 2065 | * would get IOCB_ERROR from lpfc_sli_issue_iocb, allowing |
2050 | * it to fail all oustanding SCSI IO. | 2066 | * it to fail all oustanding SCSI IO. |
2051 | */ | 2067 | */ |
2052 | phba->hba_state = LPFC_STATE_UNKNOWN; | 2068 | spin_lock_irq(&phba->pport->work_port_lock); |
2053 | phba->work_hba_events &= ~WORKER_MBOX_TMO; | 2069 | phba->pport->work_port_events &= ~WORKER_MBOX_TMO; |
2054 | phba->fc_flag |= FC_ESTABLISH_LINK; | 2070 | spin_unlock_irq(&phba->pport->work_port_lock); |
2071 | spin_lock_irq(&phba->hbalock); | ||
2072 | phba->link_state = LPFC_LINK_UNKNOWN; | ||
2073 | phba->pport->fc_flag |= FC_ESTABLISH_LINK; | ||
2055 | psli->sli_flag &= ~LPFC_SLI2_ACTIVE; | 2074 | psli->sli_flag &= ~LPFC_SLI2_ACTIVE; |
2056 | spin_unlock_irq(phba->host->host_lock); | 2075 | spin_unlock_irq(&phba->hbalock); |
2057 | 2076 | ||
2058 | pring = &psli->ring[psli->fcp_ring]; | 2077 | pring = &psli->ring[psli->fcp_ring]; |
2059 | lpfc_sli_abort_iocb_ring(phba, pring); | 2078 | lpfc_sli_abort_iocb_ring(phba, pring); |
@@ -2075,10 +2094,10 @@ lpfc_mbox_timeout_handler(struct lpfc_hba *phba) | |||
2075 | } | 2094 | } |
2076 | 2095 | ||
2077 | int | 2096 | int |
2078 | lpfc_sli_issue_mbox(struct lpfc_hba * phba, LPFC_MBOXQ_t * pmbox, uint32_t flag) | 2097 | lpfc_sli_issue_mbox(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmbox, uint32_t flag) |
2079 | { | 2098 | { |
2080 | MAILBOX_t *mb; | 2099 | MAILBOX_t *mb; |
2081 | struct lpfc_sli *psli; | 2100 | struct lpfc_sli *psli = &phba->sli; |
2082 | uint32_t status, evtctr; | 2101 | uint32_t status, evtctr; |
2083 | uint32_t ha_copy; | 2102 | uint32_t ha_copy; |
2084 | int i; | 2103 | int i; |
@@ -2090,27 +2109,25 @@ lpfc_sli_issue_mbox(struct lpfc_hba * phba, LPFC_MBOXQ_t * pmbox, uint32_t flag) | |||
2090 | if (unlikely(pci_channel_offline(phba->pcidev))) | 2109 | if (unlikely(pci_channel_offline(phba->pcidev))) |
2091 | return MBX_NOT_FINISHED; | 2110 | return MBX_NOT_FINISHED; |
2092 | 2111 | ||
2112 | spin_lock_irqsave(&phba->hbalock, drvr_flag); | ||
2093 | psli = &phba->sli; | 2113 | psli = &phba->sli; |
2094 | 2114 | ||
2095 | spin_lock_irqsave(phba->host->host_lock, drvr_flag); | ||
2096 | |||
2097 | |||
2098 | mb = &pmbox->mb; | 2115 | mb = &pmbox->mb; |
2099 | status = MBX_SUCCESS; | 2116 | status = MBX_SUCCESS; |
2100 | 2117 | ||
2101 | if (phba->hba_state == LPFC_HBA_ERROR) { | 2118 | if (phba->link_state == LPFC_HBA_ERROR) { |
2102 | spin_unlock_irqrestore(phba->host->host_lock, drvr_flag); | 2119 | spin_unlock_irqrestore(&phba->hbalock, drvr_flag); |
2103 | 2120 | ||
2104 | /* Mbox command <mbxCommand> cannot issue */ | 2121 | /* Mbox command <mbxCommand> cannot issue */ |
2105 | LOG_MBOX_CANNOT_ISSUE_DATA( phba, mb, psli, flag) | 2122 | LOG_MBOX_CANNOT_ISSUE_DATA( phba, mb, psli, flag) |
2106 | return (MBX_NOT_FINISHED); | 2123 | return MBX_NOT_FINISHED; |
2107 | } | 2124 | } |
2108 | 2125 | ||
2109 | if (mb->mbxCommand != MBX_KILL_BOARD && flag & MBX_NOWAIT && | 2126 | if (mb->mbxCommand != MBX_KILL_BOARD && flag & MBX_NOWAIT && |
2110 | !(readl(phba->HCregaddr) & HC_MBINT_ENA)) { | 2127 | !(readl(phba->HCregaddr) & HC_MBINT_ENA)) { |
2111 | spin_unlock_irqrestore(phba->host->host_lock, drvr_flag); | 2128 | spin_unlock_irqrestore(&phba->hbalock, drvr_flag); |
2112 | LOG_MBOX_CANNOT_ISSUE_DATA( phba, mb, psli, flag) | 2129 | LOG_MBOX_CANNOT_ISSUE_DATA( phba, mb, psli, flag) |
2113 | return (MBX_NOT_FINISHED); | 2130 | return MBX_NOT_FINISHED; |
2114 | } | 2131 | } |
2115 | 2132 | ||
2116 | if (psli->sli_flag & LPFC_SLI_MBOX_ACTIVE) { | 2133 | if (psli->sli_flag & LPFC_SLI_MBOX_ACTIVE) { |
@@ -2120,20 +2137,18 @@ lpfc_sli_issue_mbox(struct lpfc_hba * phba, LPFC_MBOXQ_t * pmbox, uint32_t flag) | |||
2120 | */ | 2137 | */ |
2121 | 2138 | ||
2122 | if (flag & MBX_POLL) { | 2139 | if (flag & MBX_POLL) { |
2123 | spin_unlock_irqrestore(phba->host->host_lock, | 2140 | spin_unlock_irqrestore(&phba->hbalock, drvr_flag); |
2124 | drvr_flag); | ||
2125 | 2141 | ||
2126 | /* Mbox command <mbxCommand> cannot issue */ | 2142 | /* Mbox command <mbxCommand> cannot issue */ |
2127 | LOG_MBOX_CANNOT_ISSUE_DATA( phba, mb, psli, flag) | 2143 | LOG_MBOX_CANNOT_ISSUE_DATA(phba, mb, psli, flag); |
2128 | return (MBX_NOT_FINISHED); | 2144 | return MBX_NOT_FINISHED; |
2129 | } | 2145 | } |
2130 | 2146 | ||
2131 | if (!(psli->sli_flag & LPFC_SLI2_ACTIVE)) { | 2147 | if (!(psli->sli_flag & LPFC_SLI2_ACTIVE)) { |
2132 | spin_unlock_irqrestore(phba->host->host_lock, | 2148 | spin_unlock_irqrestore(&phba->hbalock, drvr_flag); |
2133 | drvr_flag); | ||
2134 | /* Mbox command <mbxCommand> cannot issue */ | 2149 | /* Mbox command <mbxCommand> cannot issue */ |
2135 | LOG_MBOX_CANNOT_ISSUE_DATA( phba, mb, psli, flag) | 2150 | LOG_MBOX_CANNOT_ISSUE_DATA(phba, mb, psli, flag); |
2136 | return (MBX_NOT_FINISHED); | 2151 | return MBX_NOT_FINISHED; |
2137 | } | 2152 | } |
2138 | 2153 | ||
2139 | /* Handle STOP IOCB processing flag. This is only meaningful | 2154 | /* Handle STOP IOCB processing flag. This is only meaningful |
@@ -2163,15 +2178,14 @@ lpfc_sli_issue_mbox(struct lpfc_hba * phba, LPFC_MBOXQ_t * pmbox, uint32_t flag) | |||
2163 | "%d:0308 Mbox cmd issue - BUSY Data: x%x x%x x%x x%x\n", | 2178 | "%d:0308 Mbox cmd issue - BUSY Data: x%x x%x x%x x%x\n", |
2164 | phba->brd_no, | 2179 | phba->brd_no, |
2165 | mb->mbxCommand, | 2180 | mb->mbxCommand, |
2166 | phba->hba_state, | 2181 | phba->pport->port_state, |
2167 | psli->sli_flag, | 2182 | psli->sli_flag, |
2168 | flag); | 2183 | flag); |
2169 | 2184 | ||
2170 | psli->slistat.mbox_busy++; | 2185 | psli->slistat.mbox_busy++; |
2171 | spin_unlock_irqrestore(phba->host->host_lock, | 2186 | spin_unlock_irqrestore(&phba->hbalock, drvr_flag); |
2172 | drvr_flag); | ||
2173 | 2187 | ||
2174 | return (MBX_BUSY); | 2188 | return MBX_BUSY; |
2175 | } | 2189 | } |
2176 | 2190 | ||
2177 | /* Handle STOP IOCB processing flag. This is only meaningful | 2191 | /* Handle STOP IOCB processing flag. This is only meaningful |
@@ -2198,11 +2212,10 @@ lpfc_sli_issue_mbox(struct lpfc_hba * phba, LPFC_MBOXQ_t * pmbox, uint32_t flag) | |||
2198 | if (!(psli->sli_flag & LPFC_SLI2_ACTIVE) && | 2212 | if (!(psli->sli_flag & LPFC_SLI2_ACTIVE) && |
2199 | (mb->mbxCommand != MBX_KILL_BOARD)) { | 2213 | (mb->mbxCommand != MBX_KILL_BOARD)) { |
2200 | psli->sli_flag &= ~LPFC_SLI_MBOX_ACTIVE; | 2214 | psli->sli_flag &= ~LPFC_SLI_MBOX_ACTIVE; |
2201 | spin_unlock_irqrestore(phba->host->host_lock, | 2215 | spin_unlock_irqrestore(&phba->hbalock, drvr_flag); |
2202 | drvr_flag); | ||
2203 | /* Mbox command <mbxCommand> cannot issue */ | 2216 | /* Mbox command <mbxCommand> cannot issue */ |
2204 | LOG_MBOX_CANNOT_ISSUE_DATA( phba, mb, psli, flag); | 2217 | LOG_MBOX_CANNOT_ISSUE_DATA( phba, mb, psli, flag); |
2205 | return (MBX_NOT_FINISHED); | 2218 | return MBX_NOT_FINISHED; |
2206 | } | 2219 | } |
2207 | /* timeout active mbox command */ | 2220 | /* timeout active mbox command */ |
2208 | mod_timer(&psli->mbox_tmo, (jiffies + | 2221 | mod_timer(&psli->mbox_tmo, (jiffies + |
@@ -2216,9 +2229,9 @@ lpfc_sli_issue_mbox(struct lpfc_hba * phba, LPFC_MBOXQ_t * pmbox, uint32_t flag) | |||
2216 | "%d:0309 Mailbox cmd x%x issue Data: x%x x%x x%x\n", | 2229 | "%d:0309 Mailbox cmd x%x issue Data: x%x x%x x%x\n", |
2217 | phba->brd_no, | 2230 | phba->brd_no, |
2218 | mb->mbxCommand, | 2231 | mb->mbxCommand, |
2219 | phba->hba_state, | 2232 | phba->pport->port_state, |
2220 | psli->sli_flag, | 2233 | psli->sli_flag, |
2221 | flag); | 2234 | flag); |
2222 | 2235 | ||
2223 | psli->slistat.mbox_cmd++; | 2236 | psli->slistat.mbox_cmd++; |
2224 | evtctr = psli->slistat.mbox_event; | 2237 | evtctr = psli->slistat.mbox_event; |
@@ -2285,12 +2298,12 @@ lpfc_sli_issue_mbox(struct lpfc_hba * phba, LPFC_MBOXQ_t * pmbox, uint32_t flag) | |||
2285 | /* Wait for command to complete */ | 2298 | /* Wait for command to complete */ |
2286 | while (((word0 & OWN_CHIP) == OWN_CHIP) || | 2299 | while (((word0 & OWN_CHIP) == OWN_CHIP) || |
2287 | (!(ha_copy & HA_MBATT) && | 2300 | (!(ha_copy & HA_MBATT) && |
2288 | (phba->hba_state > LPFC_WARM_START))) { | 2301 | (phba->link_state > LPFC_WARM_START))) { |
2289 | if (i-- <= 0) { | 2302 | if (i-- <= 0) { |
2290 | psli->sli_flag &= ~LPFC_SLI_MBOX_ACTIVE; | 2303 | psli->sli_flag &= ~LPFC_SLI_MBOX_ACTIVE; |
2291 | spin_unlock_irqrestore(phba->host->host_lock, | 2304 | spin_unlock_irqrestore(&phba->hbalock, |
2292 | drvr_flag); | 2305 | drvr_flag); |
2293 | return (MBX_NOT_FINISHED); | 2306 | return MBX_NOT_FINISHED; |
2294 | } | 2307 | } |
2295 | 2308 | ||
2296 | /* Check if we took a mbox interrupt while we were | 2309 | /* Check if we took a mbox interrupt while we were |
@@ -2299,12 +2312,12 @@ lpfc_sli_issue_mbox(struct lpfc_hba * phba, LPFC_MBOXQ_t * pmbox, uint32_t flag) | |||
2299 | && (evtctr != psli->slistat.mbox_event)) | 2312 | && (evtctr != psli->slistat.mbox_event)) |
2300 | break; | 2313 | break; |
2301 | 2314 | ||
2302 | spin_unlock_irqrestore(phba->host->host_lock, | 2315 | spin_unlock_irqrestore(&phba->hbalock, |
2303 | drvr_flag); | 2316 | drvr_flag); |
2304 | 2317 | ||
2305 | msleep(1); | 2318 | msleep(1); |
2306 | 2319 | ||
2307 | spin_lock_irqsave(phba->host->host_lock, drvr_flag); | 2320 | spin_lock_irqsave(&phba->hbalock, drvr_flag); |
2308 | 2321 | ||
2309 | if (psli->sli_flag & LPFC_SLI2_ACTIVE) { | 2322 | if (psli->sli_flag & LPFC_SLI2_ACTIVE) { |
2310 | /* First copy command data */ | 2323 | /* First copy command data */ |
@@ -2342,7 +2355,7 @@ lpfc_sli_issue_mbox(struct lpfc_hba * phba, LPFC_MBOXQ_t * pmbox, uint32_t flag) | |||
2342 | MAILBOX_CMD_SIZE); | 2355 | MAILBOX_CMD_SIZE); |
2343 | if ((mb->mbxCommand == MBX_DUMP_MEMORY) && | 2356 | if ((mb->mbxCommand == MBX_DUMP_MEMORY) && |
2344 | pmbox->context2) { | 2357 | pmbox->context2) { |
2345 | lpfc_memcpy_from_slim((void *)pmbox->context2, | 2358 | lpfc_memcpy_from_slim((void *) pmbox->context2, |
2346 | phba->MBslimaddr + DMP_RSP_OFFSET, | 2359 | phba->MBslimaddr + DMP_RSP_OFFSET, |
2347 | mb->un.varDmp.word_cnt); | 2360 | mb->un.varDmp.word_cnt); |
2348 | } | 2361 | } |
@@ -2355,23 +2368,27 @@ lpfc_sli_issue_mbox(struct lpfc_hba * phba, LPFC_MBOXQ_t * pmbox, uint32_t flag) | |||
2355 | status = mb->mbxStatus; | 2368 | status = mb->mbxStatus; |
2356 | } | 2369 | } |
2357 | 2370 | ||
2358 | spin_unlock_irqrestore(phba->host->host_lock, drvr_flag); | 2371 | spin_unlock_irqrestore(&phba->hbalock, drvr_flag); |
2359 | return (status); | 2372 | return status; |
2360 | } | 2373 | } |
2361 | 2374 | ||
2362 | static int | 2375 | static int |
2363 | lpfc_sli_ringtx_put(struct lpfc_hba * phba, struct lpfc_sli_ring * pring, | 2376 | lpfc_sli_ringtx_put(struct lpfc_hba *phba, struct lpfc_sli_ring *pring, |
2364 | struct lpfc_iocbq * piocb) | 2377 | struct lpfc_iocbq *piocb) |
2365 | { | 2378 | { |
2379 | unsigned long iflags; | ||
2380 | |||
2366 | /* Insert the caller's iocb in the txq tail for later processing. */ | 2381 | /* Insert the caller's iocb in the txq tail for later processing. */ |
2382 | spin_lock_irqsave(&phba->hbalock, iflags); | ||
2367 | list_add_tail(&piocb->list, &pring->txq); | 2383 | list_add_tail(&piocb->list, &pring->txq); |
2368 | pring->txq_cnt++; | 2384 | pring->txq_cnt++; |
2369 | return (0); | 2385 | spin_unlock_irqrestore(&phba->hbalock, iflags); |
2386 | return 0; | ||
2370 | } | 2387 | } |
2371 | 2388 | ||
2372 | static struct lpfc_iocbq * | 2389 | static struct lpfc_iocbq * |
2373 | lpfc_sli_next_iocb(struct lpfc_hba *phba, struct lpfc_sli_ring *pring, | 2390 | lpfc_sli_next_iocb(struct lpfc_hba *phba, struct lpfc_sli_ring *pring, |
2374 | struct lpfc_iocbq ** piocb) | 2391 | struct lpfc_iocbq **piocb) |
2375 | { | 2392 | { |
2376 | struct lpfc_iocbq * nextiocb; | 2393 | struct lpfc_iocbq * nextiocb; |
2377 | 2394 | ||
@@ -2389,6 +2406,7 @@ lpfc_sli_issue_iocb(struct lpfc_hba *phba, struct lpfc_sli_ring *pring, | |||
2389 | struct lpfc_iocbq *piocb, uint32_t flag) | 2406 | struct lpfc_iocbq *piocb, uint32_t flag) |
2390 | { | 2407 | { |
2391 | struct lpfc_iocbq *nextiocb; | 2408 | struct lpfc_iocbq *nextiocb; |
2409 | unsigned long iflags; | ||
2392 | IOCB_t *iocb; | 2410 | IOCB_t *iocb; |
2393 | 2411 | ||
2394 | /* If the PCI channel is in offline state, do not post iocbs. */ | 2412 | /* If the PCI channel is in offline state, do not post iocbs. */ |
@@ -2398,7 +2416,7 @@ lpfc_sli_issue_iocb(struct lpfc_hba *phba, struct lpfc_sli_ring *pring, | |||
2398 | /* | 2416 | /* |
2399 | * We should never get an IOCB if we are in a < LINK_DOWN state | 2417 | * We should never get an IOCB if we are in a < LINK_DOWN state |
2400 | */ | 2418 | */ |
2401 | if (unlikely(phba->hba_state < LPFC_LINK_DOWN)) | 2419 | if (unlikely(phba->link_state < LPFC_LINK_DOWN)) |
2402 | return IOCB_ERROR; | 2420 | return IOCB_ERROR; |
2403 | 2421 | ||
2404 | /* | 2422 | /* |
@@ -2408,7 +2426,7 @@ lpfc_sli_issue_iocb(struct lpfc_hba *phba, struct lpfc_sli_ring *pring, | |||
2408 | if (unlikely(pring->flag & LPFC_STOP_IOCB_MBX)) | 2426 | if (unlikely(pring->flag & LPFC_STOP_IOCB_MBX)) |
2409 | goto iocb_busy; | 2427 | goto iocb_busy; |
2410 | 2428 | ||
2411 | if (unlikely(phba->hba_state == LPFC_LINK_DOWN)) { | 2429 | if (unlikely(phba->link_state == LPFC_LINK_DOWN)) { |
2412 | /* | 2430 | /* |
2413 | * Only CREATE_XRI, CLOSE_XRI, and QUE_RING_BUF | 2431 | * Only CREATE_XRI, CLOSE_XRI, and QUE_RING_BUF |
2414 | * can be issued if the link is not up. | 2432 | * can be issued if the link is not up. |
@@ -2439,6 +2457,7 @@ lpfc_sli_issue_iocb(struct lpfc_hba *phba, struct lpfc_sli_ring *pring, | |||
2439 | !(phba->sli.sli_flag & LPFC_PROCESS_LA))) | 2457 | !(phba->sli.sli_flag & LPFC_PROCESS_LA))) |
2440 | goto iocb_busy; | 2458 | goto iocb_busy; |
2441 | 2459 | ||
2460 | spin_lock_irqsave(&phba->hbalock, iflags); | ||
2442 | while ((iocb = lpfc_sli_next_iocb_slot(phba, pring)) && | 2461 | while ((iocb = lpfc_sli_next_iocb_slot(phba, pring)) && |
2443 | (nextiocb = lpfc_sli_next_iocb(phba, pring, &piocb))) | 2462 | (nextiocb = lpfc_sli_next_iocb(phba, pring, &piocb))) |
2444 | lpfc_sli_submit_iocb(phba, pring, iocb, nextiocb); | 2463 | lpfc_sli_submit_iocb(phba, pring, iocb, nextiocb); |
@@ -2447,6 +2466,7 @@ lpfc_sli_issue_iocb(struct lpfc_hba *phba, struct lpfc_sli_ring *pring, | |||
2447 | lpfc_sli_update_ring(phba, pring); | 2466 | lpfc_sli_update_ring(phba, pring); |
2448 | else | 2467 | else |
2449 | lpfc_sli_update_full_ring(phba, pring); | 2468 | lpfc_sli_update_full_ring(phba, pring); |
2469 | spin_unlock_irqrestore(&phba->hbalock, iflags); | ||
2450 | 2470 | ||
2451 | if (!piocb) | 2471 | if (!piocb) |
2452 | return IOCB_SUCCESS; | 2472 | return IOCB_SUCCESS; |
@@ -2454,7 +2474,9 @@ lpfc_sli_issue_iocb(struct lpfc_hba *phba, struct lpfc_sli_ring *pring, | |||
2454 | goto out_busy; | 2474 | goto out_busy; |
2455 | 2475 | ||
2456 | iocb_busy: | 2476 | iocb_busy: |
2477 | spin_lock_irqsave(&phba->hbalock, iflags); | ||
2457 | pring->stats.iocb_cmd_delay++; | 2478 | pring->stats.iocb_cmd_delay++; |
2479 | spin_unlock_irqrestore(&phba->hbalock, iflags); | ||
2458 | 2480 | ||
2459 | out_busy: | 2481 | out_busy: |
2460 | 2482 | ||
@@ -2539,6 +2561,7 @@ lpfc_sli_setup(struct lpfc_hba *phba) | |||
2539 | /* numCiocb and numRiocb are used in config_port */ | 2561 | /* numCiocb and numRiocb are used in config_port */ |
2540 | pring->numCiocb = SLI2_IOCB_CMD_R1_ENTRIES; | 2562 | pring->numCiocb = SLI2_IOCB_CMD_R1_ENTRIES; |
2541 | pring->numRiocb = SLI2_IOCB_RSP_R1_ENTRIES; | 2563 | pring->numRiocb = SLI2_IOCB_RSP_R1_ENTRIES; |
2564 | pring->iotag_max = phba->cfg_hba_queue_depth; | ||
2542 | pring->num_mask = 0; | 2565 | pring->num_mask = 0; |
2543 | break; | 2566 | break; |
2544 | case LPFC_ELS_RING: /* ring 2 - ELS / CT */ | 2567 | case LPFC_ELS_RING: /* ring 2 - ELS / CT */ |
@@ -2591,14 +2614,14 @@ lpfc_sli_setup(struct lpfc_hba *phba) | |||
2591 | } | 2614 | } |
2592 | 2615 | ||
2593 | int | 2616 | int |
2594 | lpfc_sli_queue_setup(struct lpfc_hba * phba) | 2617 | lpfc_sli_queue_setup(struct lpfc_hba *phba) |
2595 | { | 2618 | { |
2596 | struct lpfc_sli *psli; | 2619 | struct lpfc_sli *psli; |
2597 | struct lpfc_sli_ring *pring; | 2620 | struct lpfc_sli_ring *pring; |
2598 | int i; | 2621 | int i; |
2599 | 2622 | ||
2600 | psli = &phba->sli; | 2623 | psli = &phba->sli; |
2601 | spin_lock_irq(phba->host->host_lock); | 2624 | spin_lock_irq(&phba->hbalock); |
2602 | INIT_LIST_HEAD(&psli->mboxq); | 2625 | INIT_LIST_HEAD(&psli->mboxq); |
2603 | /* Initialize list headers for txq and txcmplq as double linked lists */ | 2626 | /* Initialize list headers for txq and txcmplq as double linked lists */ |
2604 | for (i = 0; i < psli->num_rings; i++) { | 2627 | for (i = 0; i < psli->num_rings; i++) { |
@@ -2612,15 +2635,15 @@ lpfc_sli_queue_setup(struct lpfc_hba * phba) | |||
2612 | INIT_LIST_HEAD(&pring->iocb_continueq); | 2635 | INIT_LIST_HEAD(&pring->iocb_continueq); |
2613 | INIT_LIST_HEAD(&pring->postbufq); | 2636 | INIT_LIST_HEAD(&pring->postbufq); |
2614 | } | 2637 | } |
2615 | spin_unlock_irq(phba->host->host_lock); | 2638 | spin_unlock_irq(&phba->hbalock); |
2616 | return (1); | 2639 | return 1; |
2617 | } | 2640 | } |
2618 | 2641 | ||
2619 | int | 2642 | int |
2620 | lpfc_sli_hba_down(struct lpfc_hba * phba) | 2643 | lpfc_sli_hba_down(struct lpfc_hba *phba) |
2621 | { | 2644 | { |
2622 | LIST_HEAD(completions); | 2645 | LIST_HEAD(completions); |
2623 | struct lpfc_sli *psli; | 2646 | struct lpfc_sli *psli = &phba->sli; |
2624 | struct lpfc_sli_ring *pring; | 2647 | struct lpfc_sli_ring *pring; |
2625 | LPFC_MBOXQ_t *pmb; | 2648 | LPFC_MBOXQ_t *pmb; |
2626 | struct lpfc_iocbq *iocb; | 2649 | struct lpfc_iocbq *iocb; |
@@ -2628,10 +2651,9 @@ lpfc_sli_hba_down(struct lpfc_hba * phba) | |||
2628 | int i; | 2651 | int i; |
2629 | unsigned long flags = 0; | 2652 | unsigned long flags = 0; |
2630 | 2653 | ||
2631 | psli = &phba->sli; | ||
2632 | lpfc_hba_down_prep(phba); | 2654 | lpfc_hba_down_prep(phba); |
2633 | 2655 | ||
2634 | spin_lock_irqsave(phba->host->host_lock, flags); | 2656 | spin_lock_irqsave(&phba->hbalock, flags); |
2635 | for (i = 0; i < psli->num_rings; i++) { | 2657 | for (i = 0; i < psli->num_rings; i++) { |
2636 | pring = &psli->ring[i]; | 2658 | pring = &psli->ring[i]; |
2637 | pring->flag |= LPFC_DEFERRED_RING_EVENT; | 2659 | pring->flag |= LPFC_DEFERRED_RING_EVENT; |
@@ -2644,51 +2666,48 @@ lpfc_sli_hba_down(struct lpfc_hba * phba) | |||
2644 | pring->txq_cnt = 0; | 2666 | pring->txq_cnt = 0; |
2645 | 2667 | ||
2646 | } | 2668 | } |
2647 | spin_unlock_irqrestore(phba->host->host_lock, flags); | 2669 | spin_unlock_irqrestore(&phba->hbalock, flags); |
2648 | 2670 | ||
2649 | while (!list_empty(&completions)) { | 2671 | while (!list_empty(&completions)) { |
2650 | iocb = list_get_first(&completions, struct lpfc_iocbq, list); | 2672 | iocb = list_get_first(&completions, struct lpfc_iocbq, list); |
2651 | cmd = &iocb->iocb; | 2673 | cmd = &iocb->iocb; |
2652 | list_del(&iocb->list); | 2674 | list_del(&iocb->list); |
2653 | 2675 | ||
2654 | if (iocb->iocb_cmpl) { | 2676 | if (!iocb->iocb_cmpl) |
2677 | lpfc_sli_release_iocbq(phba, iocb); | ||
2678 | else { | ||
2655 | cmd->ulpStatus = IOSTAT_LOCAL_REJECT; | 2679 | cmd->ulpStatus = IOSTAT_LOCAL_REJECT; |
2656 | cmd->un.ulpWord[4] = IOERR_SLI_DOWN; | 2680 | cmd->un.ulpWord[4] = IOERR_SLI_DOWN; |
2657 | (iocb->iocb_cmpl) (phba, iocb, iocb); | 2681 | (iocb->iocb_cmpl) (phba, iocb, iocb); |
2658 | } else | 2682 | } |
2659 | lpfc_sli_release_iocbq(phba, iocb); | ||
2660 | } | 2683 | } |
2661 | 2684 | ||
2662 | /* Return any active mbox cmds */ | 2685 | /* Return any active mbox cmds */ |
2663 | del_timer_sync(&psli->mbox_tmo); | 2686 | del_timer_sync(&psli->mbox_tmo); |
2664 | spin_lock_irqsave(phba->host->host_lock, flags); | 2687 | |
2665 | phba->work_hba_events &= ~WORKER_MBOX_TMO; | 2688 | spin_lock_irqsave(&phba->pport->work_port_lock, flags); |
2666 | if (psli->mbox_active) { | 2689 | phba->pport->work_port_events &= ~WORKER_MBOX_TMO; |
2667 | pmb = psli->mbox_active; | 2690 | spin_unlock_irqrestore(&phba->pport->work_port_lock, flags); |
2691 | |||
2692 | pmb = psli->mbox_active; | ||
2693 | if (pmb) { | ||
2694 | psli->mbox_active = NULL; | ||
2668 | pmb->mb.mbxStatus = MBX_NOT_FINISHED; | 2695 | pmb->mb.mbxStatus = MBX_NOT_FINISHED; |
2696 | psli->sli_flag &= ~LPFC_SLI_MBOX_ACTIVE; | ||
2669 | if (pmb->mbox_cmpl) { | 2697 | if (pmb->mbox_cmpl) { |
2670 | spin_unlock_irqrestore(phba->host->host_lock, flags); | ||
2671 | pmb->mbox_cmpl(phba,pmb); | 2698 | pmb->mbox_cmpl(phba,pmb); |
2672 | spin_lock_irqsave(phba->host->host_lock, flags); | ||
2673 | } | 2699 | } |
2674 | } | 2700 | } |
2675 | psli->sli_flag &= ~LPFC_SLI_MBOX_ACTIVE; | ||
2676 | psli->mbox_active = NULL; | ||
2677 | 2701 | ||
2678 | /* Return any pending mbox cmds */ | 2702 | /* Return any pending mbox cmds */ |
2679 | while ((pmb = lpfc_mbox_get(phba)) != NULL) { | 2703 | while ((pmb = lpfc_mbox_get(phba)) != NULL) { |
2680 | pmb->mb.mbxStatus = MBX_NOT_FINISHED; | 2704 | pmb->mb.mbxStatus = MBX_NOT_FINISHED; |
2681 | if (pmb->mbox_cmpl) { | 2705 | if (pmb->mbox_cmpl) { |
2682 | spin_unlock_irqrestore(phba->host->host_lock, flags); | ||
2683 | pmb->mbox_cmpl(phba,pmb); | 2706 | pmb->mbox_cmpl(phba,pmb); |
2684 | spin_lock_irqsave(phba->host->host_lock, flags); | ||
2685 | } | 2707 | } |
2686 | } | 2708 | } |
2687 | |||
2688 | INIT_LIST_HEAD(&psli->mboxq); | 2709 | INIT_LIST_HEAD(&psli->mboxq); |
2689 | 2710 | ||
2690 | spin_unlock_irqrestore(phba->host->host_lock, flags); | ||
2691 | |||
2692 | return 1; | 2711 | return 1; |
2693 | } | 2712 | } |
2694 | 2713 | ||
@@ -2710,14 +2729,15 @@ lpfc_sli_pcimem_bcopy(void *srcp, void *destp, uint32_t cnt) | |||
2710 | } | 2729 | } |
2711 | 2730 | ||
2712 | int | 2731 | int |
2713 | lpfc_sli_ringpostbuf_put(struct lpfc_hba * phba, struct lpfc_sli_ring * pring, | 2732 | lpfc_sli_ringpostbuf_put(struct lpfc_hba *phba, struct lpfc_sli_ring *pring, |
2714 | struct lpfc_dmabuf * mp) | 2733 | struct lpfc_dmabuf *mp) |
2715 | { | 2734 | { |
2716 | /* Stick struct lpfc_dmabuf at end of postbufq so driver can look it up | 2735 | /* Stick struct lpfc_dmabuf at end of postbufq so driver can look it up |
2717 | later */ | 2736 | later */ |
2737 | spin_lock_irq(&phba->hbalock); | ||
2718 | list_add_tail(&mp->list, &pring->postbufq); | 2738 | list_add_tail(&mp->list, &pring->postbufq); |
2719 | |||
2720 | pring->postbufq_cnt++; | 2739 | pring->postbufq_cnt++; |
2740 | spin_unlock_irq(&phba->hbalock); | ||
2721 | return 0; | 2741 | return 0; |
2722 | } | 2742 | } |
2723 | 2743 | ||
@@ -2730,40 +2750,41 @@ lpfc_sli_ringpostbuf_get(struct lpfc_hba *phba, struct lpfc_sli_ring *pring, | |||
2730 | struct list_head *slp = &pring->postbufq; | 2750 | struct list_head *slp = &pring->postbufq; |
2731 | 2751 | ||
2732 | /* Search postbufq, from the begining, looking for a match on phys */ | 2752 | /* Search postbufq, from the begining, looking for a match on phys */ |
2753 | spin_lock_irq(&phba->hbalock); | ||
2733 | list_for_each_entry_safe(mp, next_mp, &pring->postbufq, list) { | 2754 | list_for_each_entry_safe(mp, next_mp, &pring->postbufq, list) { |
2734 | if (mp->phys == phys) { | 2755 | if (mp->phys == phys) { |
2735 | list_del_init(&mp->list); | 2756 | list_del_init(&mp->list); |
2736 | pring->postbufq_cnt--; | 2757 | pring->postbufq_cnt--; |
2758 | spin_unlock_irq(&phba->hbalock); | ||
2737 | return mp; | 2759 | return mp; |
2738 | } | 2760 | } |
2739 | } | 2761 | } |
2740 | 2762 | ||
2763 | spin_unlock_irq(&phba->hbalock); | ||
2741 | lpfc_printf_log(phba, KERN_ERR, LOG_INIT, | 2764 | lpfc_printf_log(phba, KERN_ERR, LOG_INIT, |
2742 | "%d:0410 Cannot find virtual addr for mapped buf on " | 2765 | "%d:0410 Cannot find virtual addr for mapped buf on " |
2743 | "ring %d Data x%llx x%p x%p x%x\n", | 2766 | "ring %d Data x%llx x%p x%p x%x\n", |
2744 | phba->brd_no, pring->ringno, (unsigned long long)phys, | 2767 | phba->brd_no, pring->ringno, (unsigned long long) phys, |
2745 | slp->next, slp->prev, pring->postbufq_cnt); | 2768 | slp->next, slp->prev, pring->postbufq_cnt); |
2746 | return NULL; | 2769 | return NULL; |
2747 | } | 2770 | } |
2748 | 2771 | ||
2749 | static void | 2772 | static void |
2750 | lpfc_sli_abort_els_cmpl(struct lpfc_hba * phba, struct lpfc_iocbq * cmdiocb, | 2773 | lpfc_sli_abort_els_cmpl(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb, |
2751 | struct lpfc_iocbq * rspiocb) | 2774 | struct lpfc_iocbq *rspiocb) |
2752 | { | 2775 | { |
2753 | IOCB_t *irsp; | 2776 | IOCB_t *irsp = &rspiocb->iocb; |
2754 | uint16_t abort_iotag, abort_context; | 2777 | uint16_t abort_iotag, abort_context; |
2755 | struct lpfc_iocbq *abort_iocb, *rsp_ab_iocb; | 2778 | struct lpfc_iocbq *abort_iocb, *rsp_ab_iocb; |
2756 | struct lpfc_sli_ring *pring = &phba->sli.ring[LPFC_ELS_RING]; | 2779 | struct lpfc_sli_ring *pring = &phba->sli.ring[LPFC_ELS_RING]; |
2757 | 2780 | ||
2758 | abort_iocb = NULL; | 2781 | abort_iocb = NULL; |
2759 | irsp = &rspiocb->iocb; | ||
2760 | |||
2761 | spin_lock_irq(phba->host->host_lock); | ||
2762 | 2782 | ||
2763 | if (irsp->ulpStatus) { | 2783 | if (irsp->ulpStatus) { |
2764 | abort_context = cmdiocb->iocb.un.acxri.abortContextTag; | 2784 | abort_context = cmdiocb->iocb.un.acxri.abortContextTag; |
2765 | abort_iotag = cmdiocb->iocb.un.acxri.abortIoTag; | 2785 | abort_iotag = cmdiocb->iocb.un.acxri.abortIoTag; |
2766 | 2786 | ||
2787 | spin_lock_irq(&phba->hbalock); | ||
2767 | if (abort_iotag != 0 && abort_iotag <= phba->sli.last_iotag) | 2788 | if (abort_iotag != 0 && abort_iotag <= phba->sli.last_iotag) |
2768 | abort_iocb = phba->sli.iocbq_lookup[abort_iotag]; | 2789 | abort_iocb = phba->sli.iocbq_lookup[abort_iotag]; |
2769 | 2790 | ||
@@ -2777,41 +2798,40 @@ lpfc_sli_abort_els_cmpl(struct lpfc_hba * phba, struct lpfc_iocbq * cmdiocb, | |||
2777 | * make sure we have the right iocbq before taking it | 2798 | * make sure we have the right iocbq before taking it |
2778 | * off the txcmplq and try to call completion routine. | 2799 | * off the txcmplq and try to call completion routine. |
2779 | */ | 2800 | */ |
2780 | if (abort_iocb && | 2801 | if (!abort_iocb || |
2781 | abort_iocb->iocb.ulpContext == abort_context && | 2802 | abort_iocb->iocb.ulpContext != abort_context || |
2782 | abort_iocb->iocb_flag & LPFC_DRIVER_ABORTED) { | 2803 | (abort_iocb->iocb_flag & LPFC_DRIVER_ABORTED) == 0) |
2804 | spin_unlock_irq(&phba->hbalock); | ||
2805 | else { | ||
2783 | list_del(&abort_iocb->list); | 2806 | list_del(&abort_iocb->list); |
2784 | pring->txcmplq_cnt--; | 2807 | pring->txcmplq_cnt--; |
2808 | spin_unlock_irq(&phba->hbalock); | ||
2785 | 2809 | ||
2786 | rsp_ab_iocb = lpfc_sli_get_iocbq(phba); | 2810 | rsp_ab_iocb = lpfc_sli_get_iocbq(phba); |
2787 | if (rsp_ab_iocb == NULL) | 2811 | if (rsp_ab_iocb == NULL) |
2788 | lpfc_sli_release_iocbq(phba, abort_iocb); | 2812 | lpfc_sli_release_iocbq(phba, abort_iocb); |
2789 | else { | 2813 | else { |
2790 | abort_iocb->iocb_flag &= | 2814 | abort_iocb->iocb_flag &= ~LPFC_DRIVER_ABORTED; |
2791 | ~LPFC_DRIVER_ABORTED; | ||
2792 | rsp_ab_iocb->iocb.ulpStatus = | 2815 | rsp_ab_iocb->iocb.ulpStatus = |
2793 | IOSTAT_LOCAL_REJECT; | 2816 | IOSTAT_LOCAL_REJECT; |
2794 | rsp_ab_iocb->iocb.un.ulpWord[4] = | 2817 | rsp_ab_iocb->iocb.un.ulpWord[4] = |
2795 | IOERR_SLI_ABORTED; | 2818 | IOERR_SLI_ABORTED; |
2796 | spin_unlock_irq(phba->host->host_lock); | 2819 | (abort_iocb->iocb_cmpl)(phba, abort_iocb, |
2797 | (abort_iocb->iocb_cmpl) | 2820 | rsp_ab_iocb); |
2798 | (phba, abort_iocb, rsp_ab_iocb); | ||
2799 | spin_lock_irq(phba->host->host_lock); | ||
2800 | lpfc_sli_release_iocbq(phba, rsp_ab_iocb); | 2821 | lpfc_sli_release_iocbq(phba, rsp_ab_iocb); |
2801 | } | 2822 | } |
2802 | } | 2823 | } |
2803 | } | 2824 | } |
2804 | 2825 | ||
2805 | lpfc_sli_release_iocbq(phba, cmdiocb); | 2826 | lpfc_sli_release_iocbq(phba, cmdiocb); |
2806 | spin_unlock_irq(phba->host->host_lock); | ||
2807 | return; | 2827 | return; |
2808 | } | 2828 | } |
2809 | 2829 | ||
2810 | int | 2830 | int |
2811 | lpfc_sli_issue_abort_iotag(struct lpfc_hba * phba, | 2831 | lpfc_sli_issue_abort_iotag(struct lpfc_hba *phba, struct lpfc_sli_ring *pring, |
2812 | struct lpfc_sli_ring * pring, | 2832 | struct lpfc_iocbq *cmdiocb) |
2813 | struct lpfc_iocbq * cmdiocb) | ||
2814 | { | 2833 | { |
2834 | struct lpfc_vport *vport = cmdiocb->vport; | ||
2815 | struct lpfc_iocbq *abtsiocbp; | 2835 | struct lpfc_iocbq *abtsiocbp; |
2816 | IOCB_t *icmd = NULL; | 2836 | IOCB_t *icmd = NULL; |
2817 | IOCB_t *iabt = NULL; | 2837 | IOCB_t *iabt = NULL; |
@@ -2821,14 +2841,14 @@ lpfc_sli_issue_abort_iotag(struct lpfc_hba * phba, | |||
2821 | * to abort. | 2841 | * to abort. |
2822 | */ | 2842 | */ |
2823 | icmd = &cmdiocb->iocb; | 2843 | icmd = &cmdiocb->iocb; |
2824 | if ((icmd->ulpCommand == CMD_ABORT_XRI_CN) || | 2844 | if (icmd->ulpCommand == CMD_ABORT_XRI_CN || |
2825 | (icmd->ulpCommand == CMD_CLOSE_XRI_CN)) | 2845 | icmd->ulpCommand == CMD_CLOSE_XRI_CN) |
2826 | return 0; | 2846 | return 0; |
2827 | 2847 | ||
2828 | /* If we're unloading, interrupts are disabled so we | 2848 | /* If we're unloading, interrupts are disabled so we |
2829 | * need to cleanup the iocb here. | 2849 | * need to cleanup the iocb here. |
2830 | */ | 2850 | */ |
2831 | if (phba->fc_flag & FC_UNLOADING) | 2851 | if (vport->load_flag & FC_UNLOADING) |
2832 | goto abort_iotag_exit; | 2852 | goto abort_iotag_exit; |
2833 | 2853 | ||
2834 | /* issue ABTS for this IOCB based on iotag */ | 2854 | /* issue ABTS for this IOCB based on iotag */ |
@@ -2848,7 +2868,7 @@ lpfc_sli_issue_abort_iotag(struct lpfc_hba * phba, | |||
2848 | iabt->ulpLe = 1; | 2868 | iabt->ulpLe = 1; |
2849 | iabt->ulpClass = icmd->ulpClass; | 2869 | iabt->ulpClass = icmd->ulpClass; |
2850 | 2870 | ||
2851 | if (phba->hba_state >= LPFC_LINK_UP) | 2871 | if (phba->link_state >= LPFC_LINK_UP) |
2852 | iabt->ulpCommand = CMD_ABORT_XRI_CN; | 2872 | iabt->ulpCommand = CMD_ABORT_XRI_CN; |
2853 | else | 2873 | else |
2854 | iabt->ulpCommand = CMD_CLOSE_XRI_CN; | 2874 | iabt->ulpCommand = CMD_CLOSE_XRI_CN; |
@@ -2863,25 +2883,12 @@ lpfc_sli_issue_abort_iotag(struct lpfc_hba * phba, | |||
2863 | retval = lpfc_sli_issue_iocb(phba, pring, abtsiocbp, 0); | 2883 | retval = lpfc_sli_issue_iocb(phba, pring, abtsiocbp, 0); |
2864 | 2884 | ||
2865 | abort_iotag_exit: | 2885 | abort_iotag_exit: |
2866 | 2886 | /* | |
2867 | /* If we could not issue an abort dequeue the iocb and handle | 2887 | * Caller to this routine should check for IOCB_ERROR |
2868 | * the completion here. | 2888 | * and handle it properly. This routine no longer removes |
2889 | * iocb off txcmplq and call compl in case of IOCB_ERROR. | ||
2869 | */ | 2890 | */ |
2870 | if (retval == IOCB_ERROR) { | 2891 | return retval; |
2871 | list_del(&cmdiocb->list); | ||
2872 | pring->txcmplq_cnt--; | ||
2873 | |||
2874 | if (cmdiocb->iocb_cmpl) { | ||
2875 | icmd->ulpStatus = IOSTAT_LOCAL_REJECT; | ||
2876 | icmd->un.ulpWord[4] = IOERR_SLI_ABORTED; | ||
2877 | spin_unlock_irq(phba->host->host_lock); | ||
2878 | (cmdiocb->iocb_cmpl) (phba, cmdiocb, cmdiocb); | ||
2879 | spin_lock_irq(phba->host->host_lock); | ||
2880 | } else | ||
2881 | lpfc_sli_release_iocbq(phba, cmdiocb); | ||
2882 | } | ||
2883 | |||
2884 | return 1; | ||
2885 | } | 2892 | } |
2886 | 2893 | ||
2887 | static int | 2894 | static int |
@@ -2930,7 +2937,7 @@ lpfc_sli_validate_fcp_iocb(struct lpfc_iocbq *iocbq, uint16_t tgt_id, | |||
2930 | 2937 | ||
2931 | int | 2938 | int |
2932 | lpfc_sli_sum_iocb(struct lpfc_hba *phba, struct lpfc_sli_ring *pring, | 2939 | lpfc_sli_sum_iocb(struct lpfc_hba *phba, struct lpfc_sli_ring *pring, |
2933 | uint16_t tgt_id, uint64_t lun_id, lpfc_ctx_cmd ctx_cmd) | 2940 | uint16_t tgt_id, uint64_t lun_id, lpfc_ctx_cmd ctx_cmd) |
2934 | { | 2941 | { |
2935 | struct lpfc_iocbq *iocbq; | 2942 | struct lpfc_iocbq *iocbq; |
2936 | int sum, i; | 2943 | int sum, i; |
@@ -2947,14 +2954,10 @@ lpfc_sli_sum_iocb(struct lpfc_hba *phba, struct lpfc_sli_ring *pring, | |||
2947 | } | 2954 | } |
2948 | 2955 | ||
2949 | void | 2956 | void |
2950 | lpfc_sli_abort_fcp_cmpl(struct lpfc_hba * phba, struct lpfc_iocbq * cmdiocb, | 2957 | lpfc_sli_abort_fcp_cmpl(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb, |
2951 | struct lpfc_iocbq * rspiocb) | 2958 | struct lpfc_iocbq *rspiocb) |
2952 | { | 2959 | { |
2953 | unsigned long iflags; | ||
2954 | |||
2955 | spin_lock_irqsave(phba->host->host_lock, iflags); | ||
2956 | lpfc_sli_release_iocbq(phba, cmdiocb); | 2960 | lpfc_sli_release_iocbq(phba, cmdiocb); |
2957 | spin_unlock_irqrestore(phba->host->host_lock, iflags); | ||
2958 | return; | 2961 | return; |
2959 | } | 2962 | } |
2960 | 2963 | ||
@@ -2972,8 +2975,8 @@ lpfc_sli_abort_iocb(struct lpfc_hba *phba, struct lpfc_sli_ring *pring, | |||
2972 | for (i = 1; i <= phba->sli.last_iotag; i++) { | 2975 | for (i = 1; i <= phba->sli.last_iotag; i++) { |
2973 | iocbq = phba->sli.iocbq_lookup[i]; | 2976 | iocbq = phba->sli.iocbq_lookup[i]; |
2974 | 2977 | ||
2975 | if (lpfc_sli_validate_fcp_iocb (iocbq, tgt_id, lun_id, | 2978 | if (lpfc_sli_validate_fcp_iocb(iocbq, tgt_id, lun_id, 0, |
2976 | 0, abort_cmd) != 0) | 2979 | abort_cmd) != 0) |
2977 | continue; | 2980 | continue; |
2978 | 2981 | ||
2979 | /* issue ABTS for this IOCB based on iotag */ | 2982 | /* issue ABTS for this IOCB based on iotag */ |
@@ -2989,8 +2992,9 @@ lpfc_sli_abort_iocb(struct lpfc_hba *phba, struct lpfc_sli_ring *pring, | |||
2989 | abtsiocb->iocb.un.acxri.abortIoTag = cmd->ulpIoTag; | 2992 | abtsiocb->iocb.un.acxri.abortIoTag = cmd->ulpIoTag; |
2990 | abtsiocb->iocb.ulpLe = 1; | 2993 | abtsiocb->iocb.ulpLe = 1; |
2991 | abtsiocb->iocb.ulpClass = cmd->ulpClass; | 2994 | abtsiocb->iocb.ulpClass = cmd->ulpClass; |
2995 | abtsiocb->vport = phba->pport; | ||
2992 | 2996 | ||
2993 | if (phba->hba_state >= LPFC_LINK_UP) | 2997 | if (lpfc_is_link_up(phba)) |
2994 | abtsiocb->iocb.ulpCommand = CMD_ABORT_XRI_CN; | 2998 | abtsiocb->iocb.ulpCommand = CMD_ABORT_XRI_CN; |
2995 | else | 2999 | else |
2996 | abtsiocb->iocb.ulpCommand = CMD_CLOSE_XRI_CN; | 3000 | abtsiocb->iocb.ulpCommand = CMD_CLOSE_XRI_CN; |
@@ -3016,14 +3020,14 @@ lpfc_sli_wake_iocb_wait(struct lpfc_hba *phba, | |||
3016 | wait_queue_head_t *pdone_q; | 3020 | wait_queue_head_t *pdone_q; |
3017 | unsigned long iflags; | 3021 | unsigned long iflags; |
3018 | 3022 | ||
3019 | spin_lock_irqsave(phba->host->host_lock, iflags); | 3023 | spin_lock_irqsave(&phba->hbalock, iflags); |
3020 | cmdiocbq->iocb_flag |= LPFC_IO_WAKE; | 3024 | cmdiocbq->iocb_flag |= LPFC_IO_WAKE; |
3021 | if (cmdiocbq->context2 && rspiocbq) | 3025 | if (cmdiocbq->context2 && rspiocbq) |
3022 | memcpy(&((struct lpfc_iocbq *)cmdiocbq->context2)->iocb, | 3026 | memcpy(&((struct lpfc_iocbq *)cmdiocbq->context2)->iocb, |
3023 | &rspiocbq->iocb, sizeof(IOCB_t)); | 3027 | &rspiocbq->iocb, sizeof(IOCB_t)); |
3024 | 3028 | ||
3025 | pdone_q = cmdiocbq->context_un.wait_queue; | 3029 | pdone_q = cmdiocbq->context_un.wait_queue; |
3026 | spin_unlock_irqrestore(phba->host->host_lock, iflags); | 3030 | spin_unlock_irqrestore(&phba->hbalock, iflags); |
3027 | if (pdone_q) | 3031 | if (pdone_q) |
3028 | wake_up(pdone_q); | 3032 | wake_up(pdone_q); |
3029 | return; | 3033 | return; |
@@ -3036,10 +3040,10 @@ lpfc_sli_wake_iocb_wait(struct lpfc_hba *phba, | |||
3036 | * definition this is a wait function. | 3040 | * definition this is a wait function. |
3037 | */ | 3041 | */ |
3038 | int | 3042 | int |
3039 | lpfc_sli_issue_iocb_wait(struct lpfc_hba * phba, | 3043 | lpfc_sli_issue_iocb_wait(struct lpfc_hba *phba, |
3040 | struct lpfc_sli_ring * pring, | 3044 | struct lpfc_sli_ring *pring, |
3041 | struct lpfc_iocbq * piocb, | 3045 | struct lpfc_iocbq *piocb, |
3042 | struct lpfc_iocbq * prspiocbq, | 3046 | struct lpfc_iocbq *prspiocbq, |
3043 | uint32_t timeout) | 3047 | uint32_t timeout) |
3044 | { | 3048 | { |
3045 | DECLARE_WAIT_QUEUE_HEAD_ONSTACK(done_q); | 3049 | DECLARE_WAIT_QUEUE_HEAD_ONSTACK(done_q); |
@@ -3071,11 +3075,11 @@ lpfc_sli_issue_iocb_wait(struct lpfc_hba * phba, | |||
3071 | retval = lpfc_sli_issue_iocb(phba, pring, piocb, 0); | 3075 | retval = lpfc_sli_issue_iocb(phba, pring, piocb, 0); |
3072 | if (retval == IOCB_SUCCESS) { | 3076 | if (retval == IOCB_SUCCESS) { |
3073 | timeout_req = timeout * HZ; | 3077 | timeout_req = timeout * HZ; |
3074 | spin_unlock_irq(phba->host->host_lock); | 3078 | spin_unlock_irq(&phba->hbalock); |
3075 | timeleft = wait_event_timeout(done_q, | 3079 | timeleft = wait_event_timeout(done_q, |
3076 | piocb->iocb_flag & LPFC_IO_WAKE, | 3080 | piocb->iocb_flag & LPFC_IO_WAKE, |
3077 | timeout_req); | 3081 | timeout_req); |
3078 | spin_lock_irq(phba->host->host_lock); | 3082 | spin_lock_irq(&phba->hbalock); |
3079 | 3083 | ||
3080 | if (piocb->iocb_flag & LPFC_IO_WAKE) { | 3084 | if (piocb->iocb_flag & LPFC_IO_WAKE) { |
3081 | lpfc_printf_log(phba, KERN_INFO, LOG_SLI, | 3085 | lpfc_printf_log(phba, KERN_INFO, LOG_SLI, |
@@ -3117,7 +3121,7 @@ lpfc_sli_issue_iocb_wait(struct lpfc_hba * phba, | |||
3117 | } | 3121 | } |
3118 | 3122 | ||
3119 | int | 3123 | int |
3120 | lpfc_sli_issue_mbox_wait(struct lpfc_hba * phba, LPFC_MBOXQ_t * pmboxq, | 3124 | lpfc_sli_issue_mbox_wait(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmboxq, |
3121 | uint32_t timeout) | 3125 | uint32_t timeout) |
3122 | { | 3126 | { |
3123 | DECLARE_WAIT_QUEUE_HEAD_ONSTACK(done_q); | 3127 | DECLARE_WAIT_QUEUE_HEAD_ONSTACK(done_q); |
@@ -3125,7 +3129,7 @@ lpfc_sli_issue_mbox_wait(struct lpfc_hba * phba, LPFC_MBOXQ_t * pmboxq, | |||
3125 | 3129 | ||
3126 | /* The caller must leave context1 empty. */ | 3130 | /* The caller must leave context1 empty. */ |
3127 | if (pmboxq->context1 != 0) { | 3131 | if (pmboxq->context1 != 0) { |
3128 | return (MBX_NOT_FINISHED); | 3132 | return MBX_NOT_FINISHED; |
3129 | } | 3133 | } |
3130 | 3134 | ||
3131 | /* setup wake call as IOCB callback */ | 3135 | /* setup wake call as IOCB callback */ |
@@ -3158,9 +3162,10 @@ lpfc_sli_issue_mbox_wait(struct lpfc_hba * phba, LPFC_MBOXQ_t * pmboxq, | |||
3158 | int | 3162 | int |
3159 | lpfc_sli_flush_mbox_queue(struct lpfc_hba * phba) | 3163 | lpfc_sli_flush_mbox_queue(struct lpfc_hba * phba) |
3160 | { | 3164 | { |
3165 | struct lpfc_vport *vport = phba->pport; | ||
3161 | int i = 0; | 3166 | int i = 0; |
3162 | 3167 | ||
3163 | while (phba->sli.sli_flag & LPFC_SLI_MBOX_ACTIVE && !phba->stopped) { | 3168 | while (phba->sli.sli_flag & LPFC_SLI_MBOX_ACTIVE && !vport->stopped) { |
3164 | if (i++ > LPFC_MBOX_TMO * 1000) | 3169 | if (i++ > LPFC_MBOX_TMO * 1000) |
3165 | return 1; | 3170 | return 1; |
3166 | 3171 | ||
@@ -3176,7 +3181,7 @@ lpfc_sli_flush_mbox_queue(struct lpfc_hba * phba) | |||
3176 | irqreturn_t | 3181 | irqreturn_t |
3177 | lpfc_intr_handler(int irq, void *dev_id) | 3182 | lpfc_intr_handler(int irq, void *dev_id) |
3178 | { | 3183 | { |
3179 | struct lpfc_hba *phba; | 3184 | struct lpfc_hba *phba; |
3180 | uint32_t ha_copy; | 3185 | uint32_t ha_copy; |
3181 | uint32_t work_ha_copy; | 3186 | uint32_t work_ha_copy; |
3182 | unsigned long status; | 3187 | unsigned long status; |
@@ -3204,7 +3209,7 @@ lpfc_intr_handler(int irq, void *dev_id) | |||
3204 | */ | 3209 | */ |
3205 | 3210 | ||
3206 | /* Ignore all interrupts during initialization. */ | 3211 | /* Ignore all interrupts during initialization. */ |
3207 | if (unlikely(phba->hba_state < LPFC_LINK_DOWN)) | 3212 | if (unlikely(phba->link_state < LPFC_LINK_DOWN)) |
3208 | return IRQ_NONE; | 3213 | return IRQ_NONE; |
3209 | 3214 | ||
3210 | /* | 3215 | /* |
@@ -3212,16 +3217,16 @@ lpfc_intr_handler(int irq, void *dev_id) | |||
3212 | * Clear Attention Sources, except Error Attention (to | 3217 | * Clear Attention Sources, except Error Attention (to |
3213 | * preserve status) and Link Attention | 3218 | * preserve status) and Link Attention |
3214 | */ | 3219 | */ |
3215 | spin_lock(phba->host->host_lock); | 3220 | spin_lock(&phba->hbalock); |
3216 | ha_copy = readl(phba->HAregaddr); | 3221 | ha_copy = readl(phba->HAregaddr); |
3217 | /* If somebody is waiting to handle an eratt don't process it | 3222 | /* If somebody is waiting to handle an eratt don't process it |
3218 | * here. The brdkill function will do this. | 3223 | * here. The brdkill function will do this. |
3219 | */ | 3224 | */ |
3220 | if (phba->fc_flag & FC_IGNORE_ERATT) | 3225 | if (phba->link_flag & LS_IGNORE_ERATT) |
3221 | ha_copy &= ~HA_ERATT; | 3226 | ha_copy &= ~HA_ERATT; |
3222 | writel((ha_copy & ~(HA_LATT | HA_ERATT)), phba->HAregaddr); | 3227 | writel((ha_copy & ~(HA_LATT | HA_ERATT)), phba->HAregaddr); |
3223 | readl(phba->HAregaddr); /* flush */ | 3228 | readl(phba->HAregaddr); /* flush */ |
3224 | spin_unlock(phba->host->host_lock); | 3229 | spin_unlock(&phba->hbalock); |
3225 | 3230 | ||
3226 | if (unlikely(!ha_copy)) | 3231 | if (unlikely(!ha_copy)) |
3227 | return IRQ_NONE; | 3232 | return IRQ_NONE; |
@@ -3235,13 +3240,13 @@ lpfc_intr_handler(int irq, void *dev_id) | |||
3235 | * Turn off Link Attention interrupts | 3240 | * Turn off Link Attention interrupts |
3236 | * until CLEAR_LA done | 3241 | * until CLEAR_LA done |
3237 | */ | 3242 | */ |
3238 | spin_lock(phba->host->host_lock); | 3243 | spin_lock(&phba->hbalock); |
3239 | phba->sli.sli_flag &= ~LPFC_PROCESS_LA; | 3244 | phba->sli.sli_flag &= ~LPFC_PROCESS_LA; |
3240 | control = readl(phba->HCregaddr); | 3245 | control = readl(phba->HCregaddr); |
3241 | control &= ~HC_LAINT_ENA; | 3246 | control &= ~HC_LAINT_ENA; |
3242 | writel(control, phba->HCregaddr); | 3247 | writel(control, phba->HCregaddr); |
3243 | readl(phba->HCregaddr); /* flush */ | 3248 | readl(phba->HCregaddr); /* flush */ |
3244 | spin_unlock(phba->host->host_lock); | 3249 | spin_unlock(&phba->hbalock); |
3245 | } | 3250 | } |
3246 | else | 3251 | else |
3247 | work_ha_copy &= ~HA_LATT; | 3252 | work_ha_copy &= ~HA_LATT; |
@@ -3253,18 +3258,18 @@ lpfc_intr_handler(int irq, void *dev_id) | |||
3253 | /* | 3258 | /* |
3254 | * Turn off Slow Rings interrupts | 3259 | * Turn off Slow Rings interrupts |
3255 | */ | 3260 | */ |
3256 | spin_lock(phba->host->host_lock); | 3261 | spin_lock(&phba->hbalock); |
3257 | control = readl(phba->HCregaddr); | 3262 | control = readl(phba->HCregaddr); |
3258 | control &= ~(HC_R0INT_ENA << i); | 3263 | control &= ~(HC_R0INT_ENA << i); |
3259 | writel(control, phba->HCregaddr); | 3264 | writel(control, phba->HCregaddr); |
3260 | readl(phba->HCregaddr); /* flush */ | 3265 | readl(phba->HCregaddr); /* flush */ |
3261 | spin_unlock(phba->host->host_lock); | 3266 | spin_unlock(&phba->hbalock); |
3262 | } | 3267 | } |
3263 | } | 3268 | } |
3264 | } | 3269 | } |
3265 | 3270 | ||
3266 | if (work_ha_copy & HA_ERATT) { | 3271 | if (work_ha_copy & HA_ERATT) { |
3267 | phba->hba_state = LPFC_HBA_ERROR; | 3272 | phba->link_state = LPFC_HBA_ERROR; |
3268 | /* | 3273 | /* |
3269 | * There was a link/board error. Read the | 3274 | * There was a link/board error. Read the |
3270 | * status register to retrieve the error event | 3275 | * status register to retrieve the error event |
@@ -3279,14 +3284,14 @@ lpfc_intr_handler(int irq, void *dev_id) | |||
3279 | /* Clear Chip error bit */ | 3284 | /* Clear Chip error bit */ |
3280 | writel(HA_ERATT, phba->HAregaddr); | 3285 | writel(HA_ERATT, phba->HAregaddr); |
3281 | readl(phba->HAregaddr); /* flush */ | 3286 | readl(phba->HAregaddr); /* flush */ |
3282 | phba->stopped = 1; | 3287 | phba->pport->stopped = 1; |
3283 | } | 3288 | } |
3284 | 3289 | ||
3285 | spin_lock(phba->host->host_lock); | 3290 | spin_lock(&phba->hbalock); |
3286 | phba->work_ha |= work_ha_copy; | 3291 | phba->work_ha |= work_ha_copy; |
3287 | if (phba->work_wait) | 3292 | if (phba->work_wait) |
3288 | wake_up(phba->work_wait); | 3293 | wake_up(phba->work_wait); |
3289 | spin_unlock(phba->host->host_lock); | 3294 | spin_unlock(&phba->hbalock); |
3290 | } | 3295 | } |
3291 | 3296 | ||
3292 | ha_copy &= ~(phba->work_ha_mask); | 3297 | ha_copy &= ~(phba->work_ha_mask); |