diff options
author | Krishna Gudipati <kgudipat@brocade.com> | 2011-07-20 20:03:46 -0400 |
---|---|---|
committer | James Bottomley <JBottomley@Parallels.com> | 2011-07-27 06:54:03 -0400 |
commit | 45c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1 (patch) | |
tree | d0a5f76929e47c6876f6db5b9a03a1d60c2d9b62 /drivers/scsi | |
parent | c0350bf57445b9e2a4369668127ecc4431472d26 (diff) |
[SCSI] bfa: Add support to store driver configuration in flash.
- Added dconf (Driver Config) BFA sub-module.
- The dconf sub-module provides interfaces and manages flash writes
to the flash DRV parition.
- dconf sub-module also ensures that the whole 64K DRV partition is updated
on a flash write.
Signed-off-by: Krishna Gudipati <kgudipat@brocade.com>
Signed-off-by: James Bottomley <JBottomley@Parallels.com>
Diffstat (limited to 'drivers/scsi')
-rw-r--r-- | drivers/scsi/bfa/bfa.h | 1 | ||||
-rw-r--r-- | drivers/scsi/bfa/bfa_core.c | 25 | ||||
-rw-r--r-- | drivers/scsi/bfa/bfa_defs_svc.h | 21 | ||||
-rw-r--r-- | drivers/scsi/bfa/bfa_fc.h | 1 | ||||
-rw-r--r-- | drivers/scsi/bfa/bfa_ioc.c | 393 | ||||
-rw-r--r-- | drivers/scsi/bfa/bfa_ioc.h | 44 | ||||
-rw-r--r-- | drivers/scsi/bfa/bfa_modules.h | 2 |
7 files changed, 481 insertions, 6 deletions
diff --git a/drivers/scsi/bfa/bfa.h b/drivers/scsi/bfa/bfa.h index 32f46265daa5..76300befffbe 100644 --- a/drivers/scsi/bfa/bfa.h +++ b/drivers/scsi/bfa/bfa.h | |||
@@ -412,6 +412,7 @@ bfa_status_t bfa_iocfc_israttr_set(struct bfa_s *bfa, | |||
412 | 412 | ||
413 | void bfa_iocfc_enable(struct bfa_s *bfa); | 413 | void bfa_iocfc_enable(struct bfa_s *bfa); |
414 | void bfa_iocfc_disable(struct bfa_s *bfa); | 414 | void bfa_iocfc_disable(struct bfa_s *bfa); |
415 | void bfa_iocfc_cb_dconf_modinit(struct bfa_s *bfa, bfa_status_t status); | ||
415 | #define bfa_timer_start(_bfa, _timer, _timercb, _arg, _timeout) \ | 416 | #define bfa_timer_start(_bfa, _timer, _timercb, _arg, _timeout) \ |
416 | bfa_timer_begin(&(_bfa)->timer_mod, _timer, _timercb, _arg, _timeout) | 417 | bfa_timer_begin(&(_bfa)->timer_mod, _timer, _timercb, _arg, _timeout) |
417 | 418 | ||
diff --git a/drivers/scsi/bfa/bfa_core.c b/drivers/scsi/bfa/bfa_core.c index 4613bddd58e4..4bd546bcc240 100644 --- a/drivers/scsi/bfa/bfa_core.c +++ b/drivers/scsi/bfa/bfa_core.c | |||
@@ -33,6 +33,7 @@ static struct bfa_module_s *hal_mods[] = { | |||
33 | &hal_mod_uf, | 33 | &hal_mod_uf, |
34 | &hal_mod_rport, | 34 | &hal_mod_rport, |
35 | &hal_mod_fcp, | 35 | &hal_mod_fcp, |
36 | &hal_mod_dconf, | ||
36 | NULL | 37 | NULL |
37 | }; | 38 | }; |
38 | 39 | ||
@@ -702,7 +703,7 @@ bfa_iocfc_init_cb(void *bfa_arg, bfa_boolean_t complete) | |||
702 | struct bfa_s *bfa = bfa_arg; | 703 | struct bfa_s *bfa = bfa_arg; |
703 | 704 | ||
704 | if (complete) { | 705 | if (complete) { |
705 | if (bfa->iocfc.cfgdone) | 706 | if (bfa->iocfc.cfgdone && BFA_DCONF_MOD(bfa)->flashdone) |
706 | bfa_cb_init(bfa->bfad, BFA_STATUS_OK); | 707 | bfa_cb_init(bfa->bfad, BFA_STATUS_OK); |
707 | else | 708 | else |
708 | bfa_cb_init(bfa->bfad, BFA_STATUS_FAILED); | 709 | bfa_cb_init(bfa->bfad, BFA_STATUS_FAILED); |
@@ -815,9 +816,11 @@ bfa_iocfc_cfgrsp(struct bfa_s *bfa) | |||
815 | */ | 816 | */ |
816 | bfa_fcport_init(bfa); | 817 | bfa_fcport_init(bfa); |
817 | 818 | ||
818 | if (iocfc->action == BFA_IOCFC_ACT_INIT) | 819 | if (iocfc->action == BFA_IOCFC_ACT_INIT) { |
819 | bfa_cb_queue(bfa, &iocfc->init_hcb_qe, bfa_iocfc_init_cb, bfa); | 820 | if (BFA_DCONF_MOD(bfa)->flashdone == BFA_TRUE) |
820 | else { | 821 | bfa_cb_queue(bfa, &iocfc->init_hcb_qe, |
822 | bfa_iocfc_init_cb, bfa); | ||
823 | } else { | ||
821 | if (bfa->iocfc.action == BFA_IOCFC_ACT_ENABLE) | 824 | if (bfa->iocfc.action == BFA_IOCFC_ACT_ENABLE) |
822 | bfa_cb_queue(bfa, &bfa->iocfc.en_hcb_qe, | 825 | bfa_cb_queue(bfa, &bfa->iocfc.en_hcb_qe, |
823 | bfa_iocfc_enable_cb, bfa); | 826 | bfa_iocfc_enable_cb, bfa); |
@@ -1038,6 +1041,7 @@ bfa_iocfc_enable_cbfn(void *bfa_arg, enum bfa_status status) | |||
1038 | } | 1041 | } |
1039 | 1042 | ||
1040 | bfa_iocfc_send_cfg(bfa); | 1043 | bfa_iocfc_send_cfg(bfa); |
1044 | bfa_dconf_modinit(bfa); | ||
1041 | } | 1045 | } |
1042 | 1046 | ||
1043 | /* | 1047 | /* |
@@ -1200,7 +1204,9 @@ bfa_iocfc_stop(struct bfa_s *bfa) | |||
1200 | bfa->iocfc.action = BFA_IOCFC_ACT_STOP; | 1204 | bfa->iocfc.action = BFA_IOCFC_ACT_STOP; |
1201 | 1205 | ||
1202 | bfa->queue_process = BFA_FALSE; | 1206 | bfa->queue_process = BFA_FALSE; |
1203 | bfa_ioc_disable(&bfa->ioc); | 1207 | bfa_dconf_modexit(bfa); |
1208 | if (BFA_DCONF_MOD(bfa)->flashdone == BFA_TRUE) | ||
1209 | bfa_ioc_disable(&bfa->ioc); | ||
1204 | } | 1210 | } |
1205 | 1211 | ||
1206 | void | 1212 | void |
@@ -1561,6 +1567,15 @@ bfa_comp_free(struct bfa_s *bfa, struct list_head *comp_q) | |||
1561 | } | 1567 | } |
1562 | } | 1568 | } |
1563 | 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 | } | ||
1564 | 1579 | ||
1565 | /* | 1580 | /* |
1566 | * 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 |
diff --git a/drivers/scsi/bfa/bfa_defs_svc.h b/drivers/scsi/bfa/bfa_defs_svc.h index 263438bd8b6e..202cb692f981 100644 --- a/drivers/scsi/bfa/bfa_defs_svc.h +++ b/drivers/scsi/bfa/bfa_defs_svc.h | |||
@@ -789,6 +789,27 @@ enum bfa_port_linkstate_rsn { | |||
789 | }; | 789 | }; |
790 | #pragma pack(1) | 790 | #pragma pack(1) |
791 | /* | 791 | /* |
792 | * LUN mask configuration | ||
793 | */ | ||
794 | struct bfa_lun_mask_s { | ||
795 | wwn_t lp_wwn; | ||
796 | wwn_t rp_wwn; | ||
797 | lun_t lun; | ||
798 | u8 ua; | ||
799 | u8 rsvd[3]; | ||
800 | u16 rp_tag; | ||
801 | u8 lp_tag; | ||
802 | u8 state; | ||
803 | }; | ||
804 | |||
805 | #define MAX_LUN_MASK_CFG 16 | ||
806 | struct bfa_lunmask_cfg_s { | ||
807 | u32 status; | ||
808 | u32 rsvd; | ||
809 | struct bfa_lun_mask_s lun_list[MAX_LUN_MASK_CFG]; | ||
810 | }; | ||
811 | |||
812 | /* | ||
792 | * Physical port configuration | 813 | * Physical port configuration |
793 | */ | 814 | */ |
794 | struct bfa_port_cfg_s { | 815 | struct bfa_port_cfg_s { |
diff --git a/drivers/scsi/bfa/bfa_fc.h b/drivers/scsi/bfa/bfa_fc.h index 8d0b88f67a38..a007345e472a 100644 --- a/drivers/scsi/bfa/bfa_fc.h +++ b/drivers/scsi/bfa/bfa_fc.h | |||
@@ -21,6 +21,7 @@ | |||
21 | #include "bfad_drv.h" | 21 | #include "bfad_drv.h" |
22 | 22 | ||
23 | typedef u64 wwn_t; | 23 | typedef u64 wwn_t; |
24 | typedef u64 lun_t; | ||
24 | 25 | ||
25 | #define WWN_NULL (0) | 26 | #define WWN_NULL (0) |
26 | #define FC_SYMNAME_MAX 256 /* max name server symbolic name size */ | 27 | #define FC_SYMNAME_MAX 256 /* max name server symbolic name size */ |
diff --git a/drivers/scsi/bfa/bfa_ioc.c b/drivers/scsi/bfa/bfa_ioc.c index 27c5565ba2c3..1ac5aecf25a6 100644 --- a/drivers/scsi/bfa/bfa_ioc.c +++ b/drivers/scsi/bfa/bfa_ioc.c | |||
@@ -5588,3 +5588,396 @@ bfa_phy_intr(void *phyarg, struct bfi_mbmsg_s *msg) | |||
5588 | WARN_ON(1); | 5588 | WARN_ON(1); |
5589 | } | 5589 | } |
5590 | } | 5590 | } |
5591 | |||
5592 | /* | ||
5593 | * DCONF module specific | ||
5594 | */ | ||
5595 | |||
5596 | BFA_MODULE(dconf); | ||
5597 | |||
5598 | /* | ||
5599 | * DCONF state machine events | ||
5600 | */ | ||
5601 | enum bfa_dconf_event { | ||
5602 | BFA_DCONF_SM_INIT = 1, /* dconf Init */ | ||
5603 | BFA_DCONF_SM_FLASH_COMP = 2, /* read/write to flash */ | ||
5604 | BFA_DCONF_SM_WR = 3, /* binding change, map */ | ||
5605 | BFA_DCONF_SM_TIMEOUT = 4, /* Start timer */ | ||
5606 | BFA_DCONF_SM_EXIT = 5, /* exit dconf module */ | ||
5607 | BFA_DCONF_SM_IOCDISABLE = 6, /* IOC disable event */ | ||
5608 | }; | ||
5609 | |||
5610 | /* forward declaration of DCONF state machine */ | ||
5611 | static void bfa_dconf_sm_uninit(struct bfa_dconf_mod_s *dconf, | ||
5612 | enum bfa_dconf_event event); | ||
5613 | static void bfa_dconf_sm_flash_read(struct bfa_dconf_mod_s *dconf, | ||
5614 | enum bfa_dconf_event event); | ||
5615 | static void bfa_dconf_sm_ready(struct bfa_dconf_mod_s *dconf, | ||
5616 | enum bfa_dconf_event event); | ||
5617 | static void bfa_dconf_sm_dirty(struct bfa_dconf_mod_s *dconf, | ||
5618 | enum bfa_dconf_event event); | ||
5619 | static void bfa_dconf_sm_sync(struct bfa_dconf_mod_s *dconf, | ||
5620 | enum bfa_dconf_event event); | ||
5621 | static void bfa_dconf_sm_final_sync(struct bfa_dconf_mod_s *dconf, | ||
5622 | enum bfa_dconf_event event); | ||
5623 | static void bfa_dconf_sm_iocdown_dirty(struct bfa_dconf_mod_s *dconf, | ||
5624 | enum bfa_dconf_event event); | ||
5625 | |||
5626 | static void bfa_dconf_cbfn(void *dconf, bfa_status_t status); | ||
5627 | static void bfa_dconf_timer(void *cbarg); | ||
5628 | static bfa_status_t bfa_dconf_flash_write(struct bfa_dconf_mod_s *dconf); | ||
5629 | static void bfa_dconf_init_cb(void *arg, bfa_status_t status); | ||
5630 | |||
5631 | /* | ||
5632 | * Begining state of dconf module. Waiting for an event to start. | ||
5633 | */ | ||
5634 | static void | ||
5635 | bfa_dconf_sm_uninit(struct bfa_dconf_mod_s *dconf, enum bfa_dconf_event event) | ||
5636 | { | ||
5637 | bfa_status_t bfa_status; | ||
5638 | bfa_trc(dconf->bfa, event); | ||
5639 | |||
5640 | switch (event) { | ||
5641 | case BFA_DCONF_SM_INIT: | ||
5642 | if (dconf->min_cfg) { | ||
5643 | bfa_trc(dconf->bfa, dconf->min_cfg); | ||
5644 | return; | ||
5645 | } | ||
5646 | bfa_sm_set_state(dconf, bfa_dconf_sm_flash_read); | ||
5647 | dconf->flashdone = BFA_FALSE; | ||
5648 | bfa_trc(dconf->bfa, dconf->flashdone); | ||
5649 | bfa_status = bfa_flash_read_part(BFA_FLASH(dconf->bfa), | ||
5650 | BFA_FLASH_PART_DRV, dconf->instance, | ||
5651 | dconf->dconf, | ||
5652 | sizeof(struct bfa_dconf_s), 0, | ||
5653 | bfa_dconf_init_cb, dconf->bfa); | ||
5654 | if (bfa_status != BFA_STATUS_OK) { | ||
5655 | bfa_dconf_init_cb(dconf->bfa, BFA_STATUS_FAILED); | ||
5656 | bfa_sm_set_state(dconf, bfa_dconf_sm_uninit); | ||
5657 | return; | ||
5658 | } | ||
5659 | break; | ||
5660 | case BFA_DCONF_SM_EXIT: | ||
5661 | dconf->flashdone = BFA_TRUE; | ||
5662 | case BFA_DCONF_SM_IOCDISABLE: | ||
5663 | case BFA_DCONF_SM_WR: | ||
5664 | case BFA_DCONF_SM_FLASH_COMP: | ||
5665 | break; | ||
5666 | default: | ||
5667 | bfa_sm_fault(dconf->bfa, event); | ||
5668 | } | ||
5669 | } | ||
5670 | |||
5671 | /* | ||
5672 | * Read flash for dconf entries and make a call back to the driver once done. | ||
5673 | */ | ||
5674 | static void | ||
5675 | bfa_dconf_sm_flash_read(struct bfa_dconf_mod_s *dconf, | ||
5676 | enum bfa_dconf_event event) | ||
5677 | { | ||
5678 | bfa_trc(dconf->bfa, event); | ||
5679 | |||
5680 | switch (event) { | ||
5681 | case BFA_DCONF_SM_FLASH_COMP: | ||
5682 | bfa_sm_set_state(dconf, bfa_dconf_sm_ready); | ||
5683 | break; | ||
5684 | case BFA_DCONF_SM_TIMEOUT: | ||
5685 | bfa_sm_set_state(dconf, bfa_dconf_sm_ready); | ||
5686 | break; | ||
5687 | case BFA_DCONF_SM_EXIT: | ||
5688 | dconf->flashdone = BFA_TRUE; | ||
5689 | bfa_trc(dconf->bfa, dconf->flashdone); | ||
5690 | case BFA_DCONF_SM_IOCDISABLE: | ||
5691 | bfa_sm_set_state(dconf, bfa_dconf_sm_uninit); | ||
5692 | break; | ||
5693 | default: | ||
5694 | bfa_sm_fault(dconf->bfa, event); | ||
5695 | } | ||
5696 | } | ||
5697 | |||
5698 | /* | ||
5699 | * DCONF Module is in ready state. Has completed the initialization. | ||
5700 | */ | ||
5701 | static void | ||
5702 | bfa_dconf_sm_ready(struct bfa_dconf_mod_s *dconf, enum bfa_dconf_event event) | ||
5703 | { | ||
5704 | bfa_trc(dconf->bfa, event); | ||
5705 | |||
5706 | switch (event) { | ||
5707 | case BFA_DCONF_SM_WR: | ||
5708 | bfa_timer_start(dconf->bfa, &dconf->timer, | ||
5709 | bfa_dconf_timer, dconf, BFA_DCONF_UPDATE_TOV); | ||
5710 | bfa_sm_set_state(dconf, bfa_dconf_sm_dirty); | ||
5711 | break; | ||
5712 | case BFA_DCONF_SM_EXIT: | ||
5713 | dconf->flashdone = BFA_TRUE; | ||
5714 | bfa_trc(dconf->bfa, dconf->flashdone); | ||
5715 | bfa_sm_set_state(dconf, bfa_dconf_sm_uninit); | ||
5716 | break; | ||
5717 | case BFA_DCONF_SM_INIT: | ||
5718 | case BFA_DCONF_SM_IOCDISABLE: | ||
5719 | break; | ||
5720 | default: | ||
5721 | bfa_sm_fault(dconf->bfa, event); | ||
5722 | } | ||
5723 | } | ||
5724 | |||
5725 | /* | ||
5726 | * entries are dirty, write back to the flash. | ||
5727 | */ | ||
5728 | |||
5729 | static void | ||
5730 | bfa_dconf_sm_dirty(struct bfa_dconf_mod_s *dconf, enum bfa_dconf_event event) | ||
5731 | { | ||
5732 | bfa_trc(dconf->bfa, event); | ||
5733 | |||
5734 | switch (event) { | ||
5735 | case BFA_DCONF_SM_TIMEOUT: | ||
5736 | bfa_sm_set_state(dconf, bfa_dconf_sm_sync); | ||
5737 | bfa_dconf_flash_write(dconf); | ||
5738 | break; | ||
5739 | case BFA_DCONF_SM_WR: | ||
5740 | bfa_timer_stop(&dconf->timer); | ||
5741 | bfa_timer_start(dconf->bfa, &dconf->timer, | ||
5742 | bfa_dconf_timer, dconf, BFA_DCONF_UPDATE_TOV); | ||
5743 | break; | ||
5744 | case BFA_DCONF_SM_EXIT: | ||
5745 | bfa_timer_stop(&dconf->timer); | ||
5746 | bfa_timer_start(dconf->bfa, &dconf->timer, | ||
5747 | bfa_dconf_timer, dconf, BFA_DCONF_UPDATE_TOV); | ||
5748 | bfa_sm_set_state(dconf, bfa_dconf_sm_final_sync); | ||
5749 | bfa_dconf_flash_write(dconf); | ||
5750 | break; | ||
5751 | case BFA_DCONF_SM_FLASH_COMP: | ||
5752 | break; | ||
5753 | case BFA_DCONF_SM_IOCDISABLE: | ||
5754 | bfa_timer_stop(&dconf->timer); | ||
5755 | bfa_sm_set_state(dconf, bfa_dconf_sm_iocdown_dirty); | ||
5756 | break; | ||
5757 | default: | ||
5758 | bfa_sm_fault(dconf->bfa, event); | ||
5759 | } | ||
5760 | } | ||
5761 | |||
5762 | /* | ||
5763 | * Sync the dconf entries to the flash. | ||
5764 | */ | ||
5765 | static void | ||
5766 | bfa_dconf_sm_final_sync(struct bfa_dconf_mod_s *dconf, | ||
5767 | enum bfa_dconf_event event) | ||
5768 | { | ||
5769 | bfa_trc(dconf->bfa, event); | ||
5770 | |||
5771 | switch (event) { | ||
5772 | case BFA_DCONF_SM_IOCDISABLE: | ||
5773 | case BFA_DCONF_SM_FLASH_COMP: | ||
5774 | bfa_timer_stop(&dconf->timer); | ||
5775 | case BFA_DCONF_SM_TIMEOUT: | ||
5776 | bfa_sm_set_state(dconf, bfa_dconf_sm_uninit); | ||
5777 | dconf->flashdone = BFA_TRUE; | ||
5778 | bfa_trc(dconf->bfa, dconf->flashdone); | ||
5779 | bfa_ioc_disable(&dconf->bfa->ioc); | ||
5780 | break; | ||
5781 | default: | ||
5782 | bfa_sm_fault(dconf->bfa, event); | ||
5783 | } | ||
5784 | } | ||
5785 | |||
5786 | static void | ||
5787 | bfa_dconf_sm_sync(struct bfa_dconf_mod_s *dconf, enum bfa_dconf_event event) | ||
5788 | { | ||
5789 | bfa_trc(dconf->bfa, event); | ||
5790 | |||
5791 | switch (event) { | ||
5792 | case BFA_DCONF_SM_FLASH_COMP: | ||
5793 | bfa_sm_set_state(dconf, bfa_dconf_sm_ready); | ||
5794 | break; | ||
5795 | case BFA_DCONF_SM_WR: | ||
5796 | bfa_timer_start(dconf->bfa, &dconf->timer, | ||
5797 | bfa_dconf_timer, dconf, BFA_DCONF_UPDATE_TOV); | ||
5798 | bfa_sm_set_state(dconf, bfa_dconf_sm_dirty); | ||
5799 | break; | ||
5800 | case BFA_DCONF_SM_EXIT: | ||
5801 | bfa_timer_start(dconf->bfa, &dconf->timer, | ||
5802 | bfa_dconf_timer, dconf, BFA_DCONF_UPDATE_TOV); | ||
5803 | bfa_sm_set_state(dconf, bfa_dconf_sm_final_sync); | ||
5804 | break; | ||
5805 | case BFA_DCONF_SM_IOCDISABLE: | ||
5806 | bfa_sm_set_state(dconf, bfa_dconf_sm_iocdown_dirty); | ||
5807 | break; | ||
5808 | default: | ||
5809 | bfa_sm_fault(dconf->bfa, event); | ||
5810 | } | ||
5811 | } | ||
5812 | |||
5813 | static void | ||
5814 | bfa_dconf_sm_iocdown_dirty(struct bfa_dconf_mod_s *dconf, | ||
5815 | enum bfa_dconf_event event) | ||
5816 | { | ||
5817 | bfa_trc(dconf->bfa, event); | ||
5818 | |||
5819 | switch (event) { | ||
5820 | case BFA_DCONF_SM_INIT: | ||
5821 | bfa_timer_start(dconf->bfa, &dconf->timer, | ||
5822 | bfa_dconf_timer, dconf, BFA_DCONF_UPDATE_TOV); | ||
5823 | bfa_sm_set_state(dconf, bfa_dconf_sm_dirty); | ||
5824 | break; | ||
5825 | case BFA_DCONF_SM_EXIT: | ||
5826 | dconf->flashdone = BFA_TRUE; | ||
5827 | bfa_sm_set_state(dconf, bfa_dconf_sm_uninit); | ||
5828 | break; | ||
5829 | case BFA_DCONF_SM_IOCDISABLE: | ||
5830 | break; | ||
5831 | default: | ||
5832 | bfa_sm_fault(dconf->bfa, event); | ||
5833 | } | ||
5834 | } | ||
5835 | |||
5836 | /* | ||
5837 | * Compute and return memory needed by DRV_CFG module. | ||
5838 | */ | ||
5839 | static void | ||
5840 | bfa_dconf_meminfo(struct bfa_iocfc_cfg_s *cfg, struct bfa_meminfo_s *meminfo, | ||
5841 | struct bfa_s *bfa) | ||
5842 | { | ||
5843 | struct bfa_mem_kva_s *dconf_kva = BFA_MEM_DCONF_KVA(bfa); | ||
5844 | |||
5845 | if (cfg->drvcfg.min_cfg) | ||
5846 | bfa_mem_kva_setup(meminfo, dconf_kva, | ||
5847 | sizeof(struct bfa_dconf_hdr_s)); | ||
5848 | else | ||
5849 | bfa_mem_kva_setup(meminfo, dconf_kva, | ||
5850 | sizeof(struct bfa_dconf_s)); | ||
5851 | } | ||
5852 | |||
5853 | static void | ||
5854 | bfa_dconf_attach(struct bfa_s *bfa, void *bfad, struct bfa_iocfc_cfg_s *cfg, | ||
5855 | struct bfa_pcidev_s *pcidev) | ||
5856 | { | ||
5857 | struct bfa_dconf_mod_s *dconf = BFA_DCONF_MOD(bfa); | ||
5858 | |||
5859 | dconf->bfad = bfad; | ||
5860 | dconf->bfa = bfa; | ||
5861 | dconf->instance = bfa->ioc.port_id; | ||
5862 | bfa_trc(bfa, dconf->instance); | ||
5863 | |||
5864 | dconf->dconf = (struct bfa_dconf_s *) bfa_mem_kva_curp(dconf); | ||
5865 | if (cfg->drvcfg.min_cfg) { | ||
5866 | bfa_mem_kva_curp(dconf) += sizeof(struct bfa_dconf_hdr_s); | ||
5867 | dconf->min_cfg = BFA_TRUE; | ||
5868 | /* | ||
5869 | * Set the flashdone flag to TRUE explicitly as no flash | ||
5870 | * write will happen in min_cfg mode. | ||
5871 | */ | ||
5872 | dconf->flashdone = BFA_TRUE; | ||
5873 | } else { | ||
5874 | dconf->min_cfg = BFA_FALSE; | ||
5875 | bfa_mem_kva_curp(dconf) += sizeof(struct bfa_dconf_s); | ||
5876 | } | ||
5877 | |||
5878 | bfa_dconf_read_data_valid(bfa) = BFA_FALSE; | ||
5879 | bfa_sm_set_state(dconf, bfa_dconf_sm_uninit); | ||
5880 | } | ||
5881 | |||
5882 | static void | ||
5883 | bfa_dconf_init_cb(void *arg, bfa_status_t status) | ||
5884 | { | ||
5885 | struct bfa_s *bfa = arg; | ||
5886 | struct bfa_dconf_mod_s *dconf = BFA_DCONF_MOD(bfa); | ||
5887 | |||
5888 | dconf->flashdone = BFA_TRUE; | ||
5889 | bfa_trc(bfa, dconf->flashdone); | ||
5890 | bfa_iocfc_cb_dconf_modinit(bfa, status); | ||
5891 | if (status == BFA_STATUS_OK) { | ||
5892 | bfa_dconf_read_data_valid(bfa) = BFA_TRUE; | ||
5893 | if (dconf->dconf->hdr.signature != BFI_DCONF_SIGNATURE) | ||
5894 | dconf->dconf->hdr.signature = BFI_DCONF_SIGNATURE; | ||
5895 | if (dconf->dconf->hdr.version != BFI_DCONF_VERSION) | ||
5896 | dconf->dconf->hdr.version = BFI_DCONF_VERSION; | ||
5897 | } | ||
5898 | bfa_sm_send_event(dconf, BFA_DCONF_SM_FLASH_COMP); | ||
5899 | } | ||
5900 | |||
5901 | void | ||
5902 | bfa_dconf_modinit(struct bfa_s *bfa) | ||
5903 | { | ||
5904 | struct bfa_dconf_mod_s *dconf = BFA_DCONF_MOD(bfa); | ||
5905 | bfa_sm_send_event(dconf, BFA_DCONF_SM_INIT); | ||
5906 | } | ||
5907 | static void | ||
5908 | bfa_dconf_start(struct bfa_s *bfa) | ||
5909 | { | ||
5910 | } | ||
5911 | |||
5912 | static void | ||
5913 | bfa_dconf_stop(struct bfa_s *bfa) | ||
5914 | { | ||
5915 | } | ||
5916 | |||
5917 | static void bfa_dconf_timer(void *cbarg) | ||
5918 | { | ||
5919 | struct bfa_dconf_mod_s *dconf = cbarg; | ||
5920 | bfa_sm_send_event(dconf, BFA_DCONF_SM_TIMEOUT); | ||
5921 | } | ||
5922 | static void | ||
5923 | bfa_dconf_iocdisable(struct bfa_s *bfa) | ||
5924 | { | ||
5925 | struct bfa_dconf_mod_s *dconf = BFA_DCONF_MOD(bfa); | ||
5926 | bfa_sm_send_event(dconf, BFA_DCONF_SM_IOCDISABLE); | ||
5927 | } | ||
5928 | |||
5929 | static void | ||
5930 | bfa_dconf_detach(struct bfa_s *bfa) | ||
5931 | { | ||
5932 | } | ||
5933 | |||
5934 | static bfa_status_t | ||
5935 | bfa_dconf_flash_write(struct bfa_dconf_mod_s *dconf) | ||
5936 | { | ||
5937 | bfa_status_t bfa_status; | ||
5938 | bfa_trc(dconf->bfa, 0); | ||
5939 | |||
5940 | bfa_status = bfa_flash_update_part(BFA_FLASH(dconf->bfa), | ||
5941 | BFA_FLASH_PART_DRV, dconf->instance, | ||
5942 | dconf->dconf, sizeof(struct bfa_dconf_s), 0, | ||
5943 | bfa_dconf_cbfn, dconf); | ||
5944 | if (bfa_status != BFA_STATUS_OK) | ||
5945 | WARN_ON(bfa_status); | ||
5946 | bfa_trc(dconf->bfa, bfa_status); | ||
5947 | |||
5948 | return bfa_status; | ||
5949 | } | ||
5950 | |||
5951 | bfa_status_t | ||
5952 | bfa_dconf_update(struct bfa_s *bfa) | ||
5953 | { | ||
5954 | struct bfa_dconf_mod_s *dconf = BFA_DCONF_MOD(bfa); | ||
5955 | bfa_trc(dconf->bfa, 0); | ||
5956 | if (bfa_sm_cmp_state(dconf, bfa_dconf_sm_iocdown_dirty)) | ||
5957 | return BFA_STATUS_FAILED; | ||
5958 | |||
5959 | if (dconf->min_cfg) { | ||
5960 | bfa_trc(dconf->bfa, dconf->min_cfg); | ||
5961 | return BFA_STATUS_FAILED; | ||
5962 | } | ||
5963 | |||
5964 | bfa_sm_send_event(dconf, BFA_DCONF_SM_WR); | ||
5965 | return BFA_STATUS_OK; | ||
5966 | } | ||
5967 | |||
5968 | static void | ||
5969 | bfa_dconf_cbfn(void *arg, bfa_status_t status) | ||
5970 | { | ||
5971 | struct bfa_dconf_mod_s *dconf = arg; | ||
5972 | WARN_ON(status); | ||
5973 | bfa_sm_send_event(dconf, BFA_DCONF_SM_FLASH_COMP); | ||
5974 | } | ||
5975 | |||
5976 | void | ||
5977 | bfa_dconf_modexit(struct bfa_s *bfa) | ||
5978 | { | ||
5979 | struct bfa_dconf_mod_s *dconf = BFA_DCONF_MOD(bfa); | ||
5980 | BFA_DCONF_MOD(bfa)->flashdone = BFA_FALSE; | ||
5981 | bfa_trc(bfa, BFA_DCONF_MOD(bfa)->flashdone); | ||
5982 | bfa_sm_send_event(dconf, BFA_DCONF_SM_EXIT); | ||
5983 | } | ||
diff --git a/drivers/scsi/bfa/bfa_ioc.h b/drivers/scsi/bfa/bfa_ioc.h index a7463c955117..546d46b37101 100644 --- a/drivers/scsi/bfa/bfa_ioc.h +++ b/drivers/scsi/bfa/bfa_ioc.h | |||
@@ -661,7 +661,6 @@ struct bfa_phy_s { | |||
661 | struct bfa_ioc_notify_s ioc_notify; /* ioc event notify */ | 661 | struct bfa_ioc_notify_s ioc_notify; /* ioc event notify */ |
662 | struct bfa_mem_dma_s phy_dma; | 662 | struct bfa_mem_dma_s phy_dma; |
663 | }; | 663 | }; |
664 | |||
665 | #define BFA_PHY(__bfa) (&(__bfa)->modules.phy) | 664 | #define BFA_PHY(__bfa) (&(__bfa)->modules.phy) |
666 | #define BFA_MEM_PHY_DMA(__bfa) (&(BFA_PHY(__bfa)->phy_dma)) | 665 | #define BFA_MEM_PHY_DMA(__bfa) (&(BFA_PHY(__bfa)->phy_dma)) |
667 | 666 | ||
@@ -687,6 +686,49 @@ void bfa_phy_memclaim(struct bfa_phy_s *phy, | |||
687 | void bfa_phy_intr(void *phyarg, struct bfi_mbmsg_s *msg); | 686 | void bfa_phy_intr(void *phyarg, struct bfi_mbmsg_s *msg); |
688 | 687 | ||
689 | /* | 688 | /* |
689 | * Driver Config( dconf) specific | ||
690 | */ | ||
691 | #define BFI_DCONF_SIGNATURE 0xabcdabcd | ||
692 | #define BFI_DCONF_VERSION 1 | ||
693 | |||
694 | #pragma pack(1) | ||
695 | struct bfa_dconf_hdr_s { | ||
696 | u32 signature; | ||
697 | u32 version; | ||
698 | }; | ||
699 | |||
700 | struct bfa_dconf_s { | ||
701 | struct bfa_dconf_hdr_s hdr; | ||
702 | struct bfa_lunmask_cfg_s lun_mask; | ||
703 | }; | ||
704 | #pragma pack() | ||
705 | |||
706 | struct bfa_dconf_mod_s { | ||
707 | bfa_sm_t sm; | ||
708 | u8 instance; | ||
709 | bfa_boolean_t flashdone; | ||
710 | bfa_boolean_t read_data_valid; | ||
711 | bfa_boolean_t min_cfg; | ||
712 | struct bfa_timer_s timer; | ||
713 | struct bfa_s *bfa; | ||
714 | void *bfad; | ||
715 | void *trcmod; | ||
716 | struct bfa_dconf_s *dconf; | ||
717 | struct bfa_mem_kva_s kva_seg; | ||
718 | }; | ||
719 | |||
720 | #define BFA_DCONF_MOD(__bfa) \ | ||
721 | (&(__bfa)->modules.dconf_mod) | ||
722 | #define BFA_MEM_DCONF_KVA(__bfa) (&(BFA_DCONF_MOD(__bfa)->kva_seg)) | ||
723 | #define bfa_dconf_read_data_valid(__bfa) \ | ||
724 | (BFA_DCONF_MOD(__bfa)->read_data_valid) | ||
725 | #define BFA_DCONF_UPDATE_TOV 5000 /* memtest timeout in msec */ | ||
726 | |||
727 | void bfa_dconf_modinit(struct bfa_s *bfa); | ||
728 | void bfa_dconf_modexit(struct bfa_s *bfa); | ||
729 | bfa_status_t bfa_dconf_update(struct bfa_s *bfa); | ||
730 | |||
731 | /* | ||
690 | * IOC specfic macros | 732 | * IOC specfic macros |
691 | */ | 733 | */ |
692 | #define bfa_ioc_pcifn(__ioc) ((__ioc)->pcidev.pci_func) | 734 | #define bfa_ioc_pcifn(__ioc) ((__ioc)->pcidev.pci_func) |
diff --git a/drivers/scsi/bfa/bfa_modules.h b/drivers/scsi/bfa/bfa_modules.h index cd51ddf64ae5..2d36e4823835 100644 --- a/drivers/scsi/bfa/bfa_modules.h +++ b/drivers/scsi/bfa/bfa_modules.h | |||
@@ -44,6 +44,7 @@ struct bfa_modules_s { | |||
44 | struct bfa_flash_s flash; /* flash module */ | 44 | struct bfa_flash_s flash; /* flash module */ |
45 | struct bfa_diag_s diag_mod; /* diagnostics module */ | 45 | struct bfa_diag_s diag_mod; /* diagnostics module */ |
46 | struct bfa_phy_s phy; /* phy module */ | 46 | struct bfa_phy_s phy; /* phy module */ |
47 | struct bfa_dconf_mod_s dconf_mod; /* DCONF common module */ | ||
47 | }; | 48 | }; |
48 | 49 | ||
49 | /* | 50 | /* |
@@ -131,5 +132,6 @@ extern struct bfa_module_s hal_mod_lps; | |||
131 | extern struct bfa_module_s hal_mod_uf; | 132 | extern struct bfa_module_s hal_mod_uf; |
132 | extern struct bfa_module_s hal_mod_rport; | 133 | extern struct bfa_module_s hal_mod_rport; |
133 | extern struct bfa_module_s hal_mod_fcp; | 134 | extern struct bfa_module_s hal_mod_fcp; |
135 | extern struct bfa_module_s hal_mod_dconf; | ||
134 | 136 | ||
135 | #endif /* __BFA_MODULES_H__ */ | 137 | #endif /* __BFA_MODULES_H__ */ |