diff options
Diffstat (limited to 'drivers/scsi/bfa/bfa_core.c')
-rw-r--r-- | drivers/scsi/bfa/bfa_core.c | 799 |
1 files changed, 224 insertions, 575 deletions
diff --git a/drivers/scsi/bfa/bfa_core.c b/drivers/scsi/bfa/bfa_core.c index 342d7d9c099..4bd546bcc24 100644 --- a/drivers/scsi/bfa/bfa_core.c +++ b/drivers/scsi/bfa/bfa_core.c | |||
@@ -165,16 +165,6 @@ bfa_com_phy_attach(struct bfa_s *bfa, bfa_boolean_t mincfg) | |||
165 | bfa_phy_memclaim(phy, phy_dma->kva_curp, phy_dma->dma_curp, mincfg); | 165 | bfa_phy_memclaim(phy, phy_dma->kva_curp, phy_dma->dma_curp, mincfg); |
166 | } | 166 | } |
167 | 167 | ||
168 | static void | ||
169 | bfa_com_fru_attach(struct bfa_s *bfa, bfa_boolean_t mincfg) | ||
170 | { | ||
171 | struct bfa_fru_s *fru = BFA_FRU(bfa); | ||
172 | struct bfa_mem_dma_s *fru_dma = BFA_MEM_FRU_DMA(bfa); | ||
173 | |||
174 | bfa_fru_attach(fru, &bfa->ioc, bfa, bfa->trcmod, mincfg); | ||
175 | bfa_fru_memclaim(fru, fru_dma->kva_curp, fru_dma->dma_curp, mincfg); | ||
176 | } | ||
177 | |||
178 | /* | 168 | /* |
179 | * BFA IOC FC related definitions | 169 | * BFA IOC FC related definitions |
180 | */ | 170 | */ |
@@ -210,484 +200,13 @@ enum { | |||
210 | #define DEF_CFG_NUM_SBOOT_LUNS 16 | 200 | #define DEF_CFG_NUM_SBOOT_LUNS 16 |
211 | 201 | ||
212 | /* | 202 | /* |
213 | * IOCFC state machine definitions/declarations | ||
214 | */ | ||
215 | bfa_fsm_state_decl(bfa_iocfc, stopped, struct bfa_iocfc_s, enum iocfc_event); | ||
216 | bfa_fsm_state_decl(bfa_iocfc, initing, struct bfa_iocfc_s, enum iocfc_event); | ||
217 | bfa_fsm_state_decl(bfa_iocfc, dconf_read, struct bfa_iocfc_s, enum iocfc_event); | ||
218 | bfa_fsm_state_decl(bfa_iocfc, init_cfg_wait, | ||
219 | struct bfa_iocfc_s, enum iocfc_event); | ||
220 | bfa_fsm_state_decl(bfa_iocfc, init_cfg_done, | ||
221 | struct bfa_iocfc_s, enum iocfc_event); | ||
222 | bfa_fsm_state_decl(bfa_iocfc, operational, | ||
223 | struct bfa_iocfc_s, enum iocfc_event); | ||
224 | bfa_fsm_state_decl(bfa_iocfc, dconf_write, | ||
225 | struct bfa_iocfc_s, enum iocfc_event); | ||
226 | bfa_fsm_state_decl(bfa_iocfc, stopping, struct bfa_iocfc_s, enum iocfc_event); | ||
227 | bfa_fsm_state_decl(bfa_iocfc, enabling, struct bfa_iocfc_s, enum iocfc_event); | ||
228 | bfa_fsm_state_decl(bfa_iocfc, cfg_wait, struct bfa_iocfc_s, enum iocfc_event); | ||
229 | bfa_fsm_state_decl(bfa_iocfc, disabling, struct bfa_iocfc_s, enum iocfc_event); | ||
230 | bfa_fsm_state_decl(bfa_iocfc, disabled, struct bfa_iocfc_s, enum iocfc_event); | ||
231 | bfa_fsm_state_decl(bfa_iocfc, failed, struct bfa_iocfc_s, enum iocfc_event); | ||
232 | bfa_fsm_state_decl(bfa_iocfc, init_failed, | ||
233 | struct bfa_iocfc_s, enum iocfc_event); | ||
234 | |||
235 | /* | ||
236 | * forward declaration for IOC FC functions | 203 | * forward declaration for IOC FC functions |
237 | */ | 204 | */ |
238 | static void bfa_iocfc_start_submod(struct bfa_s *bfa); | ||
239 | static void bfa_iocfc_disable_submod(struct bfa_s *bfa); | ||
240 | static void bfa_iocfc_send_cfg(void *bfa_arg); | ||
241 | static void bfa_iocfc_enable_cbfn(void *bfa_arg, enum bfa_status status); | 205 | static void bfa_iocfc_enable_cbfn(void *bfa_arg, enum bfa_status status); |
242 | static void bfa_iocfc_disable_cbfn(void *bfa_arg); | 206 | static void bfa_iocfc_disable_cbfn(void *bfa_arg); |
243 | static void bfa_iocfc_hbfail_cbfn(void *bfa_arg); | 207 | static void bfa_iocfc_hbfail_cbfn(void *bfa_arg); |
244 | static void bfa_iocfc_reset_cbfn(void *bfa_arg); | 208 | static void bfa_iocfc_reset_cbfn(void *bfa_arg); |
245 | static struct bfa_ioc_cbfn_s bfa_iocfc_cbfn; | 209 | static struct bfa_ioc_cbfn_s bfa_iocfc_cbfn; |
246 | static void bfa_iocfc_init_cb(void *bfa_arg, bfa_boolean_t complete); | ||
247 | static void bfa_iocfc_stop_cb(void *bfa_arg, bfa_boolean_t compl); | ||
248 | static void bfa_iocfc_enable_cb(void *bfa_arg, bfa_boolean_t compl); | ||
249 | static void bfa_iocfc_disable_cb(void *bfa_arg, bfa_boolean_t compl); | ||
250 | |||
251 | static void | ||
252 | bfa_iocfc_sm_stopped_entry(struct bfa_iocfc_s *iocfc) | ||
253 | { | ||
254 | } | ||
255 | |||
256 | static void | ||
257 | bfa_iocfc_sm_stopped(struct bfa_iocfc_s *iocfc, enum iocfc_event event) | ||
258 | { | ||
259 | bfa_trc(iocfc->bfa, event); | ||
260 | |||
261 | switch (event) { | ||
262 | case IOCFC_E_INIT: | ||
263 | case IOCFC_E_ENABLE: | ||
264 | bfa_fsm_set_state(iocfc, bfa_iocfc_sm_initing); | ||
265 | break; | ||
266 | default: | ||
267 | bfa_sm_fault(iocfc->bfa, event); | ||
268 | break; | ||
269 | } | ||
270 | } | ||
271 | |||
272 | static void | ||
273 | bfa_iocfc_sm_initing_entry(struct bfa_iocfc_s *iocfc) | ||
274 | { | ||
275 | bfa_ioc_enable(&iocfc->bfa->ioc); | ||
276 | } | ||
277 | |||
278 | static void | ||
279 | bfa_iocfc_sm_initing(struct bfa_iocfc_s *iocfc, enum iocfc_event event) | ||
280 | { | ||
281 | bfa_trc(iocfc->bfa, event); | ||
282 | |||
283 | switch (event) { | ||
284 | case IOCFC_E_IOC_ENABLED: | ||
285 | bfa_fsm_set_state(iocfc, bfa_iocfc_sm_dconf_read); | ||
286 | break; | ||
287 | |||
288 | case IOCFC_E_DISABLE: | ||
289 | bfa_fsm_set_state(iocfc, bfa_iocfc_sm_disabling); | ||
290 | break; | ||
291 | |||
292 | case IOCFC_E_STOP: | ||
293 | bfa_fsm_set_state(iocfc, bfa_iocfc_sm_stopping); | ||
294 | break; | ||
295 | |||
296 | case IOCFC_E_IOC_FAILED: | ||
297 | bfa_fsm_set_state(iocfc, bfa_iocfc_sm_init_failed); | ||
298 | break; | ||
299 | default: | ||
300 | bfa_sm_fault(iocfc->bfa, event); | ||
301 | break; | ||
302 | } | ||
303 | } | ||
304 | |||
305 | static void | ||
306 | bfa_iocfc_sm_dconf_read_entry(struct bfa_iocfc_s *iocfc) | ||
307 | { | ||
308 | bfa_dconf_modinit(iocfc->bfa); | ||
309 | } | ||
310 | |||
311 | static void | ||
312 | bfa_iocfc_sm_dconf_read(struct bfa_iocfc_s *iocfc, enum iocfc_event event) | ||
313 | { | ||
314 | bfa_trc(iocfc->bfa, event); | ||
315 | |||
316 | switch (event) { | ||
317 | case IOCFC_E_DCONF_DONE: | ||
318 | bfa_fsm_set_state(iocfc, bfa_iocfc_sm_init_cfg_wait); | ||
319 | break; | ||
320 | |||
321 | case IOCFC_E_DISABLE: | ||
322 | bfa_fsm_set_state(iocfc, bfa_iocfc_sm_disabling); | ||
323 | break; | ||
324 | |||
325 | case IOCFC_E_STOP: | ||
326 | bfa_fsm_set_state(iocfc, bfa_iocfc_sm_stopping); | ||
327 | break; | ||
328 | |||
329 | case IOCFC_E_IOC_FAILED: | ||
330 | bfa_fsm_set_state(iocfc, bfa_iocfc_sm_init_failed); | ||
331 | break; | ||
332 | default: | ||
333 | bfa_sm_fault(iocfc->bfa, event); | ||
334 | break; | ||
335 | } | ||
336 | } | ||
337 | |||
338 | static void | ||
339 | bfa_iocfc_sm_init_cfg_wait_entry(struct bfa_iocfc_s *iocfc) | ||
340 | { | ||
341 | bfa_iocfc_send_cfg(iocfc->bfa); | ||
342 | } | ||
343 | |||
344 | static void | ||
345 | bfa_iocfc_sm_init_cfg_wait(struct bfa_iocfc_s *iocfc, enum iocfc_event event) | ||
346 | { | ||
347 | bfa_trc(iocfc->bfa, event); | ||
348 | |||
349 | switch (event) { | ||
350 | case IOCFC_E_CFG_DONE: | ||
351 | bfa_fsm_set_state(iocfc, bfa_iocfc_sm_init_cfg_done); | ||
352 | break; | ||
353 | |||
354 | case IOCFC_E_DISABLE: | ||
355 | bfa_fsm_set_state(iocfc, bfa_iocfc_sm_disabling); | ||
356 | break; | ||
357 | |||
358 | case IOCFC_E_STOP: | ||
359 | bfa_fsm_set_state(iocfc, bfa_iocfc_sm_stopping); | ||
360 | break; | ||
361 | |||
362 | case IOCFC_E_IOC_FAILED: | ||
363 | bfa_fsm_set_state(iocfc, bfa_iocfc_sm_init_failed); | ||
364 | break; | ||
365 | default: | ||
366 | bfa_sm_fault(iocfc->bfa, event); | ||
367 | break; | ||
368 | } | ||
369 | } | ||
370 | |||
371 | static void | ||
372 | bfa_iocfc_sm_init_cfg_done_entry(struct bfa_iocfc_s *iocfc) | ||
373 | { | ||
374 | iocfc->bfa->iocfc.op_status = BFA_STATUS_OK; | ||
375 | bfa_cb_queue(iocfc->bfa, &iocfc->bfa->iocfc.init_hcb_qe, | ||
376 | bfa_iocfc_init_cb, iocfc->bfa); | ||
377 | } | ||
378 | |||
379 | static void | ||
380 | bfa_iocfc_sm_init_cfg_done(struct bfa_iocfc_s *iocfc, enum iocfc_event event) | ||
381 | { | ||
382 | bfa_trc(iocfc->bfa, event); | ||
383 | |||
384 | switch (event) { | ||
385 | case IOCFC_E_START: | ||
386 | bfa_fsm_set_state(iocfc, bfa_iocfc_sm_operational); | ||
387 | break; | ||
388 | case IOCFC_E_STOP: | ||
389 | bfa_fsm_set_state(iocfc, bfa_iocfc_sm_stopping); | ||
390 | break; | ||
391 | case IOCFC_E_DISABLE: | ||
392 | bfa_fsm_set_state(iocfc, bfa_iocfc_sm_disabling); | ||
393 | break; | ||
394 | case IOCFC_E_IOC_FAILED: | ||
395 | bfa_fsm_set_state(iocfc, bfa_iocfc_sm_failed); | ||
396 | break; | ||
397 | default: | ||
398 | bfa_sm_fault(iocfc->bfa, event); | ||
399 | break; | ||
400 | } | ||
401 | } | ||
402 | |||
403 | static void | ||
404 | bfa_iocfc_sm_operational_entry(struct bfa_iocfc_s *iocfc) | ||
405 | { | ||
406 | bfa_fcport_init(iocfc->bfa); | ||
407 | bfa_iocfc_start_submod(iocfc->bfa); | ||
408 | } | ||
409 | |||
410 | static void | ||
411 | bfa_iocfc_sm_operational(struct bfa_iocfc_s *iocfc, enum iocfc_event event) | ||
412 | { | ||
413 | bfa_trc(iocfc->bfa, event); | ||
414 | |||
415 | switch (event) { | ||
416 | case IOCFC_E_STOP: | ||
417 | bfa_fsm_set_state(iocfc, bfa_iocfc_sm_dconf_write); | ||
418 | break; | ||
419 | case IOCFC_E_DISABLE: | ||
420 | bfa_fsm_set_state(iocfc, bfa_iocfc_sm_disabling); | ||
421 | break; | ||
422 | case IOCFC_E_IOC_FAILED: | ||
423 | bfa_fsm_set_state(iocfc, bfa_iocfc_sm_failed); | ||
424 | break; | ||
425 | default: | ||
426 | bfa_sm_fault(iocfc->bfa, event); | ||
427 | break; | ||
428 | } | ||
429 | } | ||
430 | |||
431 | static void | ||
432 | bfa_iocfc_sm_dconf_write_entry(struct bfa_iocfc_s *iocfc) | ||
433 | { | ||
434 | bfa_dconf_modexit(iocfc->bfa); | ||
435 | } | ||
436 | |||
437 | static void | ||
438 | bfa_iocfc_sm_dconf_write(struct bfa_iocfc_s *iocfc, enum iocfc_event event) | ||
439 | { | ||
440 | bfa_trc(iocfc->bfa, event); | ||
441 | |||
442 | switch (event) { | ||
443 | case IOCFC_E_DCONF_DONE: | ||
444 | case IOCFC_E_IOC_FAILED: | ||
445 | bfa_fsm_set_state(iocfc, bfa_iocfc_sm_stopping); | ||
446 | break; | ||
447 | default: | ||
448 | bfa_sm_fault(iocfc->bfa, event); | ||
449 | break; | ||
450 | } | ||
451 | } | ||
452 | |||
453 | static void | ||
454 | bfa_iocfc_sm_stopping_entry(struct bfa_iocfc_s *iocfc) | ||
455 | { | ||
456 | bfa_ioc_disable(&iocfc->bfa->ioc); | ||
457 | } | ||
458 | |||
459 | static void | ||
460 | bfa_iocfc_sm_stopping(struct bfa_iocfc_s *iocfc, enum iocfc_event event) | ||
461 | { | ||
462 | bfa_trc(iocfc->bfa, event); | ||
463 | |||
464 | switch (event) { | ||
465 | case IOCFC_E_IOC_DISABLED: | ||
466 | bfa_isr_disable(iocfc->bfa); | ||
467 | bfa_iocfc_disable_submod(iocfc->bfa); | ||
468 | bfa_fsm_set_state(iocfc, bfa_iocfc_sm_stopped); | ||
469 | iocfc->bfa->iocfc.op_status = BFA_STATUS_OK; | ||
470 | bfa_cb_queue(iocfc->bfa, &iocfc->bfa->iocfc.stop_hcb_qe, | ||
471 | bfa_iocfc_stop_cb, iocfc->bfa); | ||
472 | break; | ||
473 | |||
474 | case IOCFC_E_IOC_ENABLED: | ||
475 | case IOCFC_E_DCONF_DONE: | ||
476 | case IOCFC_E_CFG_DONE: | ||
477 | break; | ||
478 | |||
479 | default: | ||
480 | bfa_sm_fault(iocfc->bfa, event); | ||
481 | break; | ||
482 | } | ||
483 | } | ||
484 | |||
485 | static void | ||
486 | bfa_iocfc_sm_enabling_entry(struct bfa_iocfc_s *iocfc) | ||
487 | { | ||
488 | bfa_ioc_enable(&iocfc->bfa->ioc); | ||
489 | } | ||
490 | |||
491 | static void | ||
492 | bfa_iocfc_sm_enabling(struct bfa_iocfc_s *iocfc, enum iocfc_event event) | ||
493 | { | ||
494 | bfa_trc(iocfc->bfa, event); | ||
495 | |||
496 | switch (event) { | ||
497 | case IOCFC_E_IOC_ENABLED: | ||
498 | bfa_fsm_set_state(iocfc, bfa_iocfc_sm_cfg_wait); | ||
499 | break; | ||
500 | |||
501 | case IOCFC_E_DISABLE: | ||
502 | bfa_fsm_set_state(iocfc, bfa_iocfc_sm_disabling); | ||
503 | break; | ||
504 | |||
505 | case IOCFC_E_STOP: | ||
506 | bfa_fsm_set_state(iocfc, bfa_iocfc_sm_dconf_write); | ||
507 | break; | ||
508 | |||
509 | case IOCFC_E_IOC_FAILED: | ||
510 | bfa_fsm_set_state(iocfc, bfa_iocfc_sm_failed); | ||
511 | |||
512 | if (iocfc->bfa->iocfc.cb_reqd == BFA_FALSE) | ||
513 | break; | ||
514 | |||
515 | iocfc->bfa->iocfc.op_status = BFA_STATUS_FAILED; | ||
516 | bfa_cb_queue(iocfc->bfa, &iocfc->bfa->iocfc.en_hcb_qe, | ||
517 | bfa_iocfc_enable_cb, iocfc->bfa); | ||
518 | iocfc->bfa->iocfc.cb_reqd = BFA_FALSE; | ||
519 | break; | ||
520 | default: | ||
521 | bfa_sm_fault(iocfc->bfa, event); | ||
522 | break; | ||
523 | } | ||
524 | } | ||
525 | |||
526 | static void | ||
527 | bfa_iocfc_sm_cfg_wait_entry(struct bfa_iocfc_s *iocfc) | ||
528 | { | ||
529 | bfa_iocfc_send_cfg(iocfc->bfa); | ||
530 | } | ||
531 | |||
532 | static void | ||
533 | bfa_iocfc_sm_cfg_wait(struct bfa_iocfc_s *iocfc, enum iocfc_event event) | ||
534 | { | ||
535 | bfa_trc(iocfc->bfa, event); | ||
536 | |||
537 | switch (event) { | ||
538 | case IOCFC_E_CFG_DONE: | ||
539 | bfa_fsm_set_state(iocfc, bfa_iocfc_sm_operational); | ||
540 | if (iocfc->bfa->iocfc.cb_reqd == BFA_FALSE) | ||
541 | break; | ||
542 | |||
543 | iocfc->bfa->iocfc.op_status = BFA_STATUS_OK; | ||
544 | bfa_cb_queue(iocfc->bfa, &iocfc->bfa->iocfc.en_hcb_qe, | ||
545 | bfa_iocfc_enable_cb, iocfc->bfa); | ||
546 | iocfc->bfa->iocfc.cb_reqd = BFA_FALSE; | ||
547 | break; | ||
548 | case IOCFC_E_DISABLE: | ||
549 | bfa_fsm_set_state(iocfc, bfa_iocfc_sm_disabling); | ||
550 | break; | ||
551 | |||
552 | case IOCFC_E_STOP: | ||
553 | bfa_fsm_set_state(iocfc, bfa_iocfc_sm_dconf_write); | ||
554 | break; | ||
555 | case IOCFC_E_IOC_FAILED: | ||
556 | bfa_fsm_set_state(iocfc, bfa_iocfc_sm_failed); | ||
557 | if (iocfc->bfa->iocfc.cb_reqd == BFA_FALSE) | ||
558 | break; | ||
559 | |||
560 | iocfc->bfa->iocfc.op_status = BFA_STATUS_FAILED; | ||
561 | bfa_cb_queue(iocfc->bfa, &iocfc->bfa->iocfc.en_hcb_qe, | ||
562 | bfa_iocfc_enable_cb, iocfc->bfa); | ||
563 | iocfc->bfa->iocfc.cb_reqd = BFA_FALSE; | ||
564 | break; | ||
565 | default: | ||
566 | bfa_sm_fault(iocfc->bfa, event); | ||
567 | break; | ||
568 | } | ||
569 | } | ||
570 | |||
571 | static void | ||
572 | bfa_iocfc_sm_disabling_entry(struct bfa_iocfc_s *iocfc) | ||
573 | { | ||
574 | bfa_ioc_disable(&iocfc->bfa->ioc); | ||
575 | } | ||
576 | |||
577 | static void | ||
578 | bfa_iocfc_sm_disabling(struct bfa_iocfc_s *iocfc, enum iocfc_event event) | ||
579 | { | ||
580 | bfa_trc(iocfc->bfa, event); | ||
581 | |||
582 | switch (event) { | ||
583 | case IOCFC_E_IOC_DISABLED: | ||
584 | bfa_fsm_set_state(iocfc, bfa_iocfc_sm_disabled); | ||
585 | break; | ||
586 | case IOCFC_E_IOC_ENABLED: | ||
587 | case IOCFC_E_DCONF_DONE: | ||
588 | case IOCFC_E_CFG_DONE: | ||
589 | break; | ||
590 | default: | ||
591 | bfa_sm_fault(iocfc->bfa, event); | ||
592 | break; | ||
593 | } | ||
594 | } | ||
595 | |||
596 | static void | ||
597 | bfa_iocfc_sm_disabled_entry(struct bfa_iocfc_s *iocfc) | ||
598 | { | ||
599 | bfa_isr_disable(iocfc->bfa); | ||
600 | bfa_iocfc_disable_submod(iocfc->bfa); | ||
601 | iocfc->bfa->iocfc.op_status = BFA_STATUS_OK; | ||
602 | bfa_cb_queue(iocfc->bfa, &iocfc->bfa->iocfc.dis_hcb_qe, | ||
603 | bfa_iocfc_disable_cb, iocfc->bfa); | ||
604 | } | ||
605 | |||
606 | static void | ||
607 | bfa_iocfc_sm_disabled(struct bfa_iocfc_s *iocfc, enum iocfc_event event) | ||
608 | { | ||
609 | bfa_trc(iocfc->bfa, event); | ||
610 | |||
611 | switch (event) { | ||
612 | case IOCFC_E_STOP: | ||
613 | bfa_fsm_set_state(iocfc, bfa_iocfc_sm_dconf_write); | ||
614 | break; | ||
615 | case IOCFC_E_ENABLE: | ||
616 | bfa_fsm_set_state(iocfc, bfa_iocfc_sm_enabling); | ||
617 | break; | ||
618 | default: | ||
619 | bfa_sm_fault(iocfc->bfa, event); | ||
620 | break; | ||
621 | } | ||
622 | } | ||
623 | |||
624 | static void | ||
625 | bfa_iocfc_sm_failed_entry(struct bfa_iocfc_s *iocfc) | ||
626 | { | ||
627 | bfa_isr_disable(iocfc->bfa); | ||
628 | bfa_iocfc_disable_submod(iocfc->bfa); | ||
629 | } | ||
630 | |||
631 | static void | ||
632 | bfa_iocfc_sm_failed(struct bfa_iocfc_s *iocfc, enum iocfc_event event) | ||
633 | { | ||
634 | bfa_trc(iocfc->bfa, event); | ||
635 | |||
636 | switch (event) { | ||
637 | case IOCFC_E_STOP: | ||
638 | bfa_fsm_set_state(iocfc, bfa_iocfc_sm_dconf_write); | ||
639 | break; | ||
640 | case IOCFC_E_DISABLE: | ||
641 | bfa_fsm_set_state(iocfc, bfa_iocfc_sm_disabling); | ||
642 | break; | ||
643 | case IOCFC_E_IOC_ENABLED: | ||
644 | bfa_fsm_set_state(iocfc, bfa_iocfc_sm_cfg_wait); | ||
645 | break; | ||
646 | case IOCFC_E_IOC_FAILED: | ||
647 | break; | ||
648 | default: | ||
649 | bfa_sm_fault(iocfc->bfa, event); | ||
650 | break; | ||
651 | } | ||
652 | } | ||
653 | |||
654 | static void | ||
655 | bfa_iocfc_sm_init_failed_entry(struct bfa_iocfc_s *iocfc) | ||
656 | { | ||
657 | bfa_isr_disable(iocfc->bfa); | ||
658 | iocfc->bfa->iocfc.op_status = BFA_STATUS_FAILED; | ||
659 | bfa_cb_queue(iocfc->bfa, &iocfc->bfa->iocfc.init_hcb_qe, | ||
660 | bfa_iocfc_init_cb, iocfc->bfa); | ||
661 | } | ||
662 | |||
663 | static void | ||
664 | bfa_iocfc_sm_init_failed(struct bfa_iocfc_s *iocfc, enum iocfc_event event) | ||
665 | { | ||
666 | bfa_trc(iocfc->bfa, event); | ||
667 | |||
668 | switch (event) { | ||
669 | case IOCFC_E_STOP: | ||
670 | bfa_fsm_set_state(iocfc, bfa_iocfc_sm_stopping); | ||
671 | break; | ||
672 | case IOCFC_E_DISABLE: | ||
673 | bfa_ioc_disable(&iocfc->bfa->ioc); | ||
674 | break; | ||
675 | case IOCFC_E_IOC_ENABLED: | ||
676 | bfa_fsm_set_state(iocfc, bfa_iocfc_sm_dconf_read); | ||
677 | break; | ||
678 | case IOCFC_E_IOC_DISABLED: | ||
679 | bfa_fsm_set_state(iocfc, bfa_iocfc_sm_stopped); | ||
680 | iocfc->bfa->iocfc.op_status = BFA_STATUS_OK; | ||
681 | bfa_cb_queue(iocfc->bfa, &iocfc->bfa->iocfc.dis_hcb_qe, | ||
682 | bfa_iocfc_disable_cb, iocfc->bfa); | ||
683 | break; | ||
684 | case IOCFC_E_IOC_FAILED: | ||
685 | break; | ||
686 | default: | ||
687 | bfa_sm_fault(iocfc->bfa, event); | ||
688 | break; | ||
689 | } | ||
690 | } | ||
691 | 210 | ||
692 | /* | 211 | /* |
693 | * BFA Interrupt handling functions | 212 | * BFA Interrupt handling functions |
@@ -712,19 +231,16 @@ bfa_reqq_resume(struct bfa_s *bfa, int qid) | |||
712 | } | 231 | } |
713 | } | 232 | } |
714 | 233 | ||
715 | bfa_boolean_t | 234 | static inline void |
716 | bfa_isr_rspq(struct bfa_s *bfa, int qid) | 235 | bfa_isr_rspq(struct bfa_s *bfa, int qid) |
717 | { | 236 | { |
718 | struct bfi_msg_s *m; | 237 | struct bfi_msg_s *m; |
719 | u32 pi, ci; | 238 | u32 pi, ci; |
720 | struct list_head *waitq; | 239 | struct list_head *waitq; |
721 | bfa_boolean_t ret; | ||
722 | 240 | ||
723 | ci = bfa_rspq_ci(bfa, qid); | 241 | ci = bfa_rspq_ci(bfa, qid); |
724 | pi = bfa_rspq_pi(bfa, qid); | 242 | pi = bfa_rspq_pi(bfa, qid); |
725 | 243 | ||
726 | ret = (ci != pi); | ||
727 | |||
728 | while (ci != pi) { | 244 | while (ci != pi) { |
729 | m = bfa_rspq_elem(bfa, qid, ci); | 245 | m = bfa_rspq_elem(bfa, qid, ci); |
730 | WARN_ON(m->mhdr.msg_class >= BFI_MC_MAX); | 246 | WARN_ON(m->mhdr.msg_class >= BFI_MC_MAX); |
@@ -744,8 +260,6 @@ bfa_isr_rspq(struct bfa_s *bfa, int qid) | |||
744 | waitq = bfa_reqq(bfa, qid); | 260 | waitq = bfa_reqq(bfa, qid); |
745 | if (!list_empty(waitq)) | 261 | if (!list_empty(waitq)) |
746 | bfa_reqq_resume(bfa, qid); | 262 | bfa_reqq_resume(bfa, qid); |
747 | |||
748 | return ret; | ||
749 | } | 263 | } |
750 | 264 | ||
751 | static inline void | 265 | static inline void |
@@ -806,7 +320,6 @@ bfa_intx(struct bfa_s *bfa) | |||
806 | { | 320 | { |
807 | u32 intr, qintr; | 321 | u32 intr, qintr; |
808 | int queue; | 322 | int queue; |
809 | bfa_boolean_t rspq_comp = BFA_FALSE; | ||
810 | 323 | ||
811 | intr = readl(bfa->iocfc.bfa_regs.intr_status); | 324 | intr = readl(bfa->iocfc.bfa_regs.intr_status); |
812 | 325 | ||
@@ -819,12 +332,11 @@ bfa_intx(struct bfa_s *bfa) | |||
819 | */ | 332 | */ |
820 | if (bfa->queue_process) { | 333 | if (bfa->queue_process) { |
821 | for (queue = 0; queue < BFI_IOC_MAX_CQS; queue++) | 334 | for (queue = 0; queue < BFI_IOC_MAX_CQS; queue++) |
822 | if (bfa_isr_rspq(bfa, queue)) | 335 | bfa_isr_rspq(bfa, queue); |
823 | rspq_comp = BFA_TRUE; | ||
824 | } | 336 | } |
825 | 337 | ||
826 | if (!intr) | 338 | if (!intr) |
827 | return (qintr | rspq_comp) ? BFA_TRUE : BFA_FALSE; | 339 | return BFA_TRUE; |
828 | 340 | ||
829 | /* | 341 | /* |
830 | * CPE completion queue interrupt | 342 | * CPE completion queue interrupt |
@@ -838,8 +350,7 @@ bfa_intx(struct bfa_s *bfa) | |||
838 | if (!intr) | 350 | if (!intr) |
839 | return BFA_TRUE; | 351 | return BFA_TRUE; |
840 | 352 | ||
841 | if (bfa->intr_enabled) | 353 | bfa_msix_lpu_err(bfa, intr); |
842 | bfa_msix_lpu_err(bfa, intr); | ||
843 | 354 | ||
844 | return BFA_TRUE; | 355 | return BFA_TRUE; |
845 | } | 356 | } |
@@ -848,37 +359,30 @@ void | |||
848 | bfa_isr_enable(struct bfa_s *bfa) | 359 | bfa_isr_enable(struct bfa_s *bfa) |
849 | { | 360 | { |
850 | u32 umsk; | 361 | u32 umsk; |
851 | int port_id = bfa_ioc_portid(&bfa->ioc); | 362 | int pci_func = bfa_ioc_pcifn(&bfa->ioc); |
852 | 363 | ||
853 | bfa_trc(bfa, bfa_ioc_pcifn(&bfa->ioc)); | 364 | bfa_trc(bfa, pci_func); |
854 | bfa_trc(bfa, port_id); | ||
855 | 365 | ||
856 | bfa_msix_ctrl_install(bfa); | 366 | bfa_msix_ctrl_install(bfa); |
857 | 367 | ||
858 | if (bfa_asic_id_ct2(bfa->ioc.pcidev.device_id)) { | 368 | if (bfa_asic_id_ct2(bfa->ioc.pcidev.device_id)) { |
859 | umsk = __HFN_INT_ERR_MASK_CT2; | 369 | umsk = __HFN_INT_ERR_MASK_CT2; |
860 | umsk |= port_id == 0 ? | 370 | umsk |= pci_func == 0 ? |
861 | __HFN_INT_FN0_MASK_CT2 : __HFN_INT_FN1_MASK_CT2; | 371 | __HFN_INT_FN0_MASK_CT2 : __HFN_INT_FN1_MASK_CT2; |
862 | } else { | 372 | } else { |
863 | umsk = __HFN_INT_ERR_MASK; | 373 | umsk = __HFN_INT_ERR_MASK; |
864 | umsk |= port_id == 0 ? __HFN_INT_FN0_MASK : __HFN_INT_FN1_MASK; | 374 | umsk |= pci_func == 0 ? __HFN_INT_FN0_MASK : __HFN_INT_FN1_MASK; |
865 | } | 375 | } |
866 | 376 | ||
867 | writel(umsk, bfa->iocfc.bfa_regs.intr_status); | 377 | writel(umsk, bfa->iocfc.bfa_regs.intr_status); |
868 | writel(~umsk, bfa->iocfc.bfa_regs.intr_mask); | 378 | writel(~umsk, bfa->iocfc.bfa_regs.intr_mask); |
869 | bfa->iocfc.intr_mask = ~umsk; | 379 | bfa->iocfc.intr_mask = ~umsk; |
870 | bfa_isr_mode_set(bfa, bfa->msix.nvecs != 0); | 380 | bfa_isr_mode_set(bfa, bfa->msix.nvecs != 0); |
871 | |||
872 | /* | ||
873 | * Set the flag indicating successful enabling of interrupts | ||
874 | */ | ||
875 | bfa->intr_enabled = BFA_TRUE; | ||
876 | } | 381 | } |
877 | 382 | ||
878 | void | 383 | void |
879 | bfa_isr_disable(struct bfa_s *bfa) | 384 | bfa_isr_disable(struct bfa_s *bfa) |
880 | { | 385 | { |
881 | bfa->intr_enabled = BFA_FALSE; | ||
882 | bfa_isr_mode_set(bfa, BFA_FALSE); | 386 | bfa_isr_mode_set(bfa, BFA_FALSE); |
883 | writel(-1L, bfa->iocfc.bfa_regs.intr_mask); | 387 | writel(-1L, bfa->iocfc.bfa_regs.intr_mask); |
884 | bfa_msix_uninstall(bfa); | 388 | bfa_msix_uninstall(bfa); |
@@ -994,8 +498,7 @@ bfa_iocfc_send_cfg(void *bfa_arg) | |||
994 | cfg_info->single_msix_vec = 1; | 498 | cfg_info->single_msix_vec = 1; |
995 | cfg_info->endian_sig = BFI_IOC_ENDIAN_SIG; | 499 | cfg_info->endian_sig = BFI_IOC_ENDIAN_SIG; |
996 | cfg_info->num_cqs = cfg->fwcfg.num_cqs; | 500 | cfg_info->num_cqs = cfg->fwcfg.num_cqs; |
997 | cfg_info->num_ioim_reqs = cpu_to_be16(bfa_fcpim_get_throttle_cfg(bfa, | 501 | cfg_info->num_ioim_reqs = cpu_to_be16(cfg->fwcfg.num_ioim_reqs); |
998 | cfg->fwcfg.num_ioim_reqs)); | ||
999 | cfg_info->num_fwtio_reqs = cpu_to_be16(cfg->fwcfg.num_fwtio_reqs); | 502 | cfg_info->num_fwtio_reqs = cpu_to_be16(cfg->fwcfg.num_fwtio_reqs); |
1000 | 503 | ||
1001 | bfa_dma_be_addr_set(cfg_info->cfgrsp_addr, iocfc->cfgrsp_dma.pa); | 504 | bfa_dma_be_addr_set(cfg_info->cfgrsp_addr, iocfc->cfgrsp_dma.pa); |
@@ -1022,9 +525,11 @@ bfa_iocfc_send_cfg(void *bfa_arg) | |||
1022 | * Enable interrupt coalescing if it is driver init path | 525 | * Enable interrupt coalescing if it is driver init path |
1023 | * and not ioc disable/enable path. | 526 | * and not ioc disable/enable path. |
1024 | */ | 527 | */ |
1025 | if (bfa_fsm_cmp_state(iocfc, bfa_iocfc_sm_init_cfg_wait)) | 528 | if (!iocfc->cfgdone) |
1026 | cfg_info->intr_attr.coalesce = BFA_TRUE; | 529 | cfg_info->intr_attr.coalesce = BFA_TRUE; |
1027 | 530 | ||
531 | iocfc->cfgdone = BFA_FALSE; | ||
532 | |||
1028 | /* | 533 | /* |
1029 | * dma map IOC configuration itself | 534 | * dma map IOC configuration itself |
1030 | */ | 535 | */ |
@@ -1044,6 +549,8 @@ bfa_iocfc_init_mem(struct bfa_s *bfa, void *bfad, struct bfa_iocfc_cfg_s *cfg, | |||
1044 | 549 | ||
1045 | bfa->bfad = bfad; | 550 | bfa->bfad = bfad; |
1046 | iocfc->bfa = bfa; | 551 | iocfc->bfa = bfa; |
552 | iocfc->action = BFA_IOCFC_ACT_NONE; | ||
553 | |||
1047 | iocfc->cfg = *cfg; | 554 | iocfc->cfg = *cfg; |
1048 | 555 | ||
1049 | /* | 556 | /* |
@@ -1094,7 +601,7 @@ bfa_iocfc_mem_claim(struct bfa_s *bfa, struct bfa_iocfc_cfg_s *cfg) | |||
1094 | { | 601 | { |
1095 | u8 *dm_kva = NULL; | 602 | u8 *dm_kva = NULL; |
1096 | u64 dm_pa = 0; | 603 | u64 dm_pa = 0; |
1097 | int i, per_reqq_sz, per_rspq_sz; | 604 | int i, per_reqq_sz, per_rspq_sz, dbgsz; |
1098 | struct bfa_iocfc_s *iocfc = &bfa->iocfc; | 605 | struct bfa_iocfc_s *iocfc = &bfa->iocfc; |
1099 | struct bfa_mem_dma_s *ioc_dma = BFA_MEM_IOC_DMA(bfa); | 606 | struct bfa_mem_dma_s *ioc_dma = BFA_MEM_IOC_DMA(bfa); |
1100 | struct bfa_mem_dma_s *iocfc_dma = BFA_MEM_IOCFC_DMA(bfa); | 607 | struct bfa_mem_dma_s *iocfc_dma = BFA_MEM_IOCFC_DMA(bfa); |
@@ -1155,8 +662,11 @@ bfa_iocfc_mem_claim(struct bfa_s *bfa, struct bfa_iocfc_cfg_s *cfg) | |||
1155 | BFA_CACHELINE_SZ); | 662 | BFA_CACHELINE_SZ); |
1156 | 663 | ||
1157 | /* Claim IOCFC kva memory */ | 664 | /* Claim IOCFC kva memory */ |
1158 | bfa_ioc_debug_memclaim(&bfa->ioc, bfa_mem_kva_curp(iocfc)); | 665 | dbgsz = (bfa_auto_recover) ? BFA_DBG_FWTRC_LEN : 0; |
1159 | bfa_mem_kva_curp(iocfc) += BFA_DBG_FWTRC_LEN; | 666 | if (dbgsz > 0) { |
667 | bfa_ioc_debug_memclaim(&bfa->ioc, bfa_mem_kva_curp(iocfc)); | ||
668 | bfa_mem_kva_curp(iocfc) += dbgsz; | ||
669 | } | ||
1160 | } | 670 | } |
1161 | 671 | ||
1162 | /* | 672 | /* |
@@ -1173,8 +683,6 @@ bfa_iocfc_start_submod(struct bfa_s *bfa) | |||
1173 | 683 | ||
1174 | for (i = 0; hal_mods[i]; i++) | 684 | for (i = 0; hal_mods[i]; i++) |
1175 | hal_mods[i]->start(bfa); | 685 | hal_mods[i]->start(bfa); |
1176 | |||
1177 | bfa->iocfc.submod_enabled = BFA_TRUE; | ||
1178 | } | 686 | } |
1179 | 687 | ||
1180 | /* | 688 | /* |
@@ -1185,13 +693,8 @@ bfa_iocfc_disable_submod(struct bfa_s *bfa) | |||
1185 | { | 693 | { |
1186 | int i; | 694 | int i; |
1187 | 695 | ||
1188 | if (bfa->iocfc.submod_enabled == BFA_FALSE) | ||
1189 | return; | ||
1190 | |||
1191 | for (i = 0; hal_mods[i]; i++) | 696 | for (i = 0; hal_mods[i]; i++) |
1192 | hal_mods[i]->iocdisable(bfa); | 697 | hal_mods[i]->iocdisable(bfa); |
1193 | |||
1194 | bfa->iocfc.submod_enabled = BFA_FALSE; | ||
1195 | } | 698 | } |
1196 | 699 | ||
1197 | static void | 700 | static void |
@@ -1199,8 +702,15 @@ bfa_iocfc_init_cb(void *bfa_arg, bfa_boolean_t complete) | |||
1199 | { | 702 | { |
1200 | struct bfa_s *bfa = bfa_arg; | 703 | struct bfa_s *bfa = bfa_arg; |
1201 | 704 | ||
1202 | if (complete) | 705 | if (complete) { |
1203 | bfa_cb_init(bfa->bfad, bfa->iocfc.op_status); | 706 | if (bfa->iocfc.cfgdone && BFA_DCONF_MOD(bfa)->flashdone) |
707 | bfa_cb_init(bfa->bfad, BFA_STATUS_OK); | ||
708 | else | ||
709 | bfa_cb_init(bfa->bfad, BFA_STATUS_FAILED); | ||
710 | } else { | ||
711 | if (bfa->iocfc.cfgdone) | ||
712 | bfa->iocfc.action = BFA_IOCFC_ACT_NONE; | ||
713 | } | ||
1204 | } | 714 | } |
1205 | 715 | ||
1206 | static void | 716 | static void |
@@ -1211,6 +721,8 @@ bfa_iocfc_stop_cb(void *bfa_arg, bfa_boolean_t compl) | |||
1211 | 721 | ||
1212 | if (compl) | 722 | if (compl) |
1213 | complete(&bfad->comp); | 723 | complete(&bfad->comp); |
724 | else | ||
725 | bfa->iocfc.action = BFA_IOCFC_ACT_NONE; | ||
1214 | } | 726 | } |
1215 | 727 | ||
1216 | static void | 728 | static void |
@@ -1257,14 +769,10 @@ bfa_iocfc_qreg(struct bfa_s *bfa, struct bfi_iocfc_qreg_s *qreg) | |||
1257 | static void | 769 | static void |
1258 | bfa_iocfc_res_recfg(struct bfa_s *bfa, struct bfa_iocfc_fwcfg_s *fwcfg) | 770 | bfa_iocfc_res_recfg(struct bfa_s *bfa, struct bfa_iocfc_fwcfg_s *fwcfg) |
1259 | { | 771 | { |
1260 | struct bfa_iocfc_s *iocfc = &bfa->iocfc; | ||
1261 | struct bfi_iocfc_cfg_s *cfg_info = iocfc->cfginfo; | ||
1262 | |||
1263 | bfa_fcxp_res_recfg(bfa, fwcfg->num_fcxp_reqs); | 772 | bfa_fcxp_res_recfg(bfa, fwcfg->num_fcxp_reqs); |
1264 | bfa_uf_res_recfg(bfa, fwcfg->num_uf_bufs); | 773 | bfa_uf_res_recfg(bfa, fwcfg->num_uf_bufs); |
1265 | bfa_rport_res_recfg(bfa, fwcfg->num_rports); | 774 | bfa_rport_res_recfg(bfa, fwcfg->num_rports); |
1266 | bfa_fcp_res_recfg(bfa, cpu_to_be16(cfg_info->num_ioim_reqs), | 775 | bfa_fcp_res_recfg(bfa, fwcfg->num_ioim_reqs); |
1267 | fwcfg->num_ioim_reqs); | ||
1268 | bfa_tskim_res_recfg(bfa, fwcfg->num_tskim_reqs); | 776 | bfa_tskim_res_recfg(bfa, fwcfg->num_tskim_reqs); |
1269 | } | 777 | } |
1270 | 778 | ||
@@ -1286,6 +794,8 @@ bfa_iocfc_cfgrsp(struct bfa_s *bfa) | |||
1286 | fwcfg->num_uf_bufs = be16_to_cpu(fwcfg->num_uf_bufs); | 794 | fwcfg->num_uf_bufs = be16_to_cpu(fwcfg->num_uf_bufs); |
1287 | fwcfg->num_rports = be16_to_cpu(fwcfg->num_rports); | 795 | fwcfg->num_rports = be16_to_cpu(fwcfg->num_rports); |
1288 | 796 | ||
797 | iocfc->cfgdone = BFA_TRUE; | ||
798 | |||
1289 | /* | 799 | /* |
1290 | * configure queue register offsets as learnt from firmware | 800 | * configure queue register offsets as learnt from firmware |
1291 | */ | 801 | */ |
@@ -1301,13 +811,22 @@ bfa_iocfc_cfgrsp(struct bfa_s *bfa) | |||
1301 | */ | 811 | */ |
1302 | bfa_msix_queue_install(bfa); | 812 | bfa_msix_queue_install(bfa); |
1303 | 813 | ||
1304 | if (bfa->iocfc.cfgrsp->pbc_cfg.pbc_pwwn != 0) { | 814 | /* |
1305 | bfa->ioc.attr->pwwn = bfa->iocfc.cfgrsp->pbc_cfg.pbc_pwwn; | 815 | * Configuration is complete - initialize/start submodules |
1306 | bfa->ioc.attr->nwwn = bfa->iocfc.cfgrsp->pbc_cfg.pbc_nwwn; | 816 | */ |
1307 | bfa_fsm_send_event(iocfc, IOCFC_E_CFG_DONE); | 817 | bfa_fcport_init(bfa); |
818 | |||
819 | if (iocfc->action == BFA_IOCFC_ACT_INIT) { | ||
820 | if (BFA_DCONF_MOD(bfa)->flashdone == BFA_TRUE) | ||
821 | bfa_cb_queue(bfa, &iocfc->init_hcb_qe, | ||
822 | bfa_iocfc_init_cb, bfa); | ||
823 | } else { | ||
824 | if (bfa->iocfc.action == BFA_IOCFC_ACT_ENABLE) | ||
825 | bfa_cb_queue(bfa, &bfa->iocfc.en_hcb_qe, | ||
826 | bfa_iocfc_enable_cb, bfa); | ||
827 | bfa_iocfc_start_submod(bfa); | ||
1308 | } | 828 | } |
1309 | } | 829 | } |
1310 | |||
1311 | void | 830 | void |
1312 | bfa_iocfc_reset_queues(struct bfa_s *bfa) | 831 | bfa_iocfc_reset_queues(struct bfa_s *bfa) |
1313 | { | 832 | { |
@@ -1321,23 +840,6 @@ bfa_iocfc_reset_queues(struct bfa_s *bfa) | |||
1321 | } | 840 | } |
1322 | } | 841 | } |
1323 | 842 | ||
1324 | /* | ||
1325 | * Process FAA pwwn msg from fw. | ||
1326 | */ | ||
1327 | static void | ||
1328 | bfa_iocfc_process_faa_addr(struct bfa_s *bfa, struct bfi_faa_addr_msg_s *msg) | ||
1329 | { | ||
1330 | struct bfa_iocfc_s *iocfc = &bfa->iocfc; | ||
1331 | struct bfi_iocfc_cfgrsp_s *cfgrsp = iocfc->cfgrsp; | ||
1332 | |||
1333 | cfgrsp->pbc_cfg.pbc_pwwn = msg->pwwn; | ||
1334 | cfgrsp->pbc_cfg.pbc_nwwn = msg->nwwn; | ||
1335 | |||
1336 | bfa->ioc.attr->pwwn = msg->pwwn; | ||
1337 | bfa->ioc.attr->nwwn = msg->nwwn; | ||
1338 | bfa_fsm_send_event(iocfc, IOCFC_E_CFG_DONE); | ||
1339 | } | ||
1340 | |||
1341 | /* Fabric Assigned Address specific functions */ | 843 | /* Fabric Assigned Address specific functions */ |
1342 | 844 | ||
1343 | /* | 845 | /* |
@@ -1353,13 +855,84 @@ bfa_faa_validate_request(struct bfa_s *bfa) | |||
1353 | if ((ioc_type != BFA_IOC_TYPE_FC) || bfa_mfg_is_mezz(card_type)) | 855 | if ((ioc_type != BFA_IOC_TYPE_FC) || bfa_mfg_is_mezz(card_type)) |
1354 | return BFA_STATUS_FEATURE_NOT_SUPPORTED; | 856 | return BFA_STATUS_FEATURE_NOT_SUPPORTED; |
1355 | } else { | 857 | } else { |
1356 | return BFA_STATUS_IOC_NON_OP; | 858 | if (!bfa_ioc_is_acq_addr(&bfa->ioc)) |
859 | return BFA_STATUS_IOC_NON_OP; | ||
1357 | } | 860 | } |
1358 | 861 | ||
1359 | return BFA_STATUS_OK; | 862 | return BFA_STATUS_OK; |
1360 | } | 863 | } |
1361 | 864 | ||
1362 | bfa_status_t | 865 | bfa_status_t |
866 | bfa_faa_enable(struct bfa_s *bfa, bfa_cb_iocfc_t cbfn, void *cbarg) | ||
867 | { | ||
868 | struct bfi_faa_en_dis_s faa_enable_req; | ||
869 | struct bfa_iocfc_s *iocfc = &bfa->iocfc; | ||
870 | bfa_status_t status; | ||
871 | |||
872 | iocfc->faa_args.faa_cb.faa_cbfn = cbfn; | ||
873 | iocfc->faa_args.faa_cb.faa_cbarg = cbarg; | ||
874 | |||
875 | status = bfa_faa_validate_request(bfa); | ||
876 | if (status != BFA_STATUS_OK) | ||
877 | return status; | ||
878 | |||
879 | if (iocfc->faa_args.busy == BFA_TRUE) | ||
880 | return BFA_STATUS_DEVBUSY; | ||
881 | |||
882 | if (iocfc->faa_args.faa_state == BFA_FAA_ENABLED) | ||
883 | return BFA_STATUS_FAA_ENABLED; | ||
884 | |||
885 | if (bfa_fcport_is_trunk_enabled(bfa)) | ||
886 | return BFA_STATUS_ERROR_TRUNK_ENABLED; | ||
887 | |||
888 | bfa_fcport_cfg_faa(bfa, BFA_FAA_ENABLED); | ||
889 | iocfc->faa_args.busy = BFA_TRUE; | ||
890 | |||
891 | memset(&faa_enable_req, 0, sizeof(struct bfi_faa_en_dis_s)); | ||
892 | bfi_h2i_set(faa_enable_req.mh, BFI_MC_IOCFC, | ||
893 | BFI_IOCFC_H2I_FAA_ENABLE_REQ, bfa_fn_lpu(bfa)); | ||
894 | |||
895 | bfa_ioc_mbox_send(&bfa->ioc, &faa_enable_req, | ||
896 | sizeof(struct bfi_faa_en_dis_s)); | ||
897 | |||
898 | return BFA_STATUS_OK; | ||
899 | } | ||
900 | |||
901 | bfa_status_t | ||
902 | bfa_faa_disable(struct bfa_s *bfa, bfa_cb_iocfc_t cbfn, | ||
903 | void *cbarg) | ||
904 | { | ||
905 | struct bfi_faa_en_dis_s faa_disable_req; | ||
906 | struct bfa_iocfc_s *iocfc = &bfa->iocfc; | ||
907 | bfa_status_t status; | ||
908 | |||
909 | iocfc->faa_args.faa_cb.faa_cbfn = cbfn; | ||
910 | iocfc->faa_args.faa_cb.faa_cbarg = cbarg; | ||
911 | |||
912 | status = bfa_faa_validate_request(bfa); | ||
913 | if (status != BFA_STATUS_OK) | ||
914 | return status; | ||
915 | |||
916 | if (iocfc->faa_args.busy == BFA_TRUE) | ||
917 | return BFA_STATUS_DEVBUSY; | ||
918 | |||
919 | if (iocfc->faa_args.faa_state == BFA_FAA_DISABLED) | ||
920 | return BFA_STATUS_FAA_DISABLED; | ||
921 | |||
922 | bfa_fcport_cfg_faa(bfa, BFA_FAA_DISABLED); | ||
923 | iocfc->faa_args.busy = BFA_TRUE; | ||
924 | |||
925 | memset(&faa_disable_req, 0, sizeof(struct bfi_faa_en_dis_s)); | ||
926 | bfi_h2i_set(faa_disable_req.mh, BFI_MC_IOCFC, | ||
927 | BFI_IOCFC_H2I_FAA_DISABLE_REQ, bfa_fn_lpu(bfa)); | ||
928 | |||
929 | bfa_ioc_mbox_send(&bfa->ioc, &faa_disable_req, | ||
930 | sizeof(struct bfi_faa_en_dis_s)); | ||
931 | |||
932 | return BFA_STATUS_OK; | ||
933 | } | ||
934 | |||
935 | bfa_status_t | ||
1363 | bfa_faa_query(struct bfa_s *bfa, struct bfa_faa_attr_s *attr, | 936 | bfa_faa_query(struct bfa_s *bfa, struct bfa_faa_attr_s *attr, |
1364 | bfa_cb_iocfc_t cbfn, void *cbarg) | 937 | bfa_cb_iocfc_t cbfn, void *cbarg) |
1365 | { | 938 | { |
@@ -1390,6 +963,38 @@ bfa_faa_query(struct bfa_s *bfa, struct bfa_faa_attr_s *attr, | |||
1390 | } | 963 | } |
1391 | 964 | ||
1392 | /* | 965 | /* |
966 | * FAA enable response | ||
967 | */ | ||
968 | static void | ||
969 | bfa_faa_enable_reply(struct bfa_iocfc_s *iocfc, | ||
970 | struct bfi_faa_en_dis_rsp_s *rsp) | ||
971 | { | ||
972 | void *cbarg = iocfc->faa_args.faa_cb.faa_cbarg; | ||
973 | bfa_status_t status = rsp->status; | ||
974 | |||
975 | WARN_ON(!iocfc->faa_args.faa_cb.faa_cbfn); | ||
976 | |||
977 | iocfc->faa_args.faa_cb.faa_cbfn(cbarg, status); | ||
978 | iocfc->faa_args.busy = BFA_FALSE; | ||
979 | } | ||
980 | |||
981 | /* | ||
982 | * FAA disable response | ||
983 | */ | ||
984 | static void | ||
985 | bfa_faa_disable_reply(struct bfa_iocfc_s *iocfc, | ||
986 | struct bfi_faa_en_dis_rsp_s *rsp) | ||
987 | { | ||
988 | void *cbarg = iocfc->faa_args.faa_cb.faa_cbarg; | ||
989 | bfa_status_t status = rsp->status; | ||
990 | |||
991 | WARN_ON(!iocfc->faa_args.faa_cb.faa_cbfn); | ||
992 | |||
993 | iocfc->faa_args.faa_cb.faa_cbfn(cbarg, status); | ||
994 | iocfc->faa_args.busy = BFA_FALSE; | ||
995 | } | ||
996 | |||
997 | /* | ||
1393 | * FAA query response | 998 | * FAA query response |
1394 | */ | 999 | */ |
1395 | static void | 1000 | static void |
@@ -1418,10 +1023,25 @@ bfa_iocfc_enable_cbfn(void *bfa_arg, enum bfa_status status) | |||
1418 | { | 1023 | { |
1419 | struct bfa_s *bfa = bfa_arg; | 1024 | struct bfa_s *bfa = bfa_arg; |
1420 | 1025 | ||
1421 | if (status == BFA_STATUS_OK) | 1026 | if (status == BFA_STATUS_FAA_ACQ_ADDR) { |
1422 | bfa_fsm_send_event(&bfa->iocfc, IOCFC_E_IOC_ENABLED); | 1027 | bfa_cb_queue(bfa, &bfa->iocfc.init_hcb_qe, |
1423 | else | 1028 | bfa_iocfc_init_cb, bfa); |
1424 | bfa_fsm_send_event(&bfa->iocfc, IOCFC_E_IOC_FAILED); | 1029 | return; |
1030 | } | ||
1031 | |||
1032 | if (status != BFA_STATUS_OK) { | ||
1033 | bfa_isr_disable(bfa); | ||
1034 | if (bfa->iocfc.action == BFA_IOCFC_ACT_INIT) | ||
1035 | bfa_cb_queue(bfa, &bfa->iocfc.init_hcb_qe, | ||
1036 | bfa_iocfc_init_cb, bfa); | ||
1037 | else if (bfa->iocfc.action == BFA_IOCFC_ACT_ENABLE) | ||
1038 | bfa_cb_queue(bfa, &bfa->iocfc.en_hcb_qe, | ||
1039 | bfa_iocfc_enable_cb, bfa); | ||
1040 | return; | ||
1041 | } | ||
1042 | |||
1043 | bfa_iocfc_send_cfg(bfa); | ||
1044 | bfa_dconf_modinit(bfa); | ||
1425 | } | 1045 | } |
1426 | 1046 | ||
1427 | /* | 1047 | /* |
@@ -1432,7 +1052,17 @@ bfa_iocfc_disable_cbfn(void *bfa_arg) | |||
1432 | { | 1052 | { |
1433 | struct bfa_s *bfa = bfa_arg; | 1053 | struct bfa_s *bfa = bfa_arg; |
1434 | 1054 | ||
1435 | bfa_fsm_send_event(&bfa->iocfc, IOCFC_E_IOC_DISABLED); | 1055 | bfa_isr_disable(bfa); |
1056 | bfa_iocfc_disable_submod(bfa); | ||
1057 | |||
1058 | if (bfa->iocfc.action == BFA_IOCFC_ACT_STOP) | ||
1059 | bfa_cb_queue(bfa, &bfa->iocfc.stop_hcb_qe, bfa_iocfc_stop_cb, | ||
1060 | bfa); | ||
1061 | else { | ||
1062 | WARN_ON(bfa->iocfc.action != BFA_IOCFC_ACT_DISABLE); | ||
1063 | bfa_cb_queue(bfa, &bfa->iocfc.dis_hcb_qe, bfa_iocfc_disable_cb, | ||
1064 | bfa); | ||
1065 | } | ||
1436 | } | 1066 | } |
1437 | 1067 | ||
1438 | /* | 1068 | /* |
@@ -1444,7 +1074,13 @@ bfa_iocfc_hbfail_cbfn(void *bfa_arg) | |||
1444 | struct bfa_s *bfa = bfa_arg; | 1074 | struct bfa_s *bfa = bfa_arg; |
1445 | 1075 | ||
1446 | bfa->queue_process = BFA_FALSE; | 1076 | bfa->queue_process = BFA_FALSE; |
1447 | bfa_fsm_send_event(&bfa->iocfc, IOCFC_E_IOC_FAILED); | 1077 | |
1078 | bfa_isr_disable(bfa); | ||
1079 | bfa_iocfc_disable_submod(bfa); | ||
1080 | |||
1081 | if (bfa->iocfc.action == BFA_IOCFC_ACT_INIT) | ||
1082 | bfa_cb_queue(bfa, &bfa->iocfc.init_hcb_qe, bfa_iocfc_init_cb, | ||
1083 | bfa); | ||
1448 | } | 1084 | } |
1449 | 1085 | ||
1450 | /* | 1086 | /* |
@@ -1459,6 +1095,7 @@ bfa_iocfc_reset_cbfn(void *bfa_arg) | |||
1459 | bfa_isr_enable(bfa); | 1095 | bfa_isr_enable(bfa); |
1460 | } | 1096 | } |
1461 | 1097 | ||
1098 | |||
1462 | /* | 1099 | /* |
1463 | * Query IOC memory requirement information. | 1100 | * Query IOC memory requirement information. |
1464 | */ | 1101 | */ |
@@ -1502,7 +1139,8 @@ bfa_iocfc_meminfo(struct bfa_iocfc_cfg_s *cfg, struct bfa_meminfo_s *meminfo, | |||
1502 | bfa_mem_dma_setup(meminfo, iocfc_dma, dm_len); | 1139 | bfa_mem_dma_setup(meminfo, iocfc_dma, dm_len); |
1503 | 1140 | ||
1504 | /* kva memory setup for IOCFC */ | 1141 | /* kva memory setup for IOCFC */ |
1505 | bfa_mem_kva_setup(meminfo, iocfc_kva, BFA_DBG_FWTRC_LEN); | 1142 | bfa_mem_kva_setup(meminfo, iocfc_kva, |
1143 | ((bfa_auto_recover) ? BFA_DBG_FWTRC_LEN : 0)); | ||
1506 | } | 1144 | } |
1507 | 1145 | ||
1508 | /* | 1146 | /* |
@@ -1533,12 +1171,6 @@ bfa_iocfc_attach(struct bfa_s *bfa, void *bfad, struct bfa_iocfc_cfg_s *cfg, | |||
1533 | INIT_LIST_HEAD(&bfa->comp_q); | 1171 | INIT_LIST_HEAD(&bfa->comp_q); |
1534 | for (i = 0; i < BFI_IOC_MAX_CQS; i++) | 1172 | for (i = 0; i < BFI_IOC_MAX_CQS; i++) |
1535 | INIT_LIST_HEAD(&bfa->reqq_waitq[i]); | 1173 | INIT_LIST_HEAD(&bfa->reqq_waitq[i]); |
1536 | |||
1537 | bfa->iocfc.cb_reqd = BFA_FALSE; | ||
1538 | bfa->iocfc.op_status = BFA_STATUS_OK; | ||
1539 | bfa->iocfc.submod_enabled = BFA_FALSE; | ||
1540 | |||
1541 | bfa_fsm_set_state(&bfa->iocfc, bfa_iocfc_sm_stopped); | ||
1542 | } | 1174 | } |
1543 | 1175 | ||
1544 | /* | 1176 | /* |
@@ -1547,7 +1179,8 @@ bfa_iocfc_attach(struct bfa_s *bfa, void *bfad, struct bfa_iocfc_cfg_s *cfg, | |||
1547 | void | 1179 | void |
1548 | bfa_iocfc_init(struct bfa_s *bfa) | 1180 | bfa_iocfc_init(struct bfa_s *bfa) |
1549 | { | 1181 | { |
1550 | bfa_fsm_send_event(&bfa->iocfc, IOCFC_E_INIT); | 1182 | bfa->iocfc.action = BFA_IOCFC_ACT_INIT; |
1183 | bfa_ioc_enable(&bfa->ioc); | ||
1551 | } | 1184 | } |
1552 | 1185 | ||
1553 | /* | 1186 | /* |
@@ -1557,7 +1190,8 @@ bfa_iocfc_init(struct bfa_s *bfa) | |||
1557 | void | 1190 | void |
1558 | bfa_iocfc_start(struct bfa_s *bfa) | 1191 | bfa_iocfc_start(struct bfa_s *bfa) |
1559 | { | 1192 | { |
1560 | bfa_fsm_send_event(&bfa->iocfc, IOCFC_E_START); | 1193 | if (bfa->iocfc.cfgdone) |
1194 | bfa_iocfc_start_submod(bfa); | ||
1561 | } | 1195 | } |
1562 | 1196 | ||
1563 | /* | 1197 | /* |
@@ -1567,8 +1201,12 @@ bfa_iocfc_start(struct bfa_s *bfa) | |||
1567 | void | 1201 | void |
1568 | bfa_iocfc_stop(struct bfa_s *bfa) | 1202 | bfa_iocfc_stop(struct bfa_s *bfa) |
1569 | { | 1203 | { |
1204 | bfa->iocfc.action = BFA_IOCFC_ACT_STOP; | ||
1205 | |||
1570 | bfa->queue_process = BFA_FALSE; | 1206 | bfa->queue_process = BFA_FALSE; |
1571 | bfa_fsm_send_event(&bfa->iocfc, IOCFC_E_STOP); | 1207 | bfa_dconf_modexit(bfa); |
1208 | if (BFA_DCONF_MOD(bfa)->flashdone == BFA_TRUE) | ||
1209 | bfa_ioc_disable(&bfa->ioc); | ||
1572 | } | 1210 | } |
1573 | 1211 | ||
1574 | void | 1212 | void |
@@ -1588,9 +1226,13 @@ bfa_iocfc_isr(void *bfaarg, struct bfi_mbmsg_s *m) | |||
1588 | case BFI_IOCFC_I2H_UPDATEQ_RSP: | 1226 | case BFI_IOCFC_I2H_UPDATEQ_RSP: |
1589 | iocfc->updateq_cbfn(iocfc->updateq_cbarg, BFA_STATUS_OK); | 1227 | iocfc->updateq_cbfn(iocfc->updateq_cbarg, BFA_STATUS_OK); |
1590 | break; | 1228 | break; |
1591 | case BFI_IOCFC_I2H_ADDR_MSG: | 1229 | case BFI_IOCFC_I2H_FAA_ENABLE_RSP: |
1592 | bfa_iocfc_process_faa_addr(bfa, | 1230 | bfa_faa_enable_reply(iocfc, |
1593 | (struct bfi_faa_addr_msg_s *)msg); | 1231 | (struct bfi_faa_en_dis_rsp_s *)msg); |
1232 | break; | ||
1233 | case BFI_IOCFC_I2H_FAA_DISABLE_RSP: | ||
1234 | bfa_faa_disable_reply(iocfc, | ||
1235 | (struct bfi_faa_en_dis_rsp_s *)msg); | ||
1594 | break; | 1236 | break; |
1595 | case BFI_IOCFC_I2H_FAA_QUERY_RSP: | 1237 | case BFI_IOCFC_I2H_FAA_QUERY_RSP: |
1596 | bfa_faa_query_reply(iocfc, (bfi_faa_query_rsp_t *)msg); | 1238 | bfa_faa_query_reply(iocfc, (bfi_faa_query_rsp_t *)msg); |
@@ -1664,8 +1306,8 @@ bfa_iocfc_enable(struct bfa_s *bfa) | |||
1664 | { | 1306 | { |
1665 | bfa_plog_str(bfa->plog, BFA_PL_MID_HAL, BFA_PL_EID_MISC, 0, | 1307 | bfa_plog_str(bfa->plog, BFA_PL_MID_HAL, BFA_PL_EID_MISC, 0, |
1666 | "IOC Enable"); | 1308 | "IOC Enable"); |
1667 | bfa->iocfc.cb_reqd = BFA_TRUE; | 1309 | bfa->iocfc.action = BFA_IOCFC_ACT_ENABLE; |
1668 | bfa_fsm_send_event(&bfa->iocfc, IOCFC_E_ENABLE); | 1310 | bfa_ioc_enable(&bfa->ioc); |
1669 | } | 1311 | } |
1670 | 1312 | ||
1671 | void | 1313 | void |
@@ -1673,16 +1315,17 @@ bfa_iocfc_disable(struct bfa_s *bfa) | |||
1673 | { | 1315 | { |
1674 | bfa_plog_str(bfa->plog, BFA_PL_MID_HAL, BFA_PL_EID_MISC, 0, | 1316 | bfa_plog_str(bfa->plog, BFA_PL_MID_HAL, BFA_PL_EID_MISC, 0, |
1675 | "IOC Disable"); | 1317 | "IOC Disable"); |
1318 | bfa->iocfc.action = BFA_IOCFC_ACT_DISABLE; | ||
1676 | 1319 | ||
1677 | bfa->queue_process = BFA_FALSE; | 1320 | bfa->queue_process = BFA_FALSE; |
1678 | bfa_fsm_send_event(&bfa->iocfc, IOCFC_E_DISABLE); | 1321 | bfa_ioc_disable(&bfa->ioc); |
1679 | } | 1322 | } |
1680 | 1323 | ||
1324 | |||
1681 | bfa_boolean_t | 1325 | bfa_boolean_t |
1682 | bfa_iocfc_is_operational(struct bfa_s *bfa) | 1326 | bfa_iocfc_is_operational(struct bfa_s *bfa) |
1683 | { | 1327 | { |
1684 | return bfa_ioc_is_operational(&bfa->ioc) && | 1328 | return bfa_ioc_is_operational(&bfa->ioc) && bfa->iocfc.cfgdone; |
1685 | bfa_fsm_cmp_state(&bfa->iocfc, bfa_iocfc_sm_operational); | ||
1686 | } | 1329 | } |
1687 | 1330 | ||
1688 | /* | 1331 | /* |
@@ -1762,7 +1405,6 @@ bfa_cfg_get_meminfo(struct bfa_iocfc_cfg_s *cfg, struct bfa_meminfo_s *meminfo, | |||
1762 | struct bfa_mem_dma_s *flash_dma = BFA_MEM_FLASH_DMA(bfa); | 1405 | struct bfa_mem_dma_s *flash_dma = BFA_MEM_FLASH_DMA(bfa); |
1763 | struct bfa_mem_dma_s *diag_dma = BFA_MEM_DIAG_DMA(bfa); | 1406 | struct bfa_mem_dma_s *diag_dma = BFA_MEM_DIAG_DMA(bfa); |
1764 | struct bfa_mem_dma_s *phy_dma = BFA_MEM_PHY_DMA(bfa); | 1407 | struct bfa_mem_dma_s *phy_dma = BFA_MEM_PHY_DMA(bfa); |
1765 | struct bfa_mem_dma_s *fru_dma = BFA_MEM_FRU_DMA(bfa); | ||
1766 | 1408 | ||
1767 | WARN_ON((cfg == NULL) || (meminfo == NULL)); | 1409 | WARN_ON((cfg == NULL) || (meminfo == NULL)); |
1768 | 1410 | ||
@@ -1787,8 +1429,6 @@ bfa_cfg_get_meminfo(struct bfa_iocfc_cfg_s *cfg, struct bfa_meminfo_s *meminfo, | |||
1787 | bfa_mem_dma_setup(meminfo, diag_dma, bfa_diag_meminfo()); | 1429 | bfa_mem_dma_setup(meminfo, diag_dma, bfa_diag_meminfo()); |
1788 | bfa_mem_dma_setup(meminfo, phy_dma, | 1430 | bfa_mem_dma_setup(meminfo, phy_dma, |
1789 | bfa_phy_meminfo(cfg->drvcfg.min_cfg)); | 1431 | bfa_phy_meminfo(cfg->drvcfg.min_cfg)); |
1790 | bfa_mem_dma_setup(meminfo, fru_dma, | ||
1791 | bfa_fru_meminfo(cfg->drvcfg.min_cfg)); | ||
1792 | } | 1432 | } |
1793 | 1433 | ||
1794 | /* | 1434 | /* |
@@ -1861,7 +1501,6 @@ bfa_attach(struct bfa_s *bfa, void *bfad, struct bfa_iocfc_cfg_s *cfg, | |||
1861 | bfa_com_flash_attach(bfa, cfg->drvcfg.min_cfg); | 1501 | bfa_com_flash_attach(bfa, cfg->drvcfg.min_cfg); |
1862 | bfa_com_diag_attach(bfa); | 1502 | bfa_com_diag_attach(bfa); |
1863 | bfa_com_phy_attach(bfa, cfg->drvcfg.min_cfg); | 1503 | bfa_com_phy_attach(bfa, cfg->drvcfg.min_cfg); |
1864 | bfa_com_fru_attach(bfa, cfg->drvcfg.min_cfg); | ||
1865 | } | 1504 | } |
1866 | 1505 | ||
1867 | /* | 1506 | /* |
@@ -1928,6 +1567,16 @@ bfa_comp_free(struct bfa_s *bfa, struct list_head *comp_q) | |||
1928 | } | 1567 | } |
1929 | } | 1568 | } |
1930 | 1569 | ||
1570 | void | ||
1571 | bfa_iocfc_cb_dconf_modinit(struct bfa_s *bfa, bfa_status_t status) | ||
1572 | { | ||
1573 | if (bfa->iocfc.action == BFA_IOCFC_ACT_INIT) { | ||
1574 | if (bfa->iocfc.cfgdone == BFA_TRUE) | ||
1575 | bfa_cb_queue(bfa, &bfa->iocfc.init_hcb_qe, | ||
1576 | bfa_iocfc_init_cb, bfa); | ||
1577 | } | ||
1578 | } | ||
1579 | |||
1931 | /* | 1580 | /* |
1932 | * Return the list of PCI vendor/device id lists supported by this | 1581 | * Return the list of PCI vendor/device id lists supported by this |
1933 | * BFA instance. | 1582 | * BFA instance. |