diff options
Diffstat (limited to 'drivers/scsi/bfa')
89 files changed, 3487 insertions, 2438 deletions
diff --git a/drivers/scsi/bfa/Makefile b/drivers/scsi/bfa/Makefile index 1d6009490d1c..17e06cae71b2 100644 --- a/drivers/scsi/bfa/Makefile +++ b/drivers/scsi/bfa/Makefile | |||
@@ -2,14 +2,14 @@ obj-$(CONFIG_SCSI_BFA_FC) := bfa.o | |||
2 | 2 | ||
3 | bfa-y := bfad.o bfad_intr.o bfad_os.o bfad_im.o bfad_attr.o bfad_fwimg.o | 3 | bfa-y := bfad.o bfad_intr.o bfad_os.o bfad_im.o bfad_attr.o bfad_fwimg.o |
4 | 4 | ||
5 | bfa-y += bfa_core.o bfa_ioc.o bfa_iocfc.o bfa_fcxp.o bfa_lps.o | 5 | bfa-y += bfa_core.o bfa_ioc.o bfa_ioc_ct.o bfa_ioc_cb.o bfa_iocfc.o bfa_fcxp.o |
6 | bfa-y += bfa_hw_cb.o bfa_hw_ct.o bfa_intr.o bfa_timer.o bfa_rport.o | 6 | bfa-y += bfa_lps.o bfa_hw_cb.o bfa_hw_ct.o bfa_intr.o bfa_timer.o bfa_rport.o |
7 | bfa-y += bfa_fcport.o bfa_port.o bfa_uf.o bfa_sgpg.o bfa_module.o bfa_ioim.o | 7 | bfa-y += bfa_fcport.o bfa_port.o bfa_uf.o bfa_sgpg.o bfa_module.o bfa_ioim.o |
8 | bfa-y += bfa_itnim.o bfa_fcpim.o bfa_tskim.o bfa_log.o bfa_log_module.o | 8 | bfa-y += bfa_itnim.o bfa_fcpim.o bfa_tskim.o bfa_log.o bfa_log_module.o |
9 | bfa-y += bfa_csdebug.o bfa_sm.o plog.o | 9 | bfa-y += bfa_csdebug.o bfa_sm.o plog.o |
10 | 10 | ||
11 | bfa-y += fcbuild.o fabric.o fcpim.o vfapi.o fcptm.o bfa_fcs.o bfa_fcs_port.o | 11 | bfa-y += fcbuild.o fabric.o fcpim.o vfapi.o fcptm.o bfa_fcs.o bfa_fcs_port.o |
12 | bfa-y += bfa_fcs_uf.o bfa_fcs_lport.o fab.o fdmi.o ms.o ns.o scn.o loop.o | 12 | bfa-y += bfa_fcs_uf.o bfa_fcs_lport.o fab.o fdmi.o ms.o ns.o scn.o loop.o |
13 | bfa-y += lport_api.o n2n.o rport.o rport_api.o rport_ftrs.o vport.o | 13 | bfa-y += lport_api.o n2n.o rport.o rport_api.o rport_ftrs.o vport.o |
14 | 14 | ||
15 | ccflags-y := -I$(obj) -I$(obj)/include -I$(obj)/include/cna | 15 | ccflags-y := -I$(obj) -I$(obj)/include -I$(obj)/include/cna -DBFA_PERF_BUILD |
diff --git a/drivers/scsi/bfa/bfa_core.c b/drivers/scsi/bfa/bfa_core.c index 44e2d1155c51..0c08e185a766 100644 --- a/drivers/scsi/bfa/bfa_core.c +++ b/drivers/scsi/bfa/bfa_core.c | |||
@@ -385,6 +385,15 @@ bfa_debug_fwsave(struct bfa_s *bfa, void *trcdata, int *trclen) | |||
385 | } | 385 | } |
386 | 386 | ||
387 | /** | 387 | /** |
388 | * Clear the saved firmware trace information of an IOC. | ||
389 | */ | ||
390 | void | ||
391 | bfa_debug_fwsave_clear(struct bfa_s *bfa) | ||
392 | { | ||
393 | bfa_ioc_debug_fwsave_clear(&bfa->ioc); | ||
394 | } | ||
395 | |||
396 | /** | ||
388 | * Fetch firmware trace data. | 397 | * Fetch firmware trace data. |
389 | * | 398 | * |
390 | * @param[in] bfa BFA instance | 399 | * @param[in] bfa BFA instance |
@@ -399,4 +408,14 @@ bfa_debug_fwtrc(struct bfa_s *bfa, void *trcdata, int *trclen) | |||
399 | { | 408 | { |
400 | return bfa_ioc_debug_fwtrc(&bfa->ioc, trcdata, trclen); | 409 | return bfa_ioc_debug_fwtrc(&bfa->ioc, trcdata, trclen); |
401 | } | 410 | } |
411 | |||
412 | /** | ||
413 | * Reset hw semaphore & usage cnt regs and initialize. | ||
414 | */ | ||
415 | void | ||
416 | bfa_chip_reset(struct bfa_s *bfa) | ||
417 | { | ||
418 | bfa_ioc_ownership_reset(&bfa->ioc); | ||
419 | bfa_ioc_pll_init(&bfa->ioc); | ||
420 | } | ||
402 | #endif | 421 | #endif |
diff --git a/drivers/scsi/bfa/bfa_fcport.c b/drivers/scsi/bfa/bfa_fcport.c index aef648b55dfc..c589488db0c1 100644 --- a/drivers/scsi/bfa/bfa_fcport.c +++ b/drivers/scsi/bfa/bfa_fcport.c | |||
@@ -23,40 +23,33 @@ | |||
23 | #include <cs/bfa_plog.h> | 23 | #include <cs/bfa_plog.h> |
24 | #include <aen/bfa_aen_port.h> | 24 | #include <aen/bfa_aen_port.h> |
25 | 25 | ||
26 | BFA_TRC_FILE(HAL, PPORT); | 26 | BFA_TRC_FILE(HAL, FCPORT); |
27 | BFA_MODULE(pport); | 27 | BFA_MODULE(fcport); |
28 | |||
29 | #define bfa_pport_callback(__pport, __event) do { \ | ||
30 | if ((__pport)->bfa->fcs) { \ | ||
31 | (__pport)->event_cbfn((__pport)->event_cbarg, (__event)); \ | ||
32 | } else { \ | ||
33 | (__pport)->hcb_event = (__event); \ | ||
34 | bfa_cb_queue((__pport)->bfa, &(__pport)->hcb_qe, \ | ||
35 | __bfa_cb_port_event, (__pport)); \ | ||
36 | } \ | ||
37 | } while (0) | ||
38 | 28 | ||
39 | /* | 29 | /* |
40 | * The port is considered disabled if corresponding physical port or IOC are | 30 | * The port is considered disabled if corresponding physical port or IOC are |
41 | * disabled explicitly | 31 | * disabled explicitly |
42 | */ | 32 | */ |
43 | #define BFA_PORT_IS_DISABLED(bfa) \ | 33 | #define BFA_PORT_IS_DISABLED(bfa) \ |
44 | ((bfa_pport_is_disabled(bfa) == BFA_TRUE) || \ | 34 | ((bfa_fcport_is_disabled(bfa) == BFA_TRUE) || \ |
45 | (bfa_ioc_is_disabled(&bfa->ioc) == BFA_TRUE)) | 35 | (bfa_ioc_is_disabled(&bfa->ioc) == BFA_TRUE)) |
46 | 36 | ||
47 | /* | 37 | /* |
48 | * forward declarations | 38 | * forward declarations |
49 | */ | 39 | */ |
50 | static bfa_boolean_t bfa_pport_send_enable(struct bfa_pport_s *port); | 40 | static bfa_boolean_t bfa_fcport_send_enable(struct bfa_fcport_s *fcport); |
51 | static bfa_boolean_t bfa_pport_send_disable(struct bfa_pport_s *port); | 41 | static bfa_boolean_t bfa_fcport_send_disable(struct bfa_fcport_s *fcport); |
52 | static void bfa_pport_update_linkinfo(struct bfa_pport_s *pport); | 42 | static void bfa_fcport_update_linkinfo(struct bfa_fcport_s *fcport); |
53 | static void bfa_pport_reset_linkinfo(struct bfa_pport_s *pport); | 43 | static void bfa_fcport_reset_linkinfo(struct bfa_fcport_s *fcport); |
54 | static void bfa_pport_set_wwns(struct bfa_pport_s *port); | 44 | static void bfa_fcport_set_wwns(struct bfa_fcport_s *fcport); |
55 | static void __bfa_cb_port_event(void *cbarg, bfa_boolean_t complete); | 45 | static void __bfa_cb_fcport_event(void *cbarg, bfa_boolean_t complete); |
56 | static void __bfa_cb_port_stats(void *cbarg, bfa_boolean_t complete); | 46 | static void bfa_fcport_callback(struct bfa_fcport_s *fcport, |
57 | static void __bfa_cb_port_stats_clr(void *cbarg, bfa_boolean_t complete); | 47 | enum bfa_pport_linkstate event); |
58 | static void bfa_port_stats_timeout(void *cbarg); | 48 | static void bfa_fcport_queue_cb(struct bfa_fcport_ln_s *ln, |
59 | static void bfa_port_stats_clr_timeout(void *cbarg); | 49 | enum bfa_pport_linkstate event); |
50 | static void __bfa_cb_fcport_stats_clr(void *cbarg, bfa_boolean_t complete); | ||
51 | static void bfa_fcport_stats_get_timeout(void *cbarg); | ||
52 | static void bfa_fcport_stats_clr_timeout(void *cbarg); | ||
60 | 53 | ||
61 | /** | 54 | /** |
62 | * bfa_pport_private | 55 | * bfa_pport_private |
@@ -65,111 +58,114 @@ static void bfa_port_stats_clr_timeout(void *cbarg); | |||
65 | /** | 58 | /** |
66 | * BFA port state machine events | 59 | * BFA port state machine events |
67 | */ | 60 | */ |
68 | enum bfa_pport_sm_event { | 61 | enum bfa_fcport_sm_event { |
69 | BFA_PPORT_SM_START = 1, /* start port state machine */ | 62 | BFA_FCPORT_SM_START = 1, /* start port state machine */ |
70 | BFA_PPORT_SM_STOP = 2, /* stop port state machine */ | 63 | BFA_FCPORT_SM_STOP = 2, /* stop port state machine */ |
71 | BFA_PPORT_SM_ENABLE = 3, /* enable port */ | 64 | BFA_FCPORT_SM_ENABLE = 3, /* enable port */ |
72 | BFA_PPORT_SM_DISABLE = 4, /* disable port state machine */ | 65 | BFA_FCPORT_SM_DISABLE = 4, /* disable port state machine */ |
73 | BFA_PPORT_SM_FWRSP = 5, /* firmware enable/disable rsp */ | 66 | BFA_FCPORT_SM_FWRSP = 5, /* firmware enable/disable rsp */ |
74 | BFA_PPORT_SM_LINKUP = 6, /* firmware linkup event */ | 67 | BFA_FCPORT_SM_LINKUP = 6, /* firmware linkup event */ |
75 | BFA_PPORT_SM_LINKDOWN = 7, /* firmware linkup down */ | 68 | BFA_FCPORT_SM_LINKDOWN = 7, /* firmware linkup down */ |
76 | BFA_PPORT_SM_QRESUME = 8, /* CQ space available */ | 69 | BFA_FCPORT_SM_QRESUME = 8, /* CQ space available */ |
77 | BFA_PPORT_SM_HWFAIL = 9, /* IOC h/w failure */ | 70 | BFA_FCPORT_SM_HWFAIL = 9, /* IOC h/w failure */ |
78 | }; | 71 | }; |
79 | 72 | ||
80 | static void bfa_pport_sm_uninit(struct bfa_pport_s *pport, | 73 | /** |
81 | enum bfa_pport_sm_event event); | 74 | * BFA port link notification state machine events |
82 | static void bfa_pport_sm_enabling_qwait(struct bfa_pport_s *pport, | 75 | */ |
83 | enum bfa_pport_sm_event event); | 76 | |
84 | static void bfa_pport_sm_enabling(struct bfa_pport_s *pport, | 77 | enum bfa_fcport_ln_sm_event { |
85 | enum bfa_pport_sm_event event); | 78 | BFA_FCPORT_LN_SM_LINKUP = 1, /* linkup event */ |
86 | static void bfa_pport_sm_linkdown(struct bfa_pport_s *pport, | 79 | BFA_FCPORT_LN_SM_LINKDOWN = 2, /* linkdown event */ |
87 | enum bfa_pport_sm_event event); | 80 | BFA_FCPORT_LN_SM_NOTIFICATION = 3 /* done notification */ |
88 | static void bfa_pport_sm_linkup(struct bfa_pport_s *pport, | 81 | }; |
89 | enum bfa_pport_sm_event event); | 82 | |
90 | static void bfa_pport_sm_disabling(struct bfa_pport_s *pport, | 83 | static void bfa_fcport_sm_uninit(struct bfa_fcport_s *fcport, |
91 | enum bfa_pport_sm_event event); | 84 | enum bfa_fcport_sm_event event); |
92 | static void bfa_pport_sm_disabling_qwait(struct bfa_pport_s *pport, | 85 | static void bfa_fcport_sm_enabling_qwait(struct bfa_fcport_s *fcport, |
93 | enum bfa_pport_sm_event event); | 86 | enum bfa_fcport_sm_event event); |
94 | static void bfa_pport_sm_disabled(struct bfa_pport_s *pport, | 87 | static void bfa_fcport_sm_enabling(struct bfa_fcport_s *fcport, |
95 | enum bfa_pport_sm_event event); | 88 | enum bfa_fcport_sm_event event); |
96 | static void bfa_pport_sm_stopped(struct bfa_pport_s *pport, | 89 | static void bfa_fcport_sm_linkdown(struct bfa_fcport_s *fcport, |
97 | enum bfa_pport_sm_event event); | 90 | enum bfa_fcport_sm_event event); |
98 | static void bfa_pport_sm_iocdown(struct bfa_pport_s *pport, | 91 | static void bfa_fcport_sm_linkup(struct bfa_fcport_s *fcport, |
99 | enum bfa_pport_sm_event event); | 92 | enum bfa_fcport_sm_event event); |
100 | static void bfa_pport_sm_iocfail(struct bfa_pport_s *pport, | 93 | static void bfa_fcport_sm_disabling(struct bfa_fcport_s *fcport, |
101 | enum bfa_pport_sm_event event); | 94 | enum bfa_fcport_sm_event event); |
95 | static void bfa_fcport_sm_disabling_qwait(struct bfa_fcport_s *fcport, | ||
96 | enum bfa_fcport_sm_event event); | ||
97 | static void bfa_fcport_sm_disabled(struct bfa_fcport_s *fcport, | ||
98 | enum bfa_fcport_sm_event event); | ||
99 | static void bfa_fcport_sm_stopped(struct bfa_fcport_s *fcport, | ||
100 | enum bfa_fcport_sm_event event); | ||
101 | static void bfa_fcport_sm_iocdown(struct bfa_fcport_s *fcport, | ||
102 | enum bfa_fcport_sm_event event); | ||
103 | static void bfa_fcport_sm_iocfail(struct bfa_fcport_s *fcport, | ||
104 | enum bfa_fcport_sm_event event); | ||
105 | |||
106 | static void bfa_fcport_ln_sm_dn(struct bfa_fcport_ln_s *ln, | ||
107 | enum bfa_fcport_ln_sm_event event); | ||
108 | static void bfa_fcport_ln_sm_dn_nf(struct bfa_fcport_ln_s *ln, | ||
109 | enum bfa_fcport_ln_sm_event event); | ||
110 | static void bfa_fcport_ln_sm_dn_up_nf(struct bfa_fcport_ln_s *ln, | ||
111 | enum bfa_fcport_ln_sm_event event); | ||
112 | static void bfa_fcport_ln_sm_up(struct bfa_fcport_ln_s *ln, | ||
113 | enum bfa_fcport_ln_sm_event event); | ||
114 | static void bfa_fcport_ln_sm_up_nf(struct bfa_fcport_ln_s *ln, | ||
115 | enum bfa_fcport_ln_sm_event event); | ||
116 | static void bfa_fcport_ln_sm_up_dn_nf(struct bfa_fcport_ln_s *ln, | ||
117 | enum bfa_fcport_ln_sm_event event); | ||
118 | static void bfa_fcport_ln_sm_up_dn_up_nf(struct bfa_fcport_ln_s *ln, | ||
119 | enum bfa_fcport_ln_sm_event event); | ||
102 | 120 | ||
103 | static struct bfa_sm_table_s hal_pport_sm_table[] = { | 121 | static struct bfa_sm_table_s hal_pport_sm_table[] = { |
104 | {BFA_SM(bfa_pport_sm_uninit), BFA_PPORT_ST_UNINIT}, | 122 | {BFA_SM(bfa_fcport_sm_uninit), BFA_PPORT_ST_UNINIT}, |
105 | {BFA_SM(bfa_pport_sm_enabling_qwait), BFA_PPORT_ST_ENABLING_QWAIT}, | 123 | {BFA_SM(bfa_fcport_sm_enabling_qwait), BFA_PPORT_ST_ENABLING_QWAIT}, |
106 | {BFA_SM(bfa_pport_sm_enabling), BFA_PPORT_ST_ENABLING}, | 124 | {BFA_SM(bfa_fcport_sm_enabling), BFA_PPORT_ST_ENABLING}, |
107 | {BFA_SM(bfa_pport_sm_linkdown), BFA_PPORT_ST_LINKDOWN}, | 125 | {BFA_SM(bfa_fcport_sm_linkdown), BFA_PPORT_ST_LINKDOWN}, |
108 | {BFA_SM(bfa_pport_sm_linkup), BFA_PPORT_ST_LINKUP}, | 126 | {BFA_SM(bfa_fcport_sm_linkup), BFA_PPORT_ST_LINKUP}, |
109 | {BFA_SM(bfa_pport_sm_disabling_qwait), | 127 | {BFA_SM(bfa_fcport_sm_disabling_qwait), BFA_PPORT_ST_DISABLING_QWAIT}, |
110 | BFA_PPORT_ST_DISABLING_QWAIT}, | 128 | {BFA_SM(bfa_fcport_sm_disabling), BFA_PPORT_ST_DISABLING}, |
111 | {BFA_SM(bfa_pport_sm_disabling), BFA_PPORT_ST_DISABLING}, | 129 | {BFA_SM(bfa_fcport_sm_disabled), BFA_PPORT_ST_DISABLED}, |
112 | {BFA_SM(bfa_pport_sm_disabled), BFA_PPORT_ST_DISABLED}, | 130 | {BFA_SM(bfa_fcport_sm_stopped), BFA_PPORT_ST_STOPPED}, |
113 | {BFA_SM(bfa_pport_sm_stopped), BFA_PPORT_ST_STOPPED}, | 131 | {BFA_SM(bfa_fcport_sm_iocdown), BFA_PPORT_ST_IOCDOWN}, |
114 | {BFA_SM(bfa_pport_sm_iocdown), BFA_PPORT_ST_IOCDOWN}, | 132 | {BFA_SM(bfa_fcport_sm_iocfail), BFA_PPORT_ST_IOCDOWN}, |
115 | {BFA_SM(bfa_pport_sm_iocfail), BFA_PPORT_ST_IOCDOWN}, | ||
116 | }; | 133 | }; |
117 | 134 | ||
118 | static void | 135 | static void |
119 | bfa_pport_aen_post(struct bfa_pport_s *pport, enum bfa_port_aen_event event) | 136 | bfa_fcport_aen_post(struct bfa_fcport_s *fcport, enum bfa_port_aen_event event) |
120 | { | 137 | { |
121 | union bfa_aen_data_u aen_data; | 138 | union bfa_aen_data_u aen_data; |
122 | struct bfa_log_mod_s *logmod = pport->bfa->logm; | 139 | struct bfa_log_mod_s *logmod = fcport->bfa->logm; |
123 | wwn_t pwwn = pport->pwwn; | 140 | wwn_t pwwn = fcport->pwwn; |
124 | char pwwn_ptr[BFA_STRING_32]; | 141 | char pwwn_ptr[BFA_STRING_32]; |
125 | struct bfa_ioc_attr_s ioc_attr; | ||
126 | 142 | ||
143 | memset(&aen_data, 0, sizeof(aen_data)); | ||
127 | wwn2str(pwwn_ptr, pwwn); | 144 | wwn2str(pwwn_ptr, pwwn); |
128 | switch (event) { | 145 | bfa_log(logmod, BFA_LOG_CREATE_ID(BFA_AEN_CAT_PORT, event), pwwn_ptr); |
129 | case BFA_PORT_AEN_ONLINE: | ||
130 | bfa_log(logmod, BFA_AEN_PORT_ONLINE, pwwn_ptr); | ||
131 | break; | ||
132 | case BFA_PORT_AEN_OFFLINE: | ||
133 | bfa_log(logmod, BFA_AEN_PORT_OFFLINE, pwwn_ptr); | ||
134 | break; | ||
135 | case BFA_PORT_AEN_ENABLE: | ||
136 | bfa_log(logmod, BFA_AEN_PORT_ENABLE, pwwn_ptr); | ||
137 | break; | ||
138 | case BFA_PORT_AEN_DISABLE: | ||
139 | bfa_log(logmod, BFA_AEN_PORT_DISABLE, pwwn_ptr); | ||
140 | break; | ||
141 | case BFA_PORT_AEN_DISCONNECT: | ||
142 | bfa_log(logmod, BFA_AEN_PORT_DISCONNECT, pwwn_ptr); | ||
143 | break; | ||
144 | case BFA_PORT_AEN_QOS_NEG: | ||
145 | bfa_log(logmod, BFA_AEN_PORT_QOS_NEG, pwwn_ptr); | ||
146 | break; | ||
147 | default: | ||
148 | break; | ||
149 | } | ||
150 | 146 | ||
151 | bfa_ioc_get_attr(&pport->bfa->ioc, &ioc_attr); | 147 | aen_data.port.ioc_type = bfa_get_type(fcport->bfa); |
152 | aen_data.port.ioc_type = ioc_attr.ioc_type; | ||
153 | aen_data.port.pwwn = pwwn; | 148 | aen_data.port.pwwn = pwwn; |
154 | } | 149 | } |
155 | 150 | ||
156 | static void | 151 | static void |
157 | bfa_pport_sm_uninit(struct bfa_pport_s *pport, enum bfa_pport_sm_event event) | 152 | bfa_fcport_sm_uninit(struct bfa_fcport_s *fcport, |
153 | enum bfa_fcport_sm_event event) | ||
158 | { | 154 | { |
159 | bfa_trc(pport->bfa, event); | 155 | bfa_trc(fcport->bfa, event); |
160 | 156 | ||
161 | switch (event) { | 157 | switch (event) { |
162 | case BFA_PPORT_SM_START: | 158 | case BFA_FCPORT_SM_START: |
163 | /** | 159 | /** |
164 | * Start event after IOC is configured and BFA is started. | 160 | * Start event after IOC is configured and BFA is started. |
165 | */ | 161 | */ |
166 | if (bfa_pport_send_enable(pport)) | 162 | if (bfa_fcport_send_enable(fcport)) |
167 | bfa_sm_set_state(pport, bfa_pport_sm_enabling); | 163 | bfa_sm_set_state(fcport, bfa_fcport_sm_enabling); |
168 | else | 164 | else |
169 | bfa_sm_set_state(pport, bfa_pport_sm_enabling_qwait); | 165 | bfa_sm_set_state(fcport, bfa_fcport_sm_enabling_qwait); |
170 | break; | 166 | break; |
171 | 167 | ||
172 | case BFA_PPORT_SM_ENABLE: | 168 | case BFA_FCPORT_SM_ENABLE: |
173 | /** | 169 | /** |
174 | * Port is persistently configured to be in enabled state. Do | 170 | * Port is persistently configured to be in enabled state. Do |
175 | * not change state. Port enabling is done when START event is | 171 | * not change state. Port enabling is done when START event is |
@@ -177,389 +173,412 @@ bfa_pport_sm_uninit(struct bfa_pport_s *pport, enum bfa_pport_sm_event event) | |||
177 | */ | 173 | */ |
178 | break; | 174 | break; |
179 | 175 | ||
180 | case BFA_PPORT_SM_DISABLE: | 176 | case BFA_FCPORT_SM_DISABLE: |
181 | /** | 177 | /** |
182 | * If a port is persistently configured to be disabled, the | 178 | * If a port is persistently configured to be disabled, the |
183 | * first event will a port disable request. | 179 | * first event will a port disable request. |
184 | */ | 180 | */ |
185 | bfa_sm_set_state(pport, bfa_pport_sm_disabled); | 181 | bfa_sm_set_state(fcport, bfa_fcport_sm_disabled); |
186 | break; | 182 | break; |
187 | 183 | ||
188 | case BFA_PPORT_SM_HWFAIL: | 184 | case BFA_FCPORT_SM_HWFAIL: |
189 | bfa_sm_set_state(pport, bfa_pport_sm_iocdown); | 185 | bfa_sm_set_state(fcport, bfa_fcport_sm_iocdown); |
190 | break; | 186 | break; |
191 | 187 | ||
192 | default: | 188 | default: |
193 | bfa_sm_fault(pport->bfa, event); | 189 | bfa_sm_fault(fcport->bfa, event); |
194 | } | 190 | } |
195 | } | 191 | } |
196 | 192 | ||
197 | static void | 193 | static void |
198 | bfa_pport_sm_enabling_qwait(struct bfa_pport_s *pport, | 194 | bfa_fcport_sm_enabling_qwait(struct bfa_fcport_s *fcport, |
199 | enum bfa_pport_sm_event event) | 195 | enum bfa_fcport_sm_event event) |
200 | { | 196 | { |
201 | bfa_trc(pport->bfa, event); | 197 | bfa_trc(fcport->bfa, event); |
202 | 198 | ||
203 | switch (event) { | 199 | switch (event) { |
204 | case BFA_PPORT_SM_QRESUME: | 200 | case BFA_FCPORT_SM_QRESUME: |
205 | bfa_sm_set_state(pport, bfa_pport_sm_enabling); | 201 | bfa_sm_set_state(fcport, bfa_fcport_sm_enabling); |
206 | bfa_pport_send_enable(pport); | 202 | bfa_fcport_send_enable(fcport); |
207 | break; | 203 | break; |
208 | 204 | ||
209 | case BFA_PPORT_SM_STOP: | 205 | case BFA_FCPORT_SM_STOP: |
210 | bfa_reqq_wcancel(&pport->reqq_wait); | 206 | bfa_reqq_wcancel(&fcport->reqq_wait); |
211 | bfa_sm_set_state(pport, bfa_pport_sm_stopped); | 207 | bfa_sm_set_state(fcport, bfa_fcport_sm_stopped); |
212 | break; | 208 | break; |
213 | 209 | ||
214 | case BFA_PPORT_SM_ENABLE: | 210 | case BFA_FCPORT_SM_ENABLE: |
215 | /** | 211 | /** |
216 | * Already enable is in progress. | 212 | * Already enable is in progress. |
217 | */ | 213 | */ |
218 | break; | 214 | break; |
219 | 215 | ||
220 | case BFA_PPORT_SM_DISABLE: | 216 | case BFA_FCPORT_SM_DISABLE: |
221 | /** | 217 | /** |
222 | * Just send disable request to firmware when room becomes | 218 | * Just send disable request to firmware when room becomes |
223 | * available in request queue. | 219 | * available in request queue. |
224 | */ | 220 | */ |
225 | bfa_sm_set_state(pport, bfa_pport_sm_disabled); | 221 | bfa_sm_set_state(fcport, bfa_fcport_sm_disabled); |
226 | bfa_reqq_wcancel(&pport->reqq_wait); | 222 | bfa_reqq_wcancel(&fcport->reqq_wait); |
227 | bfa_plog_str(pport->bfa->plog, BFA_PL_MID_HAL, | 223 | bfa_plog_str(fcport->bfa->plog, BFA_PL_MID_HAL, |
228 | BFA_PL_EID_PORT_DISABLE, 0, "Port Disable"); | 224 | BFA_PL_EID_PORT_DISABLE, 0, "Port Disable"); |
229 | bfa_pport_aen_post(pport, BFA_PORT_AEN_DISABLE); | 225 | bfa_fcport_aen_post(fcport, BFA_PORT_AEN_DISABLE); |
230 | break; | 226 | break; |
231 | 227 | ||
232 | case BFA_PPORT_SM_LINKUP: | 228 | case BFA_FCPORT_SM_LINKUP: |
233 | case BFA_PPORT_SM_LINKDOWN: | 229 | case BFA_FCPORT_SM_LINKDOWN: |
234 | /** | 230 | /** |
235 | * Possible to get link events when doing back-to-back | 231 | * Possible to get link events when doing back-to-back |
236 | * enable/disables. | 232 | * enable/disables. |
237 | */ | 233 | */ |
238 | break; | 234 | break; |
239 | 235 | ||
240 | case BFA_PPORT_SM_HWFAIL: | 236 | case BFA_FCPORT_SM_HWFAIL: |
241 | bfa_reqq_wcancel(&pport->reqq_wait); | 237 | bfa_reqq_wcancel(&fcport->reqq_wait); |
242 | bfa_sm_set_state(pport, bfa_pport_sm_iocdown); | 238 | bfa_sm_set_state(fcport, bfa_fcport_sm_iocdown); |
243 | break; | 239 | break; |
244 | 240 | ||
245 | default: | 241 | default: |
246 | bfa_sm_fault(pport->bfa, event); | 242 | bfa_sm_fault(fcport->bfa, event); |
247 | } | 243 | } |
248 | } | 244 | } |
249 | 245 | ||
250 | static void | 246 | static void |
251 | bfa_pport_sm_enabling(struct bfa_pport_s *pport, enum bfa_pport_sm_event event) | 247 | bfa_fcport_sm_enabling(struct bfa_fcport_s *fcport, |
248 | enum bfa_fcport_sm_event event) | ||
252 | { | 249 | { |
253 | bfa_trc(pport->bfa, event); | 250 | bfa_trc(fcport->bfa, event); |
254 | 251 | ||
255 | switch (event) { | 252 | switch (event) { |
256 | case BFA_PPORT_SM_FWRSP: | 253 | case BFA_FCPORT_SM_FWRSP: |
257 | case BFA_PPORT_SM_LINKDOWN: | 254 | case BFA_FCPORT_SM_LINKDOWN: |
258 | bfa_sm_set_state(pport, bfa_pport_sm_linkdown); | 255 | bfa_sm_set_state(fcport, bfa_fcport_sm_linkdown); |
259 | break; | 256 | break; |
260 | 257 | ||
261 | case BFA_PPORT_SM_LINKUP: | 258 | case BFA_FCPORT_SM_LINKUP: |
262 | bfa_pport_update_linkinfo(pport); | 259 | bfa_fcport_update_linkinfo(fcport); |
263 | bfa_sm_set_state(pport, bfa_pport_sm_linkup); | 260 | bfa_sm_set_state(fcport, bfa_fcport_sm_linkup); |
264 | 261 | ||
265 | bfa_assert(pport->event_cbfn); | 262 | bfa_assert(fcport->event_cbfn); |
266 | bfa_pport_callback(pport, BFA_PPORT_LINKUP); | 263 | bfa_fcport_callback(fcport, BFA_PPORT_LINKUP); |
267 | break; | 264 | break; |
268 | 265 | ||
269 | case BFA_PPORT_SM_ENABLE: | 266 | case BFA_FCPORT_SM_ENABLE: |
270 | /** | 267 | /** |
271 | * Already being enabled. | 268 | * Already being enabled. |
272 | */ | 269 | */ |
273 | break; | 270 | break; |
274 | 271 | ||
275 | case BFA_PPORT_SM_DISABLE: | 272 | case BFA_FCPORT_SM_DISABLE: |
276 | if (bfa_pport_send_disable(pport)) | 273 | if (bfa_fcport_send_disable(fcport)) |
277 | bfa_sm_set_state(pport, bfa_pport_sm_disabling); | 274 | bfa_sm_set_state(fcport, bfa_fcport_sm_disabling); |
278 | else | 275 | else |
279 | bfa_sm_set_state(pport, bfa_pport_sm_disabling_qwait); | 276 | bfa_sm_set_state(fcport, bfa_fcport_sm_disabling_qwait); |
280 | 277 | ||
281 | bfa_plog_str(pport->bfa->plog, BFA_PL_MID_HAL, | 278 | bfa_plog_str(fcport->bfa->plog, BFA_PL_MID_HAL, |
282 | BFA_PL_EID_PORT_DISABLE, 0, "Port Disable"); | 279 | BFA_PL_EID_PORT_DISABLE, 0, "Port Disable"); |
283 | bfa_pport_aen_post(pport, BFA_PORT_AEN_DISABLE); | 280 | bfa_fcport_aen_post(fcport, BFA_PORT_AEN_DISABLE); |
284 | break; | 281 | break; |
285 | 282 | ||
286 | case BFA_PPORT_SM_STOP: | 283 | case BFA_FCPORT_SM_STOP: |
287 | bfa_sm_set_state(pport, bfa_pport_sm_stopped); | 284 | bfa_sm_set_state(fcport, bfa_fcport_sm_stopped); |
288 | break; | 285 | break; |
289 | 286 | ||
290 | case BFA_PPORT_SM_HWFAIL: | 287 | case BFA_FCPORT_SM_HWFAIL: |
291 | bfa_sm_set_state(pport, bfa_pport_sm_iocdown); | 288 | bfa_sm_set_state(fcport, bfa_fcport_sm_iocdown); |
292 | break; | 289 | break; |
293 | 290 | ||
294 | default: | 291 | default: |
295 | bfa_sm_fault(pport->bfa, event); | 292 | bfa_sm_fault(fcport->bfa, event); |
296 | } | 293 | } |
297 | } | 294 | } |
298 | 295 | ||
299 | static void | 296 | static void |
300 | bfa_pport_sm_linkdown(struct bfa_pport_s *pport, enum bfa_pport_sm_event event) | 297 | bfa_fcport_sm_linkdown(struct bfa_fcport_s *fcport, |
298 | enum bfa_fcport_sm_event event) | ||
301 | { | 299 | { |
302 | bfa_trc(pport->bfa, event); | 300 | struct bfi_fcport_event_s *pevent = fcport->event_arg.i2hmsg.event; |
301 | bfa_trc(fcport->bfa, event); | ||
303 | 302 | ||
304 | switch (event) { | 303 | switch (event) { |
305 | case BFA_PPORT_SM_LINKUP: | 304 | case BFA_FCPORT_SM_LINKUP: |
306 | bfa_pport_update_linkinfo(pport); | 305 | bfa_fcport_update_linkinfo(fcport); |
307 | bfa_sm_set_state(pport, bfa_pport_sm_linkup); | 306 | bfa_sm_set_state(fcport, bfa_fcport_sm_linkup); |
308 | bfa_assert(pport->event_cbfn); | 307 | bfa_assert(fcport->event_cbfn); |
309 | bfa_plog_str(pport->bfa->plog, BFA_PL_MID_HAL, | 308 | bfa_plog_str(fcport->bfa->plog, BFA_PL_MID_HAL, |
310 | BFA_PL_EID_PORT_ST_CHANGE, 0, "Port Linkup"); | 309 | BFA_PL_EID_PORT_ST_CHANGE, 0, "Port Linkup"); |
311 | bfa_pport_callback(pport, BFA_PPORT_LINKUP); | 310 | |
312 | bfa_pport_aen_post(pport, BFA_PORT_AEN_ONLINE); | 311 | if (!bfa_ioc_get_fcmode(&fcport->bfa->ioc)) { |
312 | |||
313 | bfa_trc(fcport->bfa, pevent->link_state.fcf.fipenabled); | ||
314 | bfa_trc(fcport->bfa, pevent->link_state.fcf.fipfailed); | ||
315 | |||
316 | if (pevent->link_state.fcf.fipfailed) | ||
317 | bfa_plog_str(fcport->bfa->plog, BFA_PL_MID_HAL, | ||
318 | BFA_PL_EID_FIP_FCF_DISC, 0, | ||
319 | "FIP FCF Discovery Failed"); | ||
320 | else | ||
321 | bfa_plog_str(fcport->bfa->plog, BFA_PL_MID_HAL, | ||
322 | BFA_PL_EID_FIP_FCF_DISC, 0, | ||
323 | "FIP FCF Discovered"); | ||
324 | } | ||
325 | |||
326 | bfa_fcport_callback(fcport, BFA_PPORT_LINKUP); | ||
327 | bfa_fcport_aen_post(fcport, BFA_PORT_AEN_ONLINE); | ||
313 | /** | 328 | /** |
314 | * If QoS is enabled and it is not online, | 329 | * If QoS is enabled and it is not online, |
315 | * Send a separate event. | 330 | * Send a separate event. |
316 | */ | 331 | */ |
317 | if ((pport->cfg.qos_enabled) | 332 | if ((fcport->cfg.qos_enabled) |
318 | && (bfa_os_ntohl(pport->qos_attr.state) != BFA_QOS_ONLINE)) | 333 | && (bfa_os_ntohl(fcport->qos_attr.state) != BFA_QOS_ONLINE)) |
319 | bfa_pport_aen_post(pport, BFA_PORT_AEN_QOS_NEG); | 334 | bfa_fcport_aen_post(fcport, BFA_PORT_AEN_QOS_NEG); |
320 | 335 | ||
321 | break; | 336 | break; |
322 | 337 | ||
323 | case BFA_PPORT_SM_LINKDOWN: | 338 | case BFA_FCPORT_SM_LINKDOWN: |
324 | /** | 339 | /** |
325 | * Possible to get link down event. | 340 | * Possible to get link down event. |
326 | */ | 341 | */ |
327 | break; | 342 | break; |
328 | 343 | ||
329 | case BFA_PPORT_SM_ENABLE: | 344 | case BFA_FCPORT_SM_ENABLE: |
330 | /** | 345 | /** |
331 | * Already enabled. | 346 | * Already enabled. |
332 | */ | 347 | */ |
333 | break; | 348 | break; |
334 | 349 | ||
335 | case BFA_PPORT_SM_DISABLE: | 350 | case BFA_FCPORT_SM_DISABLE: |
336 | if (bfa_pport_send_disable(pport)) | 351 | if (bfa_fcport_send_disable(fcport)) |
337 | bfa_sm_set_state(pport, bfa_pport_sm_disabling); | 352 | bfa_sm_set_state(fcport, bfa_fcport_sm_disabling); |
338 | else | 353 | else |
339 | bfa_sm_set_state(pport, bfa_pport_sm_disabling_qwait); | 354 | bfa_sm_set_state(fcport, bfa_fcport_sm_disabling_qwait); |
340 | 355 | ||
341 | bfa_plog_str(pport->bfa->plog, BFA_PL_MID_HAL, | 356 | bfa_plog_str(fcport->bfa->plog, BFA_PL_MID_HAL, |
342 | BFA_PL_EID_PORT_DISABLE, 0, "Port Disable"); | 357 | BFA_PL_EID_PORT_DISABLE, 0, "Port Disable"); |
343 | bfa_pport_aen_post(pport, BFA_PORT_AEN_DISABLE); | 358 | bfa_fcport_aen_post(fcport, BFA_PORT_AEN_DISABLE); |
344 | break; | 359 | break; |
345 | 360 | ||
346 | case BFA_PPORT_SM_STOP: | 361 | case BFA_FCPORT_SM_STOP: |
347 | bfa_sm_set_state(pport, bfa_pport_sm_stopped); | 362 | bfa_sm_set_state(fcport, bfa_fcport_sm_stopped); |
348 | break; | 363 | break; |
349 | 364 | ||
350 | case BFA_PPORT_SM_HWFAIL: | 365 | case BFA_FCPORT_SM_HWFAIL: |
351 | bfa_sm_set_state(pport, bfa_pport_sm_iocdown); | 366 | bfa_sm_set_state(fcport, bfa_fcport_sm_iocdown); |
352 | break; | 367 | break; |
353 | 368 | ||
354 | default: | 369 | default: |
355 | bfa_sm_fault(pport->bfa, event); | 370 | bfa_sm_fault(fcport->bfa, event); |
356 | } | 371 | } |
357 | } | 372 | } |
358 | 373 | ||
359 | static void | 374 | static void |
360 | bfa_pport_sm_linkup(struct bfa_pport_s *pport, enum bfa_pport_sm_event event) | 375 | bfa_fcport_sm_linkup(struct bfa_fcport_s *fcport, |
376 | enum bfa_fcport_sm_event event) | ||
361 | { | 377 | { |
362 | bfa_trc(pport->bfa, event); | 378 | bfa_trc(fcport->bfa, event); |
363 | 379 | ||
364 | switch (event) { | 380 | switch (event) { |
365 | case BFA_PPORT_SM_ENABLE: | 381 | case BFA_FCPORT_SM_ENABLE: |
366 | /** | 382 | /** |
367 | * Already enabled. | 383 | * Already enabled. |
368 | */ | 384 | */ |
369 | break; | 385 | break; |
370 | 386 | ||
371 | case BFA_PPORT_SM_DISABLE: | 387 | case BFA_FCPORT_SM_DISABLE: |
372 | if (bfa_pport_send_disable(pport)) | 388 | if (bfa_fcport_send_disable(fcport)) |
373 | bfa_sm_set_state(pport, bfa_pport_sm_disabling); | 389 | bfa_sm_set_state(fcport, bfa_fcport_sm_disabling); |
374 | else | 390 | else |
375 | bfa_sm_set_state(pport, bfa_pport_sm_disabling_qwait); | 391 | bfa_sm_set_state(fcport, bfa_fcport_sm_disabling_qwait); |
376 | 392 | ||
377 | bfa_pport_reset_linkinfo(pport); | 393 | bfa_fcport_reset_linkinfo(fcport); |
378 | bfa_pport_callback(pport, BFA_PPORT_LINKDOWN); | 394 | bfa_fcport_callback(fcport, BFA_PPORT_LINKDOWN); |
379 | bfa_plog_str(pport->bfa->plog, BFA_PL_MID_HAL, | 395 | bfa_plog_str(fcport->bfa->plog, BFA_PL_MID_HAL, |
380 | BFA_PL_EID_PORT_DISABLE, 0, "Port Disable"); | 396 | BFA_PL_EID_PORT_DISABLE, 0, "Port Disable"); |
381 | bfa_pport_aen_post(pport, BFA_PORT_AEN_OFFLINE); | 397 | bfa_fcport_aen_post(fcport, BFA_PORT_AEN_OFFLINE); |
382 | bfa_pport_aen_post(pport, BFA_PORT_AEN_DISABLE); | 398 | bfa_fcport_aen_post(fcport, BFA_PORT_AEN_DISABLE); |
383 | break; | 399 | break; |
384 | 400 | ||
385 | case BFA_PPORT_SM_LINKDOWN: | 401 | case BFA_FCPORT_SM_LINKDOWN: |
386 | bfa_sm_set_state(pport, bfa_pport_sm_linkdown); | 402 | bfa_sm_set_state(fcport, bfa_fcport_sm_linkdown); |
387 | bfa_pport_reset_linkinfo(pport); | 403 | bfa_fcport_reset_linkinfo(fcport); |
388 | bfa_pport_callback(pport, BFA_PPORT_LINKDOWN); | 404 | bfa_fcport_callback(fcport, BFA_PPORT_LINKDOWN); |
389 | bfa_plog_str(pport->bfa->plog, BFA_PL_MID_HAL, | 405 | bfa_plog_str(fcport->bfa->plog, BFA_PL_MID_HAL, |
390 | BFA_PL_EID_PORT_ST_CHANGE, 0, "Port Linkdown"); | 406 | BFA_PL_EID_PORT_ST_CHANGE, 0, "Port Linkdown"); |
391 | if (BFA_PORT_IS_DISABLED(pport->bfa)) | 407 | if (BFA_PORT_IS_DISABLED(fcport->bfa)) |
392 | bfa_pport_aen_post(pport, BFA_PORT_AEN_OFFLINE); | 408 | bfa_fcport_aen_post(fcport, BFA_PORT_AEN_OFFLINE); |
393 | else | 409 | else |
394 | bfa_pport_aen_post(pport, BFA_PORT_AEN_DISCONNECT); | 410 | bfa_fcport_aen_post(fcport, BFA_PORT_AEN_DISCONNECT); |
395 | break; | 411 | break; |
396 | 412 | ||
397 | case BFA_PPORT_SM_STOP: | 413 | case BFA_FCPORT_SM_STOP: |
398 | bfa_sm_set_state(pport, bfa_pport_sm_stopped); | 414 | bfa_sm_set_state(fcport, bfa_fcport_sm_stopped); |
399 | bfa_pport_reset_linkinfo(pport); | 415 | bfa_fcport_reset_linkinfo(fcport); |
400 | if (BFA_PORT_IS_DISABLED(pport->bfa)) | 416 | if (BFA_PORT_IS_DISABLED(fcport->bfa)) |
401 | bfa_pport_aen_post(pport, BFA_PORT_AEN_OFFLINE); | 417 | bfa_fcport_aen_post(fcport, BFA_PORT_AEN_OFFLINE); |
402 | else | 418 | else |
403 | bfa_pport_aen_post(pport, BFA_PORT_AEN_DISCONNECT); | 419 | bfa_fcport_aen_post(fcport, BFA_PORT_AEN_DISCONNECT); |
404 | break; | 420 | break; |
405 | 421 | ||
406 | case BFA_PPORT_SM_HWFAIL: | 422 | case BFA_FCPORT_SM_HWFAIL: |
407 | bfa_sm_set_state(pport, bfa_pport_sm_iocdown); | 423 | bfa_sm_set_state(fcport, bfa_fcport_sm_iocdown); |
408 | bfa_pport_reset_linkinfo(pport); | 424 | bfa_fcport_reset_linkinfo(fcport); |
409 | bfa_pport_callback(pport, BFA_PPORT_LINKDOWN); | 425 | bfa_fcport_callback(fcport, BFA_PPORT_LINKDOWN); |
410 | if (BFA_PORT_IS_DISABLED(pport->bfa)) | 426 | if (BFA_PORT_IS_DISABLED(fcport->bfa)) |
411 | bfa_pport_aen_post(pport, BFA_PORT_AEN_OFFLINE); | 427 | bfa_fcport_aen_post(fcport, BFA_PORT_AEN_OFFLINE); |
412 | else | 428 | else |
413 | bfa_pport_aen_post(pport, BFA_PORT_AEN_DISCONNECT); | 429 | bfa_fcport_aen_post(fcport, BFA_PORT_AEN_DISCONNECT); |
414 | break; | 430 | break; |
415 | 431 | ||
416 | default: | 432 | default: |
417 | bfa_sm_fault(pport->bfa, event); | 433 | bfa_sm_fault(fcport->bfa, event); |
418 | } | 434 | } |
419 | } | 435 | } |
420 | 436 | ||
421 | static void | 437 | static void |
422 | bfa_pport_sm_disabling_qwait(struct bfa_pport_s *pport, | 438 | bfa_fcport_sm_disabling_qwait(struct bfa_fcport_s *fcport, |
423 | enum bfa_pport_sm_event event) | 439 | enum bfa_fcport_sm_event event) |
424 | { | 440 | { |
425 | bfa_trc(pport->bfa, event); | 441 | bfa_trc(fcport->bfa, event); |
426 | 442 | ||
427 | switch (event) { | 443 | switch (event) { |
428 | case BFA_PPORT_SM_QRESUME: | 444 | case BFA_FCPORT_SM_QRESUME: |
429 | bfa_sm_set_state(pport, bfa_pport_sm_disabling); | 445 | bfa_sm_set_state(fcport, bfa_fcport_sm_disabling); |
430 | bfa_pport_send_disable(pport); | 446 | bfa_fcport_send_disable(fcport); |
431 | break; | 447 | break; |
432 | 448 | ||
433 | case BFA_PPORT_SM_STOP: | 449 | case BFA_FCPORT_SM_STOP: |
434 | bfa_sm_set_state(pport, bfa_pport_sm_stopped); | 450 | bfa_sm_set_state(fcport, bfa_fcport_sm_stopped); |
435 | bfa_reqq_wcancel(&pport->reqq_wait); | 451 | bfa_reqq_wcancel(&fcport->reqq_wait); |
436 | break; | 452 | break; |
437 | 453 | ||
438 | case BFA_PPORT_SM_DISABLE: | 454 | case BFA_FCPORT_SM_DISABLE: |
439 | /** | 455 | /** |
440 | * Already being disabled. | 456 | * Already being disabled. |
441 | */ | 457 | */ |
442 | break; | 458 | break; |
443 | 459 | ||
444 | case BFA_PPORT_SM_LINKUP: | 460 | case BFA_FCPORT_SM_LINKUP: |
445 | case BFA_PPORT_SM_LINKDOWN: | 461 | case BFA_FCPORT_SM_LINKDOWN: |
446 | /** | 462 | /** |
447 | * Possible to get link events when doing back-to-back | 463 | * Possible to get link events when doing back-to-back |
448 | * enable/disables. | 464 | * enable/disables. |
449 | */ | 465 | */ |
450 | break; | 466 | break; |
451 | 467 | ||
452 | case BFA_PPORT_SM_HWFAIL: | 468 | case BFA_FCPORT_SM_HWFAIL: |
453 | bfa_sm_set_state(pport, bfa_pport_sm_iocfail); | 469 | bfa_sm_set_state(fcport, bfa_fcport_sm_iocfail); |
454 | bfa_reqq_wcancel(&pport->reqq_wait); | 470 | bfa_reqq_wcancel(&fcport->reqq_wait); |
455 | break; | 471 | break; |
456 | 472 | ||
457 | default: | 473 | default: |
458 | bfa_sm_fault(pport->bfa, event); | 474 | bfa_sm_fault(fcport->bfa, event); |
459 | } | 475 | } |
460 | } | 476 | } |
461 | 477 | ||
462 | static void | 478 | static void |
463 | bfa_pport_sm_disabling(struct bfa_pport_s *pport, enum bfa_pport_sm_event event) | 479 | bfa_fcport_sm_disabling(struct bfa_fcport_s *fcport, |
480 | enum bfa_fcport_sm_event event) | ||
464 | { | 481 | { |
465 | bfa_trc(pport->bfa, event); | 482 | bfa_trc(fcport->bfa, event); |
466 | 483 | ||
467 | switch (event) { | 484 | switch (event) { |
468 | case BFA_PPORT_SM_FWRSP: | 485 | case BFA_FCPORT_SM_FWRSP: |
469 | bfa_sm_set_state(pport, bfa_pport_sm_disabled); | 486 | bfa_sm_set_state(fcport, bfa_fcport_sm_disabled); |
470 | break; | 487 | break; |
471 | 488 | ||
472 | case BFA_PPORT_SM_DISABLE: | 489 | case BFA_FCPORT_SM_DISABLE: |
473 | /** | 490 | /** |
474 | * Already being disabled. | 491 | * Already being disabled. |
475 | */ | 492 | */ |
476 | break; | 493 | break; |
477 | 494 | ||
478 | case BFA_PPORT_SM_ENABLE: | 495 | case BFA_FCPORT_SM_ENABLE: |
479 | if (bfa_pport_send_enable(pport)) | 496 | if (bfa_fcport_send_enable(fcport)) |
480 | bfa_sm_set_state(pport, bfa_pport_sm_enabling); | 497 | bfa_sm_set_state(fcport, bfa_fcport_sm_enabling); |
481 | else | 498 | else |
482 | bfa_sm_set_state(pport, bfa_pport_sm_enabling_qwait); | 499 | bfa_sm_set_state(fcport, bfa_fcport_sm_enabling_qwait); |
483 | 500 | ||
484 | bfa_plog_str(pport->bfa->plog, BFA_PL_MID_HAL, | 501 | bfa_plog_str(fcport->bfa->plog, BFA_PL_MID_HAL, |
485 | BFA_PL_EID_PORT_ENABLE, 0, "Port Enable"); | 502 | BFA_PL_EID_PORT_ENABLE, 0, "Port Enable"); |
486 | bfa_pport_aen_post(pport, BFA_PORT_AEN_ENABLE); | 503 | bfa_fcport_aen_post(fcport, BFA_PORT_AEN_ENABLE); |
487 | break; | 504 | break; |
488 | 505 | ||
489 | case BFA_PPORT_SM_STOP: | 506 | case BFA_FCPORT_SM_STOP: |
490 | bfa_sm_set_state(pport, bfa_pport_sm_stopped); | 507 | bfa_sm_set_state(fcport, bfa_fcport_sm_stopped); |
491 | break; | 508 | break; |
492 | 509 | ||
493 | case BFA_PPORT_SM_LINKUP: | 510 | case BFA_FCPORT_SM_LINKUP: |
494 | case BFA_PPORT_SM_LINKDOWN: | 511 | case BFA_FCPORT_SM_LINKDOWN: |
495 | /** | 512 | /** |
496 | * Possible to get link events when doing back-to-back | 513 | * Possible to get link events when doing back-to-back |
497 | * enable/disables. | 514 | * enable/disables. |
498 | */ | 515 | */ |
499 | break; | 516 | break; |
500 | 517 | ||
501 | case BFA_PPORT_SM_HWFAIL: | 518 | case BFA_FCPORT_SM_HWFAIL: |
502 | bfa_sm_set_state(pport, bfa_pport_sm_iocfail); | 519 | bfa_sm_set_state(fcport, bfa_fcport_sm_iocfail); |
503 | break; | 520 | break; |
504 | 521 | ||
505 | default: | 522 | default: |
506 | bfa_sm_fault(pport->bfa, event); | 523 | bfa_sm_fault(fcport->bfa, event); |
507 | } | 524 | } |
508 | } | 525 | } |
509 | 526 | ||
510 | static void | 527 | static void |
511 | bfa_pport_sm_disabled(struct bfa_pport_s *pport, enum bfa_pport_sm_event event) | 528 | bfa_fcport_sm_disabled(struct bfa_fcport_s *fcport, |
529 | enum bfa_fcport_sm_event event) | ||
512 | { | 530 | { |
513 | bfa_trc(pport->bfa, event); | 531 | bfa_trc(fcport->bfa, event); |
514 | 532 | ||
515 | switch (event) { | 533 | switch (event) { |
516 | case BFA_PPORT_SM_START: | 534 | case BFA_FCPORT_SM_START: |
517 | /** | 535 | /** |
518 | * Ignore start event for a port that is disabled. | 536 | * Ignore start event for a port that is disabled. |
519 | */ | 537 | */ |
520 | break; | 538 | break; |
521 | 539 | ||
522 | case BFA_PPORT_SM_STOP: | 540 | case BFA_FCPORT_SM_STOP: |
523 | bfa_sm_set_state(pport, bfa_pport_sm_stopped); | 541 | bfa_sm_set_state(fcport, bfa_fcport_sm_stopped); |
524 | break; | 542 | break; |
525 | 543 | ||
526 | case BFA_PPORT_SM_ENABLE: | 544 | case BFA_FCPORT_SM_ENABLE: |
527 | if (bfa_pport_send_enable(pport)) | 545 | if (bfa_fcport_send_enable(fcport)) |
528 | bfa_sm_set_state(pport, bfa_pport_sm_enabling); | 546 | bfa_sm_set_state(fcport, bfa_fcport_sm_enabling); |
529 | else | 547 | else |
530 | bfa_sm_set_state(pport, bfa_pport_sm_enabling_qwait); | 548 | bfa_sm_set_state(fcport, bfa_fcport_sm_enabling_qwait); |
531 | 549 | ||
532 | bfa_plog_str(pport->bfa->plog, BFA_PL_MID_HAL, | 550 | bfa_plog_str(fcport->bfa->plog, BFA_PL_MID_HAL, |
533 | BFA_PL_EID_PORT_ENABLE, 0, "Port Enable"); | 551 | BFA_PL_EID_PORT_ENABLE, 0, "Port Enable"); |
534 | bfa_pport_aen_post(pport, BFA_PORT_AEN_ENABLE); | 552 | bfa_fcport_aen_post(fcport, BFA_PORT_AEN_ENABLE); |
535 | break; | 553 | break; |
536 | 554 | ||
537 | case BFA_PPORT_SM_DISABLE: | 555 | case BFA_FCPORT_SM_DISABLE: |
538 | /** | 556 | /** |
539 | * Already disabled. | 557 | * Already disabled. |
540 | */ | 558 | */ |
541 | break; | 559 | break; |
542 | 560 | ||
543 | case BFA_PPORT_SM_HWFAIL: | 561 | case BFA_FCPORT_SM_HWFAIL: |
544 | bfa_sm_set_state(pport, bfa_pport_sm_iocfail); | 562 | bfa_sm_set_state(fcport, bfa_fcport_sm_iocfail); |
545 | break; | 563 | break; |
546 | 564 | ||
547 | default: | 565 | default: |
548 | bfa_sm_fault(pport->bfa, event); | 566 | bfa_sm_fault(fcport->bfa, event); |
549 | } | 567 | } |
550 | } | 568 | } |
551 | 569 | ||
552 | static void | 570 | static void |
553 | bfa_pport_sm_stopped(struct bfa_pport_s *pport, enum bfa_pport_sm_event event) | 571 | bfa_fcport_sm_stopped(struct bfa_fcport_s *fcport, |
572 | enum bfa_fcport_sm_event event) | ||
554 | { | 573 | { |
555 | bfa_trc(pport->bfa, event); | 574 | bfa_trc(fcport->bfa, event); |
556 | 575 | ||
557 | switch (event) { | 576 | switch (event) { |
558 | case BFA_PPORT_SM_START: | 577 | case BFA_FCPORT_SM_START: |
559 | if (bfa_pport_send_enable(pport)) | 578 | if (bfa_fcport_send_enable(fcport)) |
560 | bfa_sm_set_state(pport, bfa_pport_sm_enabling); | 579 | bfa_sm_set_state(fcport, bfa_fcport_sm_enabling); |
561 | else | 580 | else |
562 | bfa_sm_set_state(pport, bfa_pport_sm_enabling_qwait); | 581 | bfa_sm_set_state(fcport, bfa_fcport_sm_enabling_qwait); |
563 | break; | 582 | break; |
564 | 583 | ||
565 | default: | 584 | default: |
@@ -574,16 +593,17 @@ bfa_pport_sm_stopped(struct bfa_pport_s *pport, enum bfa_pport_sm_event event) | |||
574 | * Port is enabled. IOC is down/failed. | 593 | * Port is enabled. IOC is down/failed. |
575 | */ | 594 | */ |
576 | static void | 595 | static void |
577 | bfa_pport_sm_iocdown(struct bfa_pport_s *pport, enum bfa_pport_sm_event event) | 596 | bfa_fcport_sm_iocdown(struct bfa_fcport_s *fcport, |
597 | enum bfa_fcport_sm_event event) | ||
578 | { | 598 | { |
579 | bfa_trc(pport->bfa, event); | 599 | bfa_trc(fcport->bfa, event); |
580 | 600 | ||
581 | switch (event) { | 601 | switch (event) { |
582 | case BFA_PPORT_SM_START: | 602 | case BFA_FCPORT_SM_START: |
583 | if (bfa_pport_send_enable(pport)) | 603 | if (bfa_fcport_send_enable(fcport)) |
584 | bfa_sm_set_state(pport, bfa_pport_sm_enabling); | 604 | bfa_sm_set_state(fcport, bfa_fcport_sm_enabling); |
585 | else | 605 | else |
586 | bfa_sm_set_state(pport, bfa_pport_sm_enabling_qwait); | 606 | bfa_sm_set_state(fcport, bfa_fcport_sm_enabling_qwait); |
587 | break; | 607 | break; |
588 | 608 | ||
589 | default: | 609 | default: |
@@ -598,17 +618,18 @@ bfa_pport_sm_iocdown(struct bfa_pport_s *pport, enum bfa_pport_sm_event event) | |||
598 | * Port is disabled. IOC is down/failed. | 618 | * Port is disabled. IOC is down/failed. |
599 | */ | 619 | */ |
600 | static void | 620 | static void |
601 | bfa_pport_sm_iocfail(struct bfa_pport_s *pport, enum bfa_pport_sm_event event) | 621 | bfa_fcport_sm_iocfail(struct bfa_fcport_s *fcport, |
622 | enum bfa_fcport_sm_event event) | ||
602 | { | 623 | { |
603 | bfa_trc(pport->bfa, event); | 624 | bfa_trc(fcport->bfa, event); |
604 | 625 | ||
605 | switch (event) { | 626 | switch (event) { |
606 | case BFA_PPORT_SM_START: | 627 | case BFA_FCPORT_SM_START: |
607 | bfa_sm_set_state(pport, bfa_pport_sm_disabled); | 628 | bfa_sm_set_state(fcport, bfa_fcport_sm_disabled); |
608 | break; | 629 | break; |
609 | 630 | ||
610 | case BFA_PPORT_SM_ENABLE: | 631 | case BFA_FCPORT_SM_ENABLE: |
611 | bfa_sm_set_state(pport, bfa_pport_sm_iocdown); | 632 | bfa_sm_set_state(fcport, bfa_fcport_sm_iocdown); |
612 | break; | 633 | break; |
613 | 634 | ||
614 | default: | 635 | default: |
@@ -619,41 +640,226 @@ bfa_pport_sm_iocfail(struct bfa_pport_s *pport, enum bfa_pport_sm_event event) | |||
619 | } | 640 | } |
620 | } | 641 | } |
621 | 642 | ||
643 | /** | ||
644 | * Link state is down | ||
645 | */ | ||
646 | static void | ||
647 | bfa_fcport_ln_sm_dn(struct bfa_fcport_ln_s *ln, | ||
648 | enum bfa_fcport_ln_sm_event event) | ||
649 | { | ||
650 | bfa_trc(ln->fcport->bfa, event); | ||
651 | |||
652 | switch (event) { | ||
653 | case BFA_FCPORT_LN_SM_LINKUP: | ||
654 | bfa_sm_set_state(ln, bfa_fcport_ln_sm_up_nf); | ||
655 | bfa_fcport_queue_cb(ln, BFA_PPORT_LINKUP); | ||
656 | break; | ||
657 | |||
658 | default: | ||
659 | bfa_sm_fault(ln->fcport->bfa, event); | ||
660 | } | ||
661 | } | ||
662 | |||
663 | /** | ||
664 | * Link state is waiting for down notification | ||
665 | */ | ||
666 | static void | ||
667 | bfa_fcport_ln_sm_dn_nf(struct bfa_fcport_ln_s *ln, | ||
668 | enum bfa_fcport_ln_sm_event event) | ||
669 | { | ||
670 | bfa_trc(ln->fcport->bfa, event); | ||
671 | |||
672 | switch (event) { | ||
673 | case BFA_FCPORT_LN_SM_LINKUP: | ||
674 | bfa_sm_set_state(ln, bfa_fcport_ln_sm_dn_up_nf); | ||
675 | break; | ||
676 | |||
677 | case BFA_FCPORT_LN_SM_NOTIFICATION: | ||
678 | bfa_sm_set_state(ln, bfa_fcport_ln_sm_dn); | ||
679 | break; | ||
680 | |||
681 | default: | ||
682 | bfa_sm_fault(ln->fcport->bfa, event); | ||
683 | } | ||
684 | } | ||
685 | |||
686 | /** | ||
687 | * Link state is waiting for down notification and there is a pending up | ||
688 | */ | ||
689 | static void | ||
690 | bfa_fcport_ln_sm_dn_up_nf(struct bfa_fcport_ln_s *ln, | ||
691 | enum bfa_fcport_ln_sm_event event) | ||
692 | { | ||
693 | bfa_trc(ln->fcport->bfa, event); | ||
694 | |||
695 | switch (event) { | ||
696 | case BFA_FCPORT_LN_SM_LINKDOWN: | ||
697 | bfa_sm_set_state(ln, bfa_fcport_ln_sm_dn_nf); | ||
698 | break; | ||
699 | |||
700 | case BFA_FCPORT_LN_SM_NOTIFICATION: | ||
701 | bfa_sm_set_state(ln, bfa_fcport_ln_sm_up_nf); | ||
702 | bfa_fcport_queue_cb(ln, BFA_PPORT_LINKUP); | ||
703 | break; | ||
704 | |||
705 | default: | ||
706 | bfa_sm_fault(ln->fcport->bfa, event); | ||
707 | } | ||
708 | } | ||
709 | |||
710 | /** | ||
711 | * Link state is up | ||
712 | */ | ||
713 | static void | ||
714 | bfa_fcport_ln_sm_up(struct bfa_fcport_ln_s *ln, | ||
715 | enum bfa_fcport_ln_sm_event event) | ||
716 | { | ||
717 | bfa_trc(ln->fcport->bfa, event); | ||
718 | |||
719 | switch (event) { | ||
720 | case BFA_FCPORT_LN_SM_LINKDOWN: | ||
721 | bfa_sm_set_state(ln, bfa_fcport_ln_sm_dn_nf); | ||
722 | bfa_fcport_queue_cb(ln, BFA_PPORT_LINKDOWN); | ||
723 | break; | ||
622 | 724 | ||
725 | default: | ||
726 | bfa_sm_fault(ln->fcport->bfa, event); | ||
727 | } | ||
728 | } | ||
729 | |||
730 | /** | ||
731 | * Link state is waiting for up notification | ||
732 | */ | ||
733 | static void | ||
734 | bfa_fcport_ln_sm_up_nf(struct bfa_fcport_ln_s *ln, | ||
735 | enum bfa_fcport_ln_sm_event event) | ||
736 | { | ||
737 | bfa_trc(ln->fcport->bfa, event); | ||
738 | |||
739 | switch (event) { | ||
740 | case BFA_FCPORT_LN_SM_LINKDOWN: | ||
741 | bfa_sm_set_state(ln, bfa_fcport_ln_sm_up_dn_nf); | ||
742 | break; | ||
743 | |||
744 | case BFA_FCPORT_LN_SM_NOTIFICATION: | ||
745 | bfa_sm_set_state(ln, bfa_fcport_ln_sm_up); | ||
746 | break; | ||
747 | |||
748 | default: | ||
749 | bfa_sm_fault(ln->fcport->bfa, event); | ||
750 | } | ||
751 | } | ||
752 | |||
753 | /** | ||
754 | * Link state is waiting for up notification and there is a pending down | ||
755 | */ | ||
756 | static void | ||
757 | bfa_fcport_ln_sm_up_dn_nf(struct bfa_fcport_ln_s *ln, | ||
758 | enum bfa_fcport_ln_sm_event event) | ||
759 | { | ||
760 | bfa_trc(ln->fcport->bfa, event); | ||
761 | |||
762 | switch (event) { | ||
763 | case BFA_FCPORT_LN_SM_LINKUP: | ||
764 | bfa_sm_set_state(ln, bfa_fcport_ln_sm_up_dn_up_nf); | ||
765 | break; | ||
766 | |||
767 | case BFA_FCPORT_LN_SM_NOTIFICATION: | ||
768 | bfa_sm_set_state(ln, bfa_fcport_ln_sm_dn_nf); | ||
769 | bfa_fcport_queue_cb(ln, BFA_PPORT_LINKDOWN); | ||
770 | break; | ||
771 | |||
772 | default: | ||
773 | bfa_sm_fault(ln->fcport->bfa, event); | ||
774 | } | ||
775 | } | ||
776 | |||
777 | /** | ||
778 | * Link state is waiting for up notification and there are pending down and up | ||
779 | */ | ||
780 | static void | ||
781 | bfa_fcport_ln_sm_up_dn_up_nf(struct bfa_fcport_ln_s *ln, | ||
782 | enum bfa_fcport_ln_sm_event event) | ||
783 | { | ||
784 | bfa_trc(ln->fcport->bfa, event); | ||
785 | |||
786 | switch (event) { | ||
787 | case BFA_FCPORT_LN_SM_LINKDOWN: | ||
788 | bfa_sm_set_state(ln, bfa_fcport_ln_sm_up_dn_nf); | ||
789 | break; | ||
790 | |||
791 | case BFA_FCPORT_LN_SM_NOTIFICATION: | ||
792 | bfa_sm_set_state(ln, bfa_fcport_ln_sm_dn_up_nf); | ||
793 | bfa_fcport_queue_cb(ln, BFA_PPORT_LINKDOWN); | ||
794 | break; | ||
795 | |||
796 | default: | ||
797 | bfa_sm_fault(ln->fcport->bfa, event); | ||
798 | } | ||
799 | } | ||
623 | 800 | ||
624 | /** | 801 | /** |
625 | * bfa_pport_private | 802 | * bfa_pport_private |
626 | */ | 803 | */ |
627 | 804 | ||
628 | static void | 805 | static void |
629 | __bfa_cb_port_event(void *cbarg, bfa_boolean_t complete) | 806 | __bfa_cb_fcport_event(void *cbarg, bfa_boolean_t complete) |
630 | { | 807 | { |
631 | struct bfa_pport_s *pport = cbarg; | 808 | struct bfa_fcport_ln_s *ln = cbarg; |
632 | 809 | ||
633 | if (complete) | 810 | if (complete) |
634 | pport->event_cbfn(pport->event_cbarg, pport->hcb_event); | 811 | ln->fcport->event_cbfn(ln->fcport->event_cbarg, ln->ln_event); |
812 | else | ||
813 | bfa_sm_send_event(ln, BFA_FCPORT_LN_SM_NOTIFICATION); | ||
635 | } | 814 | } |
636 | 815 | ||
637 | #define PPORT_STATS_DMA_SZ (BFA_ROUNDUP(sizeof(union bfa_pport_stats_u), \ | 816 | static void |
817 | bfa_fcport_callback(struct bfa_fcport_s *fcport, enum bfa_pport_linkstate event) | ||
818 | { | ||
819 | if (fcport->bfa->fcs) { | ||
820 | fcport->event_cbfn(fcport->event_cbarg, event); | ||
821 | return; | ||
822 | } | ||
823 | |||
824 | switch (event) { | ||
825 | case BFA_PPORT_LINKUP: | ||
826 | bfa_sm_send_event(&fcport->ln, BFA_FCPORT_LN_SM_LINKUP); | ||
827 | break; | ||
828 | case BFA_PPORT_LINKDOWN: | ||
829 | bfa_sm_send_event(&fcport->ln, BFA_FCPORT_LN_SM_LINKDOWN); | ||
830 | break; | ||
831 | default: | ||
832 | bfa_assert(0); | ||
833 | } | ||
834 | } | ||
835 | |||
836 | static void | ||
837 | bfa_fcport_queue_cb(struct bfa_fcport_ln_s *ln, enum bfa_pport_linkstate event) | ||
838 | { | ||
839 | ln->ln_event = event; | ||
840 | bfa_cb_queue(ln->fcport->bfa, &ln->ln_qe, __bfa_cb_fcport_event, ln); | ||
841 | } | ||
842 | |||
843 | #define FCPORT_STATS_DMA_SZ (BFA_ROUNDUP(sizeof(union bfa_fcport_stats_u), \ | ||
638 | BFA_CACHELINE_SZ)) | 844 | BFA_CACHELINE_SZ)) |
639 | 845 | ||
640 | static void | 846 | static void |
641 | bfa_pport_meminfo(struct bfa_iocfc_cfg_s *cfg, u32 *ndm_len, | 847 | bfa_fcport_meminfo(struct bfa_iocfc_cfg_s *cfg, u32 *ndm_len, |
642 | u32 *dm_len) | 848 | u32 *dm_len) |
643 | { | 849 | { |
644 | *dm_len += PPORT_STATS_DMA_SZ; | 850 | *dm_len += FCPORT_STATS_DMA_SZ; |
645 | } | 851 | } |
646 | 852 | ||
647 | static void | 853 | static void |
648 | bfa_pport_qresume(void *cbarg) | 854 | bfa_fcport_qresume(void *cbarg) |
649 | { | 855 | { |
650 | struct bfa_pport_s *port = cbarg; | 856 | struct bfa_fcport_s *fcport = cbarg; |
651 | 857 | ||
652 | bfa_sm_send_event(port, BFA_PPORT_SM_QRESUME); | 858 | bfa_sm_send_event(fcport, BFA_FCPORT_SM_QRESUME); |
653 | } | 859 | } |
654 | 860 | ||
655 | static void | 861 | static void |
656 | bfa_pport_mem_claim(struct bfa_pport_s *pport, struct bfa_meminfo_s *meminfo) | 862 | bfa_fcport_mem_claim(struct bfa_fcport_s *fcport, struct bfa_meminfo_s *meminfo) |
657 | { | 863 | { |
658 | u8 *dm_kva; | 864 | u8 *dm_kva; |
659 | u64 dm_pa; | 865 | u64 dm_pa; |
@@ -661,12 +867,12 @@ bfa_pport_mem_claim(struct bfa_pport_s *pport, struct bfa_meminfo_s *meminfo) | |||
661 | dm_kva = bfa_meminfo_dma_virt(meminfo); | 867 | dm_kva = bfa_meminfo_dma_virt(meminfo); |
662 | dm_pa = bfa_meminfo_dma_phys(meminfo); | 868 | dm_pa = bfa_meminfo_dma_phys(meminfo); |
663 | 869 | ||
664 | pport->stats_kva = dm_kva; | 870 | fcport->stats_kva = dm_kva; |
665 | pport->stats_pa = dm_pa; | 871 | fcport->stats_pa = dm_pa; |
666 | pport->stats = (union bfa_pport_stats_u *)dm_kva; | 872 | fcport->stats = (union bfa_fcport_stats_u *)dm_kva; |
667 | 873 | ||
668 | dm_kva += PPORT_STATS_DMA_SZ; | 874 | dm_kva += FCPORT_STATS_DMA_SZ; |
669 | dm_pa += PPORT_STATS_DMA_SZ; | 875 | dm_pa += FCPORT_STATS_DMA_SZ; |
670 | 876 | ||
671 | bfa_meminfo_dma_virt(meminfo) = dm_kva; | 877 | bfa_meminfo_dma_virt(meminfo) = dm_kva; |
672 | bfa_meminfo_dma_phys(meminfo) = dm_pa; | 878 | bfa_meminfo_dma_phys(meminfo) = dm_pa; |
@@ -676,18 +882,21 @@ bfa_pport_mem_claim(struct bfa_pport_s *pport, struct bfa_meminfo_s *meminfo) | |||
676 | * Memory initialization. | 882 | * Memory initialization. |
677 | */ | 883 | */ |
678 | static void | 884 | static void |
679 | bfa_pport_attach(struct bfa_s *bfa, void *bfad, struct bfa_iocfc_cfg_s *cfg, | 885 | bfa_fcport_attach(struct bfa_s *bfa, void *bfad, struct bfa_iocfc_cfg_s *cfg, |
680 | struct bfa_meminfo_s *meminfo, struct bfa_pcidev_s *pcidev) | 886 | struct bfa_meminfo_s *meminfo, struct bfa_pcidev_s *pcidev) |
681 | { | 887 | { |
682 | struct bfa_pport_s *pport = BFA_PORT_MOD(bfa); | 888 | struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(bfa); |
683 | struct bfa_pport_cfg_s *port_cfg = &pport->cfg; | 889 | struct bfa_pport_cfg_s *port_cfg = &fcport->cfg; |
890 | struct bfa_fcport_ln_s *ln = &fcport->ln; | ||
684 | 891 | ||
685 | bfa_os_memset(pport, 0, sizeof(struct bfa_pport_s)); | 892 | bfa_os_memset(fcport, 0, sizeof(struct bfa_fcport_s)); |
686 | pport->bfa = bfa; | 893 | fcport->bfa = bfa; |
894 | ln->fcport = fcport; | ||
687 | 895 | ||
688 | bfa_pport_mem_claim(pport, meminfo); | 896 | bfa_fcport_mem_claim(fcport, meminfo); |
689 | 897 | ||
690 | bfa_sm_set_state(pport, bfa_pport_sm_uninit); | 898 | bfa_sm_set_state(fcport, bfa_fcport_sm_uninit); |
899 | bfa_sm_set_state(ln, bfa_fcport_ln_sm_dn); | ||
691 | 900 | ||
692 | /** | 901 | /** |
693 | * initialize and set default configuration | 902 | * initialize and set default configuration |
@@ -699,30 +908,30 @@ bfa_pport_attach(struct bfa_s *bfa, void *bfad, struct bfa_iocfc_cfg_s *cfg, | |||
699 | 908 | ||
700 | port_cfg->trl_def_speed = BFA_PPORT_SPEED_1GBPS; | 909 | port_cfg->trl_def_speed = BFA_PPORT_SPEED_1GBPS; |
701 | 910 | ||
702 | bfa_reqq_winit(&pport->reqq_wait, bfa_pport_qresume, pport); | 911 | bfa_reqq_winit(&fcport->reqq_wait, bfa_fcport_qresume, fcport); |
703 | } | 912 | } |
704 | 913 | ||
705 | static void | 914 | static void |
706 | bfa_pport_initdone(struct bfa_s *bfa) | 915 | bfa_fcport_initdone(struct bfa_s *bfa) |
707 | { | 916 | { |
708 | struct bfa_pport_s *pport = BFA_PORT_MOD(bfa); | 917 | struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(bfa); |
709 | 918 | ||
710 | /** | 919 | /** |
711 | * Initialize port attributes from IOC hardware data. | 920 | * Initialize port attributes from IOC hardware data. |
712 | */ | 921 | */ |
713 | bfa_pport_set_wwns(pport); | 922 | bfa_fcport_set_wwns(fcport); |
714 | if (pport->cfg.maxfrsize == 0) | 923 | if (fcport->cfg.maxfrsize == 0) |
715 | pport->cfg.maxfrsize = bfa_ioc_maxfrsize(&bfa->ioc); | 924 | fcport->cfg.maxfrsize = bfa_ioc_maxfrsize(&bfa->ioc); |
716 | pport->cfg.rx_bbcredit = bfa_ioc_rx_bbcredit(&bfa->ioc); | 925 | fcport->cfg.rx_bbcredit = bfa_ioc_rx_bbcredit(&bfa->ioc); |
717 | pport->speed_sup = bfa_ioc_speed_sup(&bfa->ioc); | 926 | fcport->speed_sup = bfa_ioc_speed_sup(&bfa->ioc); |
718 | 927 | ||
719 | bfa_assert(pport->cfg.maxfrsize); | 928 | bfa_assert(fcport->cfg.maxfrsize); |
720 | bfa_assert(pport->cfg.rx_bbcredit); | 929 | bfa_assert(fcport->cfg.rx_bbcredit); |
721 | bfa_assert(pport->speed_sup); | 930 | bfa_assert(fcport->speed_sup); |
722 | } | 931 | } |
723 | 932 | ||
724 | static void | 933 | static void |
725 | bfa_pport_detach(struct bfa_s *bfa) | 934 | bfa_fcport_detach(struct bfa_s *bfa) |
726 | { | 935 | { |
727 | } | 936 | } |
728 | 937 | ||
@@ -730,95 +939,97 @@ bfa_pport_detach(struct bfa_s *bfa) | |||
730 | * Called when IOC is ready. | 939 | * Called when IOC is ready. |
731 | */ | 940 | */ |
732 | static void | 941 | static void |
733 | bfa_pport_start(struct bfa_s *bfa) | 942 | bfa_fcport_start(struct bfa_s *bfa) |
734 | { | 943 | { |
735 | bfa_sm_send_event(BFA_PORT_MOD(bfa), BFA_PPORT_SM_START); | 944 | bfa_sm_send_event(BFA_FCPORT_MOD(bfa), BFA_FCPORT_SM_START); |
736 | } | 945 | } |
737 | 946 | ||
738 | /** | 947 | /** |
739 | * Called before IOC is stopped. | 948 | * Called before IOC is stopped. |
740 | */ | 949 | */ |
741 | static void | 950 | static void |
742 | bfa_pport_stop(struct bfa_s *bfa) | 951 | bfa_fcport_stop(struct bfa_s *bfa) |
743 | { | 952 | { |
744 | bfa_sm_send_event(BFA_PORT_MOD(bfa), BFA_PPORT_SM_STOP); | 953 | bfa_sm_send_event(BFA_FCPORT_MOD(bfa), BFA_FCPORT_SM_STOP); |
745 | } | 954 | } |
746 | 955 | ||
747 | /** | 956 | /** |
748 | * Called when IOC failure is detected. | 957 | * Called when IOC failure is detected. |
749 | */ | 958 | */ |
750 | static void | 959 | static void |
751 | bfa_pport_iocdisable(struct bfa_s *bfa) | 960 | bfa_fcport_iocdisable(struct bfa_s *bfa) |
752 | { | 961 | { |
753 | bfa_sm_send_event(BFA_PORT_MOD(bfa), BFA_PPORT_SM_HWFAIL); | 962 | bfa_sm_send_event(BFA_FCPORT_MOD(bfa), BFA_FCPORT_SM_HWFAIL); |
754 | } | 963 | } |
755 | 964 | ||
756 | static void | 965 | static void |
757 | bfa_pport_update_linkinfo(struct bfa_pport_s *pport) | 966 | bfa_fcport_update_linkinfo(struct bfa_fcport_s *fcport) |
758 | { | 967 | { |
759 | struct bfi_pport_event_s *pevent = pport->event_arg.i2hmsg.event; | 968 | struct bfi_fcport_event_s *pevent = fcport->event_arg.i2hmsg.event; |
760 | 969 | ||
761 | pport->speed = pevent->link_state.speed; | 970 | fcport->speed = pevent->link_state.speed; |
762 | pport->topology = pevent->link_state.topology; | 971 | fcport->topology = pevent->link_state.topology; |
763 | 972 | ||
764 | if (pport->topology == BFA_PPORT_TOPOLOGY_LOOP) | 973 | if (fcport->topology == BFA_PPORT_TOPOLOGY_LOOP) |
765 | pport->myalpa = pevent->link_state.tl.loop_info.myalpa; | 974 | fcport->myalpa = |
975 | pevent->link_state.tl.loop_info.myalpa; | ||
766 | 976 | ||
767 | /* | 977 | /* |
768 | * QoS Details | 978 | * QoS Details |
769 | */ | 979 | */ |
770 | bfa_os_assign(pport->qos_attr, pevent->link_state.qos_attr); | 980 | bfa_os_assign(fcport->qos_attr, pevent->link_state.qos_attr); |
771 | bfa_os_assign(pport->qos_vc_attr, pevent->link_state.qos_vc_attr); | 981 | bfa_os_assign(fcport->qos_vc_attr, pevent->link_state.qos_vc_attr); |
772 | 982 | ||
773 | bfa_trc(pport->bfa, pport->speed); | 983 | bfa_trc(fcport->bfa, fcport->speed); |
774 | bfa_trc(pport->bfa, pport->topology); | 984 | bfa_trc(fcport->bfa, fcport->topology); |
775 | } | 985 | } |
776 | 986 | ||
777 | static void | 987 | static void |
778 | bfa_pport_reset_linkinfo(struct bfa_pport_s *pport) | 988 | bfa_fcport_reset_linkinfo(struct bfa_fcport_s *fcport) |
779 | { | 989 | { |
780 | pport->speed = BFA_PPORT_SPEED_UNKNOWN; | 990 | fcport->speed = BFA_PPORT_SPEED_UNKNOWN; |
781 | pport->topology = BFA_PPORT_TOPOLOGY_NONE; | 991 | fcport->topology = BFA_PPORT_TOPOLOGY_NONE; |
782 | } | 992 | } |
783 | 993 | ||
784 | /** | 994 | /** |
785 | * Send port enable message to firmware. | 995 | * Send port enable message to firmware. |
786 | */ | 996 | */ |
787 | static bfa_boolean_t | 997 | static bfa_boolean_t |
788 | bfa_pport_send_enable(struct bfa_pport_s *port) | 998 | bfa_fcport_send_enable(struct bfa_fcport_s *fcport) |
789 | { | 999 | { |
790 | struct bfi_pport_enable_req_s *m; | 1000 | struct bfi_fcport_enable_req_s *m; |
791 | 1001 | ||
792 | /** | 1002 | /** |
793 | * Increment message tag before queue check, so that responses to old | 1003 | * Increment message tag before queue check, so that responses to old |
794 | * requests are discarded. | 1004 | * requests are discarded. |
795 | */ | 1005 | */ |
796 | port->msgtag++; | 1006 | fcport->msgtag++; |
797 | 1007 | ||
798 | /** | 1008 | /** |
799 | * check for room in queue to send request now | 1009 | * check for room in queue to send request now |
800 | */ | 1010 | */ |
801 | m = bfa_reqq_next(port->bfa, BFA_REQQ_PORT); | 1011 | m = bfa_reqq_next(fcport->bfa, BFA_REQQ_PORT); |
802 | if (!m) { | 1012 | if (!m) { |
803 | bfa_reqq_wait(port->bfa, BFA_REQQ_PORT, &port->reqq_wait); | 1013 | bfa_reqq_wait(fcport->bfa, BFA_REQQ_PORT, |
1014 | &fcport->reqq_wait); | ||
804 | return BFA_FALSE; | 1015 | return BFA_FALSE; |
805 | } | 1016 | } |
806 | 1017 | ||
807 | bfi_h2i_set(m->mh, BFI_MC_FC_PORT, BFI_PPORT_H2I_ENABLE_REQ, | 1018 | bfi_h2i_set(m->mh, BFI_MC_FCPORT, BFI_FCPORT_H2I_ENABLE_REQ, |
808 | bfa_lpuid(port->bfa)); | 1019 | bfa_lpuid(fcport->bfa)); |
809 | m->nwwn = port->nwwn; | 1020 | m->nwwn = fcport->nwwn; |
810 | m->pwwn = port->pwwn; | 1021 | m->pwwn = fcport->pwwn; |
811 | m->port_cfg = port->cfg; | 1022 | m->port_cfg = fcport->cfg; |
812 | m->msgtag = port->msgtag; | 1023 | m->msgtag = fcport->msgtag; |
813 | m->port_cfg.maxfrsize = bfa_os_htons(port->cfg.maxfrsize); | 1024 | m->port_cfg.maxfrsize = bfa_os_htons(fcport->cfg.maxfrsize); |
814 | bfa_dma_be_addr_set(m->stats_dma_addr, port->stats_pa); | 1025 | bfa_dma_be_addr_set(m->stats_dma_addr, fcport->stats_pa); |
815 | bfa_trc(port->bfa, m->stats_dma_addr.a32.addr_lo); | 1026 | bfa_trc(fcport->bfa, m->stats_dma_addr.a32.addr_lo); |
816 | bfa_trc(port->bfa, m->stats_dma_addr.a32.addr_hi); | 1027 | bfa_trc(fcport->bfa, m->stats_dma_addr.a32.addr_hi); |
817 | 1028 | ||
818 | /** | 1029 | /** |
819 | * queue I/O message to firmware | 1030 | * queue I/O message to firmware |
820 | */ | 1031 | */ |
821 | bfa_reqq_produce(port->bfa, BFA_REQQ_PORT); | 1032 | bfa_reqq_produce(fcport->bfa, BFA_REQQ_PORT); |
822 | return BFA_TRUE; | 1033 | return BFA_TRUE; |
823 | } | 1034 | } |
824 | 1035 | ||
@@ -826,74 +1037,226 @@ bfa_pport_send_enable(struct bfa_pport_s *port) | |||
826 | * Send port disable message to firmware. | 1037 | * Send port disable message to firmware. |
827 | */ | 1038 | */ |
828 | static bfa_boolean_t | 1039 | static bfa_boolean_t |
829 | bfa_pport_send_disable(struct bfa_pport_s *port) | 1040 | bfa_fcport_send_disable(struct bfa_fcport_s *fcport) |
830 | { | 1041 | { |
831 | bfi_pport_disable_req_t *m; | 1042 | struct bfi_fcport_req_s *m; |
832 | 1043 | ||
833 | /** | 1044 | /** |
834 | * Increment message tag before queue check, so that responses to old | 1045 | * Increment message tag before queue check, so that responses to old |
835 | * requests are discarded. | 1046 | * requests are discarded. |
836 | */ | 1047 | */ |
837 | port->msgtag++; | 1048 | fcport->msgtag++; |
838 | 1049 | ||
839 | /** | 1050 | /** |
840 | * check for room in queue to send request now | 1051 | * check for room in queue to send request now |
841 | */ | 1052 | */ |
842 | m = bfa_reqq_next(port->bfa, BFA_REQQ_PORT); | 1053 | m = bfa_reqq_next(fcport->bfa, BFA_REQQ_PORT); |
843 | if (!m) { | 1054 | if (!m) { |
844 | bfa_reqq_wait(port->bfa, BFA_REQQ_PORT, &port->reqq_wait); | 1055 | bfa_reqq_wait(fcport->bfa, BFA_REQQ_PORT, |
1056 | &fcport->reqq_wait); | ||
845 | return BFA_FALSE; | 1057 | return BFA_FALSE; |
846 | } | 1058 | } |
847 | 1059 | ||
848 | bfi_h2i_set(m->mh, BFI_MC_FC_PORT, BFI_PPORT_H2I_DISABLE_REQ, | 1060 | bfi_h2i_set(m->mh, BFI_MC_FCPORT, BFI_FCPORT_H2I_DISABLE_REQ, |
849 | bfa_lpuid(port->bfa)); | 1061 | bfa_lpuid(fcport->bfa)); |
850 | m->msgtag = port->msgtag; | 1062 | m->msgtag = fcport->msgtag; |
851 | 1063 | ||
852 | /** | 1064 | /** |
853 | * queue I/O message to firmware | 1065 | * queue I/O message to firmware |
854 | */ | 1066 | */ |
855 | bfa_reqq_produce(port->bfa, BFA_REQQ_PORT); | 1067 | bfa_reqq_produce(fcport->bfa, BFA_REQQ_PORT); |
856 | 1068 | ||
857 | return BFA_TRUE; | 1069 | return BFA_TRUE; |
858 | } | 1070 | } |
859 | 1071 | ||
860 | static void | 1072 | static void |
861 | bfa_pport_set_wwns(struct bfa_pport_s *port) | 1073 | bfa_fcport_set_wwns(struct bfa_fcport_s *fcport) |
862 | { | 1074 | { |
863 | port->pwwn = bfa_ioc_get_pwwn(&port->bfa->ioc); | 1075 | fcport->pwwn = bfa_ioc_get_pwwn(&fcport->bfa->ioc); |
864 | port->nwwn = bfa_ioc_get_nwwn(&port->bfa->ioc); | 1076 | fcport->nwwn = bfa_ioc_get_nwwn(&fcport->bfa->ioc); |
865 | 1077 | ||
866 | bfa_trc(port->bfa, port->pwwn); | 1078 | bfa_trc(fcport->bfa, fcport->pwwn); |
867 | bfa_trc(port->bfa, port->nwwn); | 1079 | bfa_trc(fcport->bfa, fcport->nwwn); |
868 | } | 1080 | } |
869 | 1081 | ||
870 | static void | 1082 | static void |
871 | bfa_port_send_txcredit(void *port_cbarg) | 1083 | bfa_fcport_send_txcredit(void *port_cbarg) |
872 | { | 1084 | { |
873 | 1085 | ||
874 | struct bfa_pport_s *port = port_cbarg; | 1086 | struct bfa_fcport_s *fcport = port_cbarg; |
875 | struct bfi_pport_set_svc_params_req_s *m; | 1087 | struct bfi_fcport_set_svc_params_req_s *m; |
876 | 1088 | ||
877 | /** | 1089 | /** |
878 | * check for room in queue to send request now | 1090 | * check for room in queue to send request now |
879 | */ | 1091 | */ |
880 | m = bfa_reqq_next(port->bfa, BFA_REQQ_PORT); | 1092 | m = bfa_reqq_next(fcport->bfa, BFA_REQQ_PORT); |
881 | if (!m) { | 1093 | if (!m) { |
882 | bfa_trc(port->bfa, port->cfg.tx_bbcredit); | 1094 | bfa_trc(fcport->bfa, fcport->cfg.tx_bbcredit); |
883 | return; | 1095 | return; |
884 | } | 1096 | } |
885 | 1097 | ||
886 | bfi_h2i_set(m->mh, BFI_MC_FC_PORT, BFI_PPORT_H2I_SET_SVC_PARAMS_REQ, | 1098 | bfi_h2i_set(m->mh, BFI_MC_FCPORT, BFI_FCPORT_H2I_SET_SVC_PARAMS_REQ, |
887 | bfa_lpuid(port->bfa)); | 1099 | bfa_lpuid(fcport->bfa)); |
888 | m->tx_bbcredit = bfa_os_htons((u16) port->cfg.tx_bbcredit); | 1100 | m->tx_bbcredit = bfa_os_htons((u16) fcport->cfg.tx_bbcredit); |
889 | 1101 | ||
890 | /** | 1102 | /** |
891 | * queue I/O message to firmware | 1103 | * queue I/O message to firmware |
892 | */ | 1104 | */ |
893 | bfa_reqq_produce(port->bfa, BFA_REQQ_PORT); | 1105 | bfa_reqq_produce(fcport->bfa, BFA_REQQ_PORT); |
894 | } | 1106 | } |
895 | 1107 | ||
1108 | static void | ||
1109 | bfa_fcport_qos_stats_swap(struct bfa_qos_stats_s *d, | ||
1110 | struct bfa_qos_stats_s *s) | ||
1111 | { | ||
1112 | u32 *dip = (u32 *) d; | ||
1113 | u32 *sip = (u32 *) s; | ||
1114 | int i; | ||
1115 | |||
1116 | /* Now swap the 32 bit fields */ | ||
1117 | for (i = 0; i < (sizeof(struct bfa_qos_stats_s)/sizeof(u32)); ++i) | ||
1118 | dip[i] = bfa_os_ntohl(sip[i]); | ||
1119 | } | ||
896 | 1120 | ||
1121 | static void | ||
1122 | bfa_fcport_fcoe_stats_swap(struct bfa_fcoe_stats_s *d, | ||
1123 | struct bfa_fcoe_stats_s *s) | ||
1124 | { | ||
1125 | u32 *dip = (u32 *) d; | ||
1126 | u32 *sip = (u32 *) s; | ||
1127 | int i; | ||
1128 | |||
1129 | for (i = 0; i < ((sizeof(struct bfa_fcoe_stats_s))/sizeof(u32)); | ||
1130 | i = i + 2) { | ||
1131 | #ifdef __BIGENDIAN | ||
1132 | dip[i] = bfa_os_ntohl(sip[i]); | ||
1133 | dip[i + 1] = bfa_os_ntohl(sip[i + 1]); | ||
1134 | #else | ||
1135 | dip[i] = bfa_os_ntohl(sip[i + 1]); | ||
1136 | dip[i + 1] = bfa_os_ntohl(sip[i]); | ||
1137 | #endif | ||
1138 | } | ||
1139 | } | ||
1140 | |||
1141 | static void | ||
1142 | __bfa_cb_fcport_stats_get(void *cbarg, bfa_boolean_t complete) | ||
1143 | { | ||
1144 | struct bfa_fcport_s *fcport = cbarg; | ||
1145 | |||
1146 | if (complete) { | ||
1147 | if (fcport->stats_status == BFA_STATUS_OK) { | ||
1148 | |||
1149 | /* Swap FC QoS or FCoE stats */ | ||
1150 | if (bfa_ioc_get_fcmode(&fcport->bfa->ioc)) | ||
1151 | bfa_fcport_qos_stats_swap( | ||
1152 | &fcport->stats_ret->fcqos, | ||
1153 | &fcport->stats->fcqos); | ||
1154 | else | ||
1155 | bfa_fcport_fcoe_stats_swap( | ||
1156 | &fcport->stats_ret->fcoe, | ||
1157 | &fcport->stats->fcoe); | ||
1158 | } | ||
1159 | fcport->stats_cbfn(fcport->stats_cbarg, fcport->stats_status); | ||
1160 | } else { | ||
1161 | fcport->stats_busy = BFA_FALSE; | ||
1162 | fcport->stats_status = BFA_STATUS_OK; | ||
1163 | } | ||
1164 | } | ||
1165 | |||
1166 | static void | ||
1167 | bfa_fcport_stats_get_timeout(void *cbarg) | ||
1168 | { | ||
1169 | struct bfa_fcport_s *fcport = (struct bfa_fcport_s *) cbarg; | ||
1170 | |||
1171 | bfa_trc(fcport->bfa, fcport->stats_qfull); | ||
1172 | |||
1173 | if (fcport->stats_qfull) { | ||
1174 | bfa_reqq_wcancel(&fcport->stats_reqq_wait); | ||
1175 | fcport->stats_qfull = BFA_FALSE; | ||
1176 | } | ||
1177 | |||
1178 | fcport->stats_status = BFA_STATUS_ETIMER; | ||
1179 | bfa_cb_queue(fcport->bfa, &fcport->hcb_qe, __bfa_cb_fcport_stats_get, | ||
1180 | fcport); | ||
1181 | } | ||
1182 | |||
1183 | static void | ||
1184 | bfa_fcport_send_stats_get(void *cbarg) | ||
1185 | { | ||
1186 | struct bfa_fcport_s *fcport = (struct bfa_fcport_s *) cbarg; | ||
1187 | struct bfi_fcport_req_s *msg; | ||
1188 | |||
1189 | msg = bfa_reqq_next(fcport->bfa, BFA_REQQ_PORT); | ||
1190 | |||
1191 | if (!msg) { | ||
1192 | fcport->stats_qfull = BFA_TRUE; | ||
1193 | bfa_reqq_winit(&fcport->stats_reqq_wait, | ||
1194 | bfa_fcport_send_stats_get, fcport); | ||
1195 | bfa_reqq_wait(fcport->bfa, BFA_REQQ_PORT, | ||
1196 | &fcport->stats_reqq_wait); | ||
1197 | return; | ||
1198 | } | ||
1199 | fcport->stats_qfull = BFA_FALSE; | ||
1200 | |||
1201 | bfa_os_memset(msg, 0, sizeof(struct bfi_fcport_req_s)); | ||
1202 | bfi_h2i_set(msg->mh, BFI_MC_FCPORT, BFI_FCPORT_H2I_STATS_GET_REQ, | ||
1203 | bfa_lpuid(fcport->bfa)); | ||
1204 | bfa_reqq_produce(fcport->bfa, BFA_REQQ_PORT); | ||
1205 | } | ||
1206 | |||
1207 | static void | ||
1208 | __bfa_cb_fcport_stats_clr(void *cbarg, bfa_boolean_t complete) | ||
1209 | { | ||
1210 | struct bfa_fcport_s *fcport = cbarg; | ||
1211 | |||
1212 | if (complete) { | ||
1213 | fcport->stats_cbfn(fcport->stats_cbarg, fcport->stats_status); | ||
1214 | } else { | ||
1215 | fcport->stats_busy = BFA_FALSE; | ||
1216 | fcport->stats_status = BFA_STATUS_OK; | ||
1217 | } | ||
1218 | } | ||
1219 | |||
1220 | static void | ||
1221 | bfa_fcport_stats_clr_timeout(void *cbarg) | ||
1222 | { | ||
1223 | struct bfa_fcport_s *fcport = (struct bfa_fcport_s *) cbarg; | ||
1224 | |||
1225 | bfa_trc(fcport->bfa, fcport->stats_qfull); | ||
1226 | |||
1227 | if (fcport->stats_qfull) { | ||
1228 | bfa_reqq_wcancel(&fcport->stats_reqq_wait); | ||
1229 | fcport->stats_qfull = BFA_FALSE; | ||
1230 | } | ||
1231 | |||
1232 | fcport->stats_status = BFA_STATUS_ETIMER; | ||
1233 | bfa_cb_queue(fcport->bfa, &fcport->hcb_qe, | ||
1234 | __bfa_cb_fcport_stats_clr, fcport); | ||
1235 | } | ||
1236 | |||
1237 | static void | ||
1238 | bfa_fcport_send_stats_clear(void *cbarg) | ||
1239 | { | ||
1240 | struct bfa_fcport_s *fcport = (struct bfa_fcport_s *) cbarg; | ||
1241 | struct bfi_fcport_req_s *msg; | ||
1242 | |||
1243 | msg = bfa_reqq_next(fcport->bfa, BFA_REQQ_PORT); | ||
1244 | |||
1245 | if (!msg) { | ||
1246 | fcport->stats_qfull = BFA_TRUE; | ||
1247 | bfa_reqq_winit(&fcport->stats_reqq_wait, | ||
1248 | bfa_fcport_send_stats_clear, fcport); | ||
1249 | bfa_reqq_wait(fcport->bfa, BFA_REQQ_PORT, | ||
1250 | &fcport->stats_reqq_wait); | ||
1251 | return; | ||
1252 | } | ||
1253 | fcport->stats_qfull = BFA_FALSE; | ||
1254 | |||
1255 | bfa_os_memset(msg, 0, sizeof(struct bfi_fcport_req_s)); | ||
1256 | bfi_h2i_set(msg->mh, BFI_MC_FCPORT, BFI_FCPORT_H2I_STATS_CLEAR_REQ, | ||
1257 | bfa_lpuid(fcport->bfa)); | ||
1258 | bfa_reqq_produce(fcport->bfa, BFA_REQQ_PORT); | ||
1259 | } | ||
897 | 1260 | ||
898 | /** | 1261 | /** |
899 | * bfa_pport_public | 1262 | * bfa_pport_public |
@@ -903,32 +1266,32 @@ bfa_port_send_txcredit(void *port_cbarg) | |||
903 | * Firmware message handler. | 1266 | * Firmware message handler. |
904 | */ | 1267 | */ |
905 | void | 1268 | void |
906 | bfa_pport_isr(struct bfa_s *bfa, struct bfi_msg_s *msg) | 1269 | bfa_fcport_isr(struct bfa_s *bfa, struct bfi_msg_s *msg) |
907 | { | 1270 | { |
908 | struct bfa_pport_s *pport = BFA_PORT_MOD(bfa); | 1271 | struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(bfa); |
909 | union bfi_pport_i2h_msg_u i2hmsg; | 1272 | union bfi_fcport_i2h_msg_u i2hmsg; |
910 | 1273 | ||
911 | i2hmsg.msg = msg; | 1274 | i2hmsg.msg = msg; |
912 | pport->event_arg.i2hmsg = i2hmsg; | 1275 | fcport->event_arg.i2hmsg = i2hmsg; |
913 | 1276 | ||
914 | switch (msg->mhdr.msg_id) { | 1277 | switch (msg->mhdr.msg_id) { |
915 | case BFI_PPORT_I2H_ENABLE_RSP: | 1278 | case BFI_FCPORT_I2H_ENABLE_RSP: |
916 | if (pport->msgtag == i2hmsg.enable_rsp->msgtag) | 1279 | if (fcport->msgtag == i2hmsg.penable_rsp->msgtag) |
917 | bfa_sm_send_event(pport, BFA_PPORT_SM_FWRSP); | 1280 | bfa_sm_send_event(fcport, BFA_FCPORT_SM_FWRSP); |
918 | break; | 1281 | break; |
919 | 1282 | ||
920 | case BFI_PPORT_I2H_DISABLE_RSP: | 1283 | case BFI_FCPORT_I2H_DISABLE_RSP: |
921 | if (pport->msgtag == i2hmsg.enable_rsp->msgtag) | 1284 | if (fcport->msgtag == i2hmsg.penable_rsp->msgtag) |
922 | bfa_sm_send_event(pport, BFA_PPORT_SM_FWRSP); | 1285 | bfa_sm_send_event(fcport, BFA_FCPORT_SM_FWRSP); |
923 | break; | 1286 | break; |
924 | 1287 | ||
925 | case BFI_PPORT_I2H_EVENT: | 1288 | case BFI_FCPORT_I2H_EVENT: |
926 | switch (i2hmsg.event->link_state.linkstate) { | 1289 | switch (i2hmsg.event->link_state.linkstate) { |
927 | case BFA_PPORT_LINKUP: | 1290 | case BFA_PPORT_LINKUP: |
928 | bfa_sm_send_event(pport, BFA_PPORT_SM_LINKUP); | 1291 | bfa_sm_send_event(fcport, BFA_FCPORT_SM_LINKUP); |
929 | break; | 1292 | break; |
930 | case BFA_PPORT_LINKDOWN: | 1293 | case BFA_PPORT_LINKDOWN: |
931 | bfa_sm_send_event(pport, BFA_PPORT_SM_LINKDOWN); | 1294 | bfa_sm_send_event(fcport, BFA_FCPORT_SM_LINKDOWN); |
932 | break; | 1295 | break; |
933 | case BFA_PPORT_TRUNK_LINKDOWN: | 1296 | case BFA_PPORT_TRUNK_LINKDOWN: |
934 | /** todo: event notification */ | 1297 | /** todo: event notification */ |
@@ -936,42 +1299,40 @@ bfa_pport_isr(struct bfa_s *bfa, struct bfi_msg_s *msg) | |||
936 | } | 1299 | } |
937 | break; | 1300 | break; |
938 | 1301 | ||
939 | case BFI_PPORT_I2H_GET_STATS_RSP: | 1302 | case BFI_FCPORT_I2H_STATS_GET_RSP: |
940 | case BFI_PPORT_I2H_GET_QOS_STATS_RSP: | ||
941 | /* | 1303 | /* |
942 | * check for timer pop before processing the rsp | 1304 | * check for timer pop before processing the rsp |
943 | */ | 1305 | */ |
944 | if (pport->stats_busy == BFA_FALSE | 1306 | if (fcport->stats_busy == BFA_FALSE || |
945 | || pport->stats_status == BFA_STATUS_ETIMER) | 1307 | fcport->stats_status == BFA_STATUS_ETIMER) |
946 | break; | 1308 | break; |
947 | 1309 | ||
948 | bfa_timer_stop(&pport->timer); | 1310 | bfa_timer_stop(&fcport->timer); |
949 | pport->stats_status = i2hmsg.getstats_rsp->status; | 1311 | fcport->stats_status = i2hmsg.pstatsget_rsp->status; |
950 | bfa_cb_queue(pport->bfa, &pport->hcb_qe, __bfa_cb_port_stats, | 1312 | bfa_cb_queue(fcport->bfa, &fcport->hcb_qe, |
951 | pport); | 1313 | __bfa_cb_fcport_stats_get, fcport); |
952 | break; | 1314 | break; |
953 | case BFI_PPORT_I2H_CLEAR_STATS_RSP: | 1315 | |
954 | case BFI_PPORT_I2H_CLEAR_QOS_STATS_RSP: | 1316 | case BFI_FCPORT_I2H_STATS_CLEAR_RSP: |
955 | /* | 1317 | /* |
956 | * check for timer pop before processing the rsp | 1318 | * check for timer pop before processing the rsp |
957 | */ | 1319 | */ |
958 | if (pport->stats_busy == BFA_FALSE | 1320 | if (fcport->stats_busy == BFA_FALSE || |
959 | || pport->stats_status == BFA_STATUS_ETIMER) | 1321 | fcport->stats_status == BFA_STATUS_ETIMER) |
960 | break; | 1322 | break; |
961 | 1323 | ||
962 | bfa_timer_stop(&pport->timer); | 1324 | bfa_timer_stop(&fcport->timer); |
963 | pport->stats_status = BFA_STATUS_OK; | 1325 | fcport->stats_status = BFA_STATUS_OK; |
964 | bfa_cb_queue(pport->bfa, &pport->hcb_qe, | 1326 | bfa_cb_queue(fcport->bfa, &fcport->hcb_qe, |
965 | __bfa_cb_port_stats_clr, pport); | 1327 | __bfa_cb_fcport_stats_clr, fcport); |
966 | break; | 1328 | break; |
967 | 1329 | ||
968 | default: | 1330 | default: |
969 | bfa_assert(0); | 1331 | bfa_assert(0); |
1332 | break; | ||
970 | } | 1333 | } |
971 | } | 1334 | } |
972 | 1335 | ||
973 | |||
974 | |||
975 | /** | 1336 | /** |
976 | * bfa_pport_api | 1337 | * bfa_pport_api |
977 | */ | 1338 | */ |
@@ -980,35 +1341,35 @@ bfa_pport_isr(struct bfa_s *bfa, struct bfi_msg_s *msg) | |||
980 | * Registered callback for port events. | 1341 | * Registered callback for port events. |
981 | */ | 1342 | */ |
982 | void | 1343 | void |
983 | bfa_pport_event_register(struct bfa_s *bfa, | 1344 | bfa_fcport_event_register(struct bfa_s *bfa, |
984 | void (*cbfn) (void *cbarg, bfa_pport_event_t event), | 1345 | void (*cbfn) (void *cbarg, bfa_pport_event_t event), |
985 | void *cbarg) | 1346 | void *cbarg) |
986 | { | 1347 | { |
987 | struct bfa_pport_s *pport = BFA_PORT_MOD(bfa); | 1348 | struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(bfa); |
988 | 1349 | ||
989 | pport->event_cbfn = cbfn; | 1350 | fcport->event_cbfn = cbfn; |
990 | pport->event_cbarg = cbarg; | 1351 | fcport->event_cbarg = cbarg; |
991 | } | 1352 | } |
992 | 1353 | ||
993 | bfa_status_t | 1354 | bfa_status_t |
994 | bfa_pport_enable(struct bfa_s *bfa) | 1355 | bfa_fcport_enable(struct bfa_s *bfa) |
995 | { | 1356 | { |
996 | struct bfa_pport_s *pport = BFA_PORT_MOD(bfa); | 1357 | struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(bfa); |
997 | 1358 | ||
998 | if (pport->diag_busy) | 1359 | if (fcport->diag_busy) |
999 | return BFA_STATUS_DIAG_BUSY; | 1360 | return BFA_STATUS_DIAG_BUSY; |
1000 | else if (bfa_sm_cmp_state | 1361 | else if (bfa_sm_cmp_state |
1001 | (BFA_PORT_MOD(bfa), bfa_pport_sm_disabling_qwait)) | 1362 | (BFA_FCPORT_MOD(bfa), bfa_fcport_sm_disabling_qwait)) |
1002 | return BFA_STATUS_DEVBUSY; | 1363 | return BFA_STATUS_DEVBUSY; |
1003 | 1364 | ||
1004 | bfa_sm_send_event(BFA_PORT_MOD(bfa), BFA_PPORT_SM_ENABLE); | 1365 | bfa_sm_send_event(BFA_FCPORT_MOD(bfa), BFA_FCPORT_SM_ENABLE); |
1005 | return BFA_STATUS_OK; | 1366 | return BFA_STATUS_OK; |
1006 | } | 1367 | } |
1007 | 1368 | ||
1008 | bfa_status_t | 1369 | bfa_status_t |
1009 | bfa_pport_disable(struct bfa_s *bfa) | 1370 | bfa_fcport_disable(struct bfa_s *bfa) |
1010 | { | 1371 | { |
1011 | bfa_sm_send_event(BFA_PORT_MOD(bfa), BFA_PPORT_SM_DISABLE); | 1372 | bfa_sm_send_event(BFA_FCPORT_MOD(bfa), BFA_FCPORT_SM_DISABLE); |
1012 | return BFA_STATUS_OK; | 1373 | return BFA_STATUS_OK; |
1013 | } | 1374 | } |
1014 | 1375 | ||
@@ -1016,18 +1377,18 @@ bfa_pport_disable(struct bfa_s *bfa) | |||
1016 | * Configure port speed. | 1377 | * Configure port speed. |
1017 | */ | 1378 | */ |
1018 | bfa_status_t | 1379 | bfa_status_t |
1019 | bfa_pport_cfg_speed(struct bfa_s *bfa, enum bfa_pport_speed speed) | 1380 | bfa_fcport_cfg_speed(struct bfa_s *bfa, enum bfa_pport_speed speed) |
1020 | { | 1381 | { |
1021 | struct bfa_pport_s *pport = BFA_PORT_MOD(bfa); | 1382 | struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(bfa); |
1022 | 1383 | ||
1023 | bfa_trc(bfa, speed); | 1384 | bfa_trc(bfa, speed); |
1024 | 1385 | ||
1025 | if ((speed != BFA_PPORT_SPEED_AUTO) && (speed > pport->speed_sup)) { | 1386 | if ((speed != BFA_PPORT_SPEED_AUTO) && (speed > fcport->speed_sup)) { |
1026 | bfa_trc(bfa, pport->speed_sup); | 1387 | bfa_trc(bfa, fcport->speed_sup); |
1027 | return BFA_STATUS_UNSUPP_SPEED; | 1388 | return BFA_STATUS_UNSUPP_SPEED; |
1028 | } | 1389 | } |
1029 | 1390 | ||
1030 | pport->cfg.speed = speed; | 1391 | fcport->cfg.speed = speed; |
1031 | 1392 | ||
1032 | return BFA_STATUS_OK; | 1393 | return BFA_STATUS_OK; |
1033 | } | 1394 | } |
@@ -1036,23 +1397,23 @@ bfa_pport_cfg_speed(struct bfa_s *bfa, enum bfa_pport_speed speed) | |||
1036 | * Get current speed. | 1397 | * Get current speed. |
1037 | */ | 1398 | */ |
1038 | enum bfa_pport_speed | 1399 | enum bfa_pport_speed |
1039 | bfa_pport_get_speed(struct bfa_s *bfa) | 1400 | bfa_fcport_get_speed(struct bfa_s *bfa) |
1040 | { | 1401 | { |
1041 | struct bfa_pport_s *port = BFA_PORT_MOD(bfa); | 1402 | struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(bfa); |
1042 | 1403 | ||
1043 | return port->speed; | 1404 | return fcport->speed; |
1044 | } | 1405 | } |
1045 | 1406 | ||
1046 | /** | 1407 | /** |
1047 | * Configure port topology. | 1408 | * Configure port topology. |
1048 | */ | 1409 | */ |
1049 | bfa_status_t | 1410 | bfa_status_t |
1050 | bfa_pport_cfg_topology(struct bfa_s *bfa, enum bfa_pport_topology topology) | 1411 | bfa_fcport_cfg_topology(struct bfa_s *bfa, enum bfa_pport_topology topology) |
1051 | { | 1412 | { |
1052 | struct bfa_pport_s *pport = BFA_PORT_MOD(bfa); | 1413 | struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(bfa); |
1053 | 1414 | ||
1054 | bfa_trc(bfa, topology); | 1415 | bfa_trc(bfa, topology); |
1055 | bfa_trc(bfa, pport->cfg.topology); | 1416 | bfa_trc(bfa, fcport->cfg.topology); |
1056 | 1417 | ||
1057 | switch (topology) { | 1418 | switch (topology) { |
1058 | case BFA_PPORT_TOPOLOGY_P2P: | 1419 | case BFA_PPORT_TOPOLOGY_P2P: |
@@ -1064,7 +1425,7 @@ bfa_pport_cfg_topology(struct bfa_s *bfa, enum bfa_pport_topology topology) | |||
1064 | return BFA_STATUS_EINVAL; | 1425 | return BFA_STATUS_EINVAL; |
1065 | } | 1426 | } |
1066 | 1427 | ||
1067 | pport->cfg.topology = topology; | 1428 | fcport->cfg.topology = topology; |
1068 | return BFA_STATUS_OK; | 1429 | return BFA_STATUS_OK; |
1069 | } | 1430 | } |
1070 | 1431 | ||
@@ -1072,64 +1433,64 @@ bfa_pport_cfg_topology(struct bfa_s *bfa, enum bfa_pport_topology topology) | |||
1072 | * Get current topology. | 1433 | * Get current topology. |
1073 | */ | 1434 | */ |
1074 | enum bfa_pport_topology | 1435 | enum bfa_pport_topology |
1075 | bfa_pport_get_topology(struct bfa_s *bfa) | 1436 | bfa_fcport_get_topology(struct bfa_s *bfa) |
1076 | { | 1437 | { |
1077 | struct bfa_pport_s *port = BFA_PORT_MOD(bfa); | 1438 | struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(bfa); |
1078 | 1439 | ||
1079 | return port->topology; | 1440 | return fcport->topology; |
1080 | } | 1441 | } |
1081 | 1442 | ||
1082 | bfa_status_t | 1443 | bfa_status_t |
1083 | bfa_pport_cfg_hardalpa(struct bfa_s *bfa, u8 alpa) | 1444 | bfa_fcport_cfg_hardalpa(struct bfa_s *bfa, u8 alpa) |
1084 | { | 1445 | { |
1085 | struct bfa_pport_s *pport = BFA_PORT_MOD(bfa); | 1446 | struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(bfa); |
1086 | 1447 | ||
1087 | bfa_trc(bfa, alpa); | 1448 | bfa_trc(bfa, alpa); |
1088 | bfa_trc(bfa, pport->cfg.cfg_hardalpa); | 1449 | bfa_trc(bfa, fcport->cfg.cfg_hardalpa); |
1089 | bfa_trc(bfa, pport->cfg.hardalpa); | 1450 | bfa_trc(bfa, fcport->cfg.hardalpa); |
1090 | 1451 | ||
1091 | pport->cfg.cfg_hardalpa = BFA_TRUE; | 1452 | fcport->cfg.cfg_hardalpa = BFA_TRUE; |
1092 | pport->cfg.hardalpa = alpa; | 1453 | fcport->cfg.hardalpa = alpa; |
1093 | 1454 | ||
1094 | return BFA_STATUS_OK; | 1455 | return BFA_STATUS_OK; |
1095 | } | 1456 | } |
1096 | 1457 | ||
1097 | bfa_status_t | 1458 | bfa_status_t |
1098 | bfa_pport_clr_hardalpa(struct bfa_s *bfa) | 1459 | bfa_fcport_clr_hardalpa(struct bfa_s *bfa) |
1099 | { | 1460 | { |
1100 | struct bfa_pport_s *pport = BFA_PORT_MOD(bfa); | 1461 | struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(bfa); |
1101 | 1462 | ||
1102 | bfa_trc(bfa, pport->cfg.cfg_hardalpa); | 1463 | bfa_trc(bfa, fcport->cfg.cfg_hardalpa); |
1103 | bfa_trc(bfa, pport->cfg.hardalpa); | 1464 | bfa_trc(bfa, fcport->cfg.hardalpa); |
1104 | 1465 | ||
1105 | pport->cfg.cfg_hardalpa = BFA_FALSE; | 1466 | fcport->cfg.cfg_hardalpa = BFA_FALSE; |
1106 | return BFA_STATUS_OK; | 1467 | return BFA_STATUS_OK; |
1107 | } | 1468 | } |
1108 | 1469 | ||
1109 | bfa_boolean_t | 1470 | bfa_boolean_t |
1110 | bfa_pport_get_hardalpa(struct bfa_s *bfa, u8 *alpa) | 1471 | bfa_fcport_get_hardalpa(struct bfa_s *bfa, u8 *alpa) |
1111 | { | 1472 | { |
1112 | struct bfa_pport_s *port = BFA_PORT_MOD(bfa); | 1473 | struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(bfa); |
1113 | 1474 | ||
1114 | *alpa = port->cfg.hardalpa; | 1475 | *alpa = fcport->cfg.hardalpa; |
1115 | return port->cfg.cfg_hardalpa; | 1476 | return fcport->cfg.cfg_hardalpa; |
1116 | } | 1477 | } |
1117 | 1478 | ||
1118 | u8 | 1479 | u8 |
1119 | bfa_pport_get_myalpa(struct bfa_s *bfa) | 1480 | bfa_fcport_get_myalpa(struct bfa_s *bfa) |
1120 | { | 1481 | { |
1121 | struct bfa_pport_s *port = BFA_PORT_MOD(bfa); | 1482 | struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(bfa); |
1122 | 1483 | ||
1123 | return port->myalpa; | 1484 | return fcport->myalpa; |
1124 | } | 1485 | } |
1125 | 1486 | ||
1126 | bfa_status_t | 1487 | bfa_status_t |
1127 | bfa_pport_cfg_maxfrsize(struct bfa_s *bfa, u16 maxfrsize) | 1488 | bfa_fcport_cfg_maxfrsize(struct bfa_s *bfa, u16 maxfrsize) |
1128 | { | 1489 | { |
1129 | struct bfa_pport_s *pport = BFA_PORT_MOD(bfa); | 1490 | struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(bfa); |
1130 | 1491 | ||
1131 | bfa_trc(bfa, maxfrsize); | 1492 | bfa_trc(bfa, maxfrsize); |
1132 | bfa_trc(bfa, pport->cfg.maxfrsize); | 1493 | bfa_trc(bfa, fcport->cfg.maxfrsize); |
1133 | 1494 | ||
1134 | /* | 1495 | /* |
1135 | * with in range | 1496 | * with in range |
@@ -1143,41 +1504,41 @@ bfa_pport_cfg_maxfrsize(struct bfa_s *bfa, u16 maxfrsize) | |||
1143 | if ((maxfrsize != FC_MAX_PDUSZ) && (maxfrsize & (maxfrsize - 1))) | 1504 | if ((maxfrsize != FC_MAX_PDUSZ) && (maxfrsize & (maxfrsize - 1))) |
1144 | return BFA_STATUS_INVLD_DFSZ; | 1505 | return BFA_STATUS_INVLD_DFSZ; |
1145 | 1506 | ||
1146 | pport->cfg.maxfrsize = maxfrsize; | 1507 | fcport->cfg.maxfrsize = maxfrsize; |
1147 | return BFA_STATUS_OK; | 1508 | return BFA_STATUS_OK; |
1148 | } | 1509 | } |
1149 | 1510 | ||
1150 | u16 | 1511 | u16 |
1151 | bfa_pport_get_maxfrsize(struct bfa_s *bfa) | 1512 | bfa_fcport_get_maxfrsize(struct bfa_s *bfa) |
1152 | { | 1513 | { |
1153 | struct bfa_pport_s *port = BFA_PORT_MOD(bfa); | 1514 | struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(bfa); |
1154 | 1515 | ||
1155 | return port->cfg.maxfrsize; | 1516 | return fcport->cfg.maxfrsize; |
1156 | } | 1517 | } |
1157 | 1518 | ||
1158 | u32 | 1519 | u32 |
1159 | bfa_pport_mypid(struct bfa_s *bfa) | 1520 | bfa_fcport_mypid(struct bfa_s *bfa) |
1160 | { | 1521 | { |
1161 | struct bfa_pport_s *port = BFA_PORT_MOD(bfa); | 1522 | struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(bfa); |
1162 | 1523 | ||
1163 | return port->mypid; | 1524 | return fcport->mypid; |
1164 | } | 1525 | } |
1165 | 1526 | ||
1166 | u8 | 1527 | u8 |
1167 | bfa_pport_get_rx_bbcredit(struct bfa_s *bfa) | 1528 | bfa_fcport_get_rx_bbcredit(struct bfa_s *bfa) |
1168 | { | 1529 | { |
1169 | struct bfa_pport_s *port = BFA_PORT_MOD(bfa); | 1530 | struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(bfa); |
1170 | 1531 | ||
1171 | return port->cfg.rx_bbcredit; | 1532 | return fcport->cfg.rx_bbcredit; |
1172 | } | 1533 | } |
1173 | 1534 | ||
1174 | void | 1535 | void |
1175 | bfa_pport_set_tx_bbcredit(struct bfa_s *bfa, u16 tx_bbcredit) | 1536 | bfa_fcport_set_tx_bbcredit(struct bfa_s *bfa, u16 tx_bbcredit) |
1176 | { | 1537 | { |
1177 | struct bfa_pport_s *port = BFA_PORT_MOD(bfa); | 1538 | struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(bfa); |
1178 | 1539 | ||
1179 | port->cfg.tx_bbcredit = (u8) tx_bbcredit; | 1540 | fcport->cfg.tx_bbcredit = (u8) tx_bbcredit; |
1180 | bfa_port_send_txcredit(port); | 1541 | bfa_fcport_send_txcredit(fcport); |
1181 | } | 1542 | } |
1182 | 1543 | ||
1183 | /** | 1544 | /** |
@@ -1185,302 +1546,192 @@ bfa_pport_set_tx_bbcredit(struct bfa_s *bfa, u16 tx_bbcredit) | |||
1185 | */ | 1546 | */ |
1186 | 1547 | ||
1187 | wwn_t | 1548 | wwn_t |
1188 | bfa_pport_get_wwn(struct bfa_s *bfa, bfa_boolean_t node) | 1549 | bfa_fcport_get_wwn(struct bfa_s *bfa, bfa_boolean_t node) |
1189 | { | 1550 | { |
1190 | struct bfa_pport_s *pport = BFA_PORT_MOD(bfa); | 1551 | struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(bfa); |
1191 | if (node) | 1552 | if (node) |
1192 | return pport->nwwn; | 1553 | return fcport->nwwn; |
1193 | else | 1554 | else |
1194 | return pport->pwwn; | 1555 | return fcport->pwwn; |
1195 | } | 1556 | } |
1196 | 1557 | ||
1197 | void | 1558 | void |
1198 | bfa_pport_get_attr(struct bfa_s *bfa, struct bfa_pport_attr_s *attr) | 1559 | bfa_fcport_get_attr(struct bfa_s *bfa, struct bfa_pport_attr_s *attr) |
1199 | { | 1560 | { |
1200 | struct bfa_pport_s *pport = BFA_PORT_MOD(bfa); | 1561 | struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(bfa); |
1201 | 1562 | ||
1202 | bfa_os_memset(attr, 0, sizeof(struct bfa_pport_attr_s)); | 1563 | bfa_os_memset(attr, 0, sizeof(struct bfa_pport_attr_s)); |
1203 | 1564 | ||
1204 | attr->nwwn = pport->nwwn; | 1565 | attr->nwwn = fcport->nwwn; |
1205 | attr->pwwn = pport->pwwn; | 1566 | attr->pwwn = fcport->pwwn; |
1206 | 1567 | ||
1207 | bfa_os_memcpy(&attr->pport_cfg, &pport->cfg, | 1568 | bfa_os_memcpy(&attr->pport_cfg, &fcport->cfg, |
1208 | sizeof(struct bfa_pport_cfg_s)); | 1569 | sizeof(struct bfa_pport_cfg_s)); |
1209 | /* | 1570 | /* |
1210 | * speed attributes | 1571 | * speed attributes |
1211 | */ | 1572 | */ |
1212 | attr->pport_cfg.speed = pport->cfg.speed; | 1573 | attr->pport_cfg.speed = fcport->cfg.speed; |
1213 | attr->speed_supported = pport->speed_sup; | 1574 | attr->speed_supported = fcport->speed_sup; |
1214 | attr->speed = pport->speed; | 1575 | attr->speed = fcport->speed; |
1215 | attr->cos_supported = FC_CLASS_3; | 1576 | attr->cos_supported = FC_CLASS_3; |
1216 | 1577 | ||
1217 | /* | 1578 | /* |
1218 | * topology attributes | 1579 | * topology attributes |
1219 | */ | 1580 | */ |
1220 | attr->pport_cfg.topology = pport->cfg.topology; | 1581 | attr->pport_cfg.topology = fcport->cfg.topology; |
1221 | attr->topology = pport->topology; | 1582 | attr->topology = fcport->topology; |
1222 | 1583 | ||
1223 | /* | 1584 | /* |
1224 | * beacon attributes | 1585 | * beacon attributes |
1225 | */ | 1586 | */ |
1226 | attr->beacon = pport->beacon; | 1587 | attr->beacon = fcport->beacon; |
1227 | attr->link_e2e_beacon = pport->link_e2e_beacon; | 1588 | attr->link_e2e_beacon = fcport->link_e2e_beacon; |
1228 | attr->plog_enabled = bfa_plog_get_setting(pport->bfa->plog); | 1589 | attr->plog_enabled = bfa_plog_get_setting(fcport->bfa->plog); |
1229 | 1590 | ||
1230 | attr->pport_cfg.path_tov = bfa_fcpim_path_tov_get(bfa); | 1591 | attr->pport_cfg.path_tov = bfa_fcpim_path_tov_get(bfa); |
1231 | attr->pport_cfg.q_depth = bfa_fcpim_qdepth_get(bfa); | 1592 | attr->pport_cfg.q_depth = bfa_fcpim_qdepth_get(bfa); |
1232 | attr->port_state = bfa_sm_to_state(hal_pport_sm_table, pport->sm); | 1593 | attr->port_state = bfa_sm_to_state(hal_pport_sm_table, fcport->sm); |
1233 | if (bfa_ioc_is_disabled(&pport->bfa->ioc)) | 1594 | if (bfa_ioc_is_disabled(&fcport->bfa->ioc)) |
1234 | attr->port_state = BFA_PPORT_ST_IOCDIS; | 1595 | attr->port_state = BFA_PPORT_ST_IOCDIS; |
1235 | else if (bfa_ioc_fw_mismatch(&pport->bfa->ioc)) | 1596 | else if (bfa_ioc_fw_mismatch(&fcport->bfa->ioc)) |
1236 | attr->port_state = BFA_PPORT_ST_FWMISMATCH; | 1597 | attr->port_state = BFA_PPORT_ST_FWMISMATCH; |
1237 | } | 1598 | } |
1238 | 1599 | ||
1239 | static void | 1600 | #define BFA_FCPORT_STATS_TOV 1000 |
1240 | bfa_port_stats_query(void *cbarg) | ||
1241 | { | ||
1242 | struct bfa_pport_s *port = (struct bfa_pport_s *)cbarg; | ||
1243 | bfi_pport_get_stats_req_t *msg; | ||
1244 | |||
1245 | msg = bfa_reqq_next(port->bfa, BFA_REQQ_PORT); | ||
1246 | |||
1247 | if (!msg) { | ||
1248 | port->stats_qfull = BFA_TRUE; | ||
1249 | bfa_reqq_winit(&port->stats_reqq_wait, bfa_port_stats_query, | ||
1250 | port); | ||
1251 | bfa_reqq_wait(port->bfa, BFA_REQQ_PORT, &port->stats_reqq_wait); | ||
1252 | return; | ||
1253 | } | ||
1254 | port->stats_qfull = BFA_FALSE; | ||
1255 | |||
1256 | bfa_os_memset(msg, 0, sizeof(bfi_pport_get_stats_req_t)); | ||
1257 | bfi_h2i_set(msg->mh, BFI_MC_FC_PORT, BFI_PPORT_H2I_GET_STATS_REQ, | ||
1258 | bfa_lpuid(port->bfa)); | ||
1259 | bfa_reqq_produce(port->bfa, BFA_REQQ_PORT); | ||
1260 | |||
1261 | return; | ||
1262 | } | ||
1263 | |||
1264 | static void | ||
1265 | bfa_port_stats_clear(void *cbarg) | ||
1266 | { | ||
1267 | struct bfa_pport_s *port = (struct bfa_pport_s *)cbarg; | ||
1268 | bfi_pport_clear_stats_req_t *msg; | ||
1269 | |||
1270 | msg = bfa_reqq_next(port->bfa, BFA_REQQ_PORT); | ||
1271 | 1601 | ||
1272 | if (!msg) { | 1602 | /** |
1273 | port->stats_qfull = BFA_TRUE; | 1603 | * Fetch port attributes (FCQoS or FCoE). |
1274 | bfa_reqq_winit(&port->stats_reqq_wait, bfa_port_stats_clear, | 1604 | */ |
1275 | port); | 1605 | bfa_status_t |
1276 | bfa_reqq_wait(port->bfa, BFA_REQQ_PORT, &port->stats_reqq_wait); | 1606 | bfa_fcport_get_stats(struct bfa_s *bfa, union bfa_fcport_stats_u *stats, |
1277 | return; | 1607 | bfa_cb_pport_t cbfn, void *cbarg) |
1278 | } | ||
1279 | port->stats_qfull = BFA_FALSE; | ||
1280 | |||
1281 | bfa_os_memset(msg, 0, sizeof(bfi_pport_clear_stats_req_t)); | ||
1282 | bfi_h2i_set(msg->mh, BFI_MC_FC_PORT, BFI_PPORT_H2I_CLEAR_STATS_REQ, | ||
1283 | bfa_lpuid(port->bfa)); | ||
1284 | bfa_reqq_produce(port->bfa, BFA_REQQ_PORT); | ||
1285 | return; | ||
1286 | } | ||
1287 | |||
1288 | static void | ||
1289 | bfa_port_qos_stats_clear(void *cbarg) | ||
1290 | { | 1608 | { |
1291 | struct bfa_pport_s *port = (struct bfa_pport_s *)cbarg; | 1609 | struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(bfa); |
1292 | bfi_pport_clear_qos_stats_req_t *msg; | ||
1293 | |||
1294 | msg = bfa_reqq_next(port->bfa, BFA_REQQ_PORT); | ||
1295 | 1610 | ||
1296 | if (!msg) { | 1611 | if (fcport->stats_busy) { |
1297 | port->stats_qfull = BFA_TRUE; | 1612 | bfa_trc(bfa, fcport->stats_busy); |
1298 | bfa_reqq_winit(&port->stats_reqq_wait, bfa_port_qos_stats_clear, | 1613 | return BFA_STATUS_DEVBUSY; |
1299 | port); | ||
1300 | bfa_reqq_wait(port->bfa, BFA_REQQ_PORT, &port->stats_reqq_wait); | ||
1301 | return; | ||
1302 | } | 1614 | } |
1303 | port->stats_qfull = BFA_FALSE; | ||
1304 | 1615 | ||
1305 | bfa_os_memset(msg, 0, sizeof(bfi_pport_clear_qos_stats_req_t)); | 1616 | fcport->stats_busy = BFA_TRUE; |
1306 | bfi_h2i_set(msg->mh, BFI_MC_FC_PORT, BFI_PPORT_H2I_CLEAR_QOS_STATS_REQ, | 1617 | fcport->stats_ret = stats; |
1307 | bfa_lpuid(port->bfa)); | 1618 | fcport->stats_cbfn = cbfn; |
1308 | bfa_reqq_produce(port->bfa, BFA_REQQ_PORT); | 1619 | fcport->stats_cbarg = cbarg; |
1309 | return; | ||
1310 | } | ||
1311 | |||
1312 | static void | ||
1313 | bfa_pport_stats_swap(union bfa_pport_stats_u *d, union bfa_pport_stats_u *s) | ||
1314 | { | ||
1315 | u32 *dip = (u32 *) d; | ||
1316 | u32 *sip = (u32 *) s; | ||
1317 | int i; | ||
1318 | 1620 | ||
1319 | /* | 1621 | bfa_fcport_send_stats_get(fcport); |
1320 | * Do 64 bit fields swap first | ||
1321 | */ | ||
1322 | for (i = 0; | ||
1323 | i < | ||
1324 | ((sizeof(union bfa_pport_stats_u) - | ||
1325 | sizeof(struct bfa_qos_stats_s)) / sizeof(u32)); i = i + 2) { | ||
1326 | #ifdef __BIGENDIAN | ||
1327 | dip[i] = bfa_os_ntohl(sip[i]); | ||
1328 | dip[i + 1] = bfa_os_ntohl(sip[i + 1]); | ||
1329 | #else | ||
1330 | dip[i] = bfa_os_ntohl(sip[i + 1]); | ||
1331 | dip[i + 1] = bfa_os_ntohl(sip[i]); | ||
1332 | #endif | ||
1333 | } | ||
1334 | 1622 | ||
1335 | /* | 1623 | bfa_timer_start(bfa, &fcport->timer, bfa_fcport_stats_get_timeout, |
1336 | * Now swap the 32 bit fields | 1624 | fcport, BFA_FCPORT_STATS_TOV); |
1337 | */ | 1625 | return BFA_STATUS_OK; |
1338 | for (; i < (sizeof(union bfa_pport_stats_u) / sizeof(u32)); ++i) | ||
1339 | dip[i] = bfa_os_ntohl(sip[i]); | ||
1340 | } | 1626 | } |
1341 | 1627 | ||
1342 | static void | 1628 | /** |
1343 | __bfa_cb_port_stats_clr(void *cbarg, bfa_boolean_t complete) | 1629 | * Reset port statistics (FCQoS or FCoE). |
1630 | */ | ||
1631 | bfa_status_t | ||
1632 | bfa_fcport_clear_stats(struct bfa_s *bfa, bfa_cb_pport_t cbfn, void *cbarg) | ||
1344 | { | 1633 | { |
1345 | struct bfa_pport_s *port = cbarg; | 1634 | struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(bfa); |
1346 | 1635 | ||
1347 | if (complete) { | 1636 | if (fcport->stats_busy) { |
1348 | port->stats_cbfn(port->stats_cbarg, port->stats_status); | 1637 | bfa_trc(bfa, fcport->stats_busy); |
1349 | } else { | 1638 | return BFA_STATUS_DEVBUSY; |
1350 | port->stats_busy = BFA_FALSE; | ||
1351 | port->stats_status = BFA_STATUS_OK; | ||
1352 | } | 1639 | } |
1353 | } | ||
1354 | |||
1355 | static void | ||
1356 | bfa_port_stats_clr_timeout(void *cbarg) | ||
1357 | { | ||
1358 | struct bfa_pport_s *port = (struct bfa_pport_s *)cbarg; | ||
1359 | 1640 | ||
1360 | bfa_trc(port->bfa, port->stats_qfull); | 1641 | fcport->stats_busy = BFA_TRUE; |
1642 | fcport->stats_cbfn = cbfn; | ||
1643 | fcport->stats_cbarg = cbarg; | ||
1361 | 1644 | ||
1362 | if (port->stats_qfull) { | 1645 | bfa_fcport_send_stats_clear(fcport); |
1363 | bfa_reqq_wcancel(&port->stats_reqq_wait); | ||
1364 | port->stats_qfull = BFA_FALSE; | ||
1365 | } | ||
1366 | 1646 | ||
1367 | port->stats_status = BFA_STATUS_ETIMER; | 1647 | bfa_timer_start(bfa, &fcport->timer, bfa_fcport_stats_clr_timeout, |
1368 | bfa_cb_queue(port->bfa, &port->hcb_qe, __bfa_cb_port_stats_clr, port); | 1648 | fcport, BFA_FCPORT_STATS_TOV); |
1649 | return BFA_STATUS_OK; | ||
1369 | } | 1650 | } |
1370 | 1651 | ||
1371 | static void | 1652 | /** |
1372 | __bfa_cb_port_stats(void *cbarg, bfa_boolean_t complete) | 1653 | * Fetch FCQoS port statistics |
1654 | */ | ||
1655 | bfa_status_t | ||
1656 | bfa_fcport_get_qos_stats(struct bfa_s *bfa, union bfa_fcport_stats_u *stats, | ||
1657 | bfa_cb_pport_t cbfn, void *cbarg) | ||
1373 | { | 1658 | { |
1374 | struct bfa_pport_s *port = cbarg; | 1659 | /* Meaningful only for FC mode */ |
1660 | bfa_assert(bfa_ioc_get_fcmode(&bfa->ioc)); | ||
1375 | 1661 | ||
1376 | if (complete) { | 1662 | return bfa_fcport_get_stats(bfa, stats, cbfn, cbarg); |
1377 | if (port->stats_status == BFA_STATUS_OK) | ||
1378 | bfa_pport_stats_swap(port->stats_ret, port->stats); | ||
1379 | port->stats_cbfn(port->stats_cbarg, port->stats_status); | ||
1380 | } else { | ||
1381 | port->stats_busy = BFA_FALSE; | ||
1382 | port->stats_status = BFA_STATUS_OK; | ||
1383 | } | ||
1384 | } | 1663 | } |
1385 | 1664 | ||
1386 | static void | 1665 | /** |
1387 | bfa_port_stats_timeout(void *cbarg) | 1666 | * Reset FCoE port statistics |
1667 | */ | ||
1668 | bfa_status_t | ||
1669 | bfa_fcport_clear_qos_stats(struct bfa_s *bfa, bfa_cb_pport_t cbfn, void *cbarg) | ||
1388 | { | 1670 | { |
1389 | struct bfa_pport_s *port = (struct bfa_pport_s *)cbarg; | 1671 | /* Meaningful only for FC mode */ |
1390 | 1672 | bfa_assert(bfa_ioc_get_fcmode(&bfa->ioc)); | |
1391 | bfa_trc(port->bfa, port->stats_qfull); | ||
1392 | 1673 | ||
1393 | if (port->stats_qfull) { | 1674 | return bfa_fcport_clear_stats(bfa, cbfn, cbarg); |
1394 | bfa_reqq_wcancel(&port->stats_reqq_wait); | ||
1395 | port->stats_qfull = BFA_FALSE; | ||
1396 | } | ||
1397 | |||
1398 | port->stats_status = BFA_STATUS_ETIMER; | ||
1399 | bfa_cb_queue(port->bfa, &port->hcb_qe, __bfa_cb_port_stats, port); | ||
1400 | } | 1675 | } |
1401 | 1676 | ||
1402 | #define BFA_PORT_STATS_TOV 1000 | ||
1403 | |||
1404 | /** | 1677 | /** |
1405 | * Fetch port attributes. | 1678 | * Fetch FCQoS port statistics |
1406 | */ | 1679 | */ |
1407 | bfa_status_t | 1680 | bfa_status_t |
1408 | bfa_pport_get_stats(struct bfa_s *bfa, union bfa_pport_stats_u *stats, | 1681 | bfa_fcport_get_fcoe_stats(struct bfa_s *bfa, union bfa_fcport_stats_u *stats, |
1409 | bfa_cb_pport_t cbfn, void *cbarg) | 1682 | bfa_cb_pport_t cbfn, void *cbarg) |
1410 | { | 1683 | { |
1411 | struct bfa_pport_s *port = BFA_PORT_MOD(bfa); | 1684 | /* Meaningful only for FCoE mode */ |
1412 | 1685 | bfa_assert(!bfa_ioc_get_fcmode(&bfa->ioc)); | |
1413 | if (port->stats_busy) { | ||
1414 | bfa_trc(bfa, port->stats_busy); | ||
1415 | return BFA_STATUS_DEVBUSY; | ||
1416 | } | ||
1417 | |||
1418 | port->stats_busy = BFA_TRUE; | ||
1419 | port->stats_ret = stats; | ||
1420 | port->stats_cbfn = cbfn; | ||
1421 | port->stats_cbarg = cbarg; | ||
1422 | |||
1423 | bfa_port_stats_query(port); | ||
1424 | 1686 | ||
1425 | bfa_timer_start(bfa, &port->timer, bfa_port_stats_timeout, port, | 1687 | return bfa_fcport_get_stats(bfa, stats, cbfn, cbarg); |
1426 | BFA_PORT_STATS_TOV); | ||
1427 | return BFA_STATUS_OK; | ||
1428 | } | 1688 | } |
1429 | 1689 | ||
1690 | /** | ||
1691 | * Reset FCoE port statistics | ||
1692 | */ | ||
1430 | bfa_status_t | 1693 | bfa_status_t |
1431 | bfa_pport_clear_stats(struct bfa_s *bfa, bfa_cb_pport_t cbfn, void *cbarg) | 1694 | bfa_fcport_clear_fcoe_stats(struct bfa_s *bfa, bfa_cb_pport_t cbfn, void *cbarg) |
1432 | { | 1695 | { |
1433 | struct bfa_pport_s *port = BFA_PORT_MOD(bfa); | 1696 | /* Meaningful only for FCoE mode */ |
1434 | 1697 | bfa_assert(!bfa_ioc_get_fcmode(&bfa->ioc)); | |
1435 | if (port->stats_busy) { | ||
1436 | bfa_trc(bfa, port->stats_busy); | ||
1437 | return BFA_STATUS_DEVBUSY; | ||
1438 | } | ||
1439 | |||
1440 | port->stats_busy = BFA_TRUE; | ||
1441 | port->stats_cbfn = cbfn; | ||
1442 | port->stats_cbarg = cbarg; | ||
1443 | |||
1444 | bfa_port_stats_clear(port); | ||
1445 | 1698 | ||
1446 | bfa_timer_start(bfa, &port->timer, bfa_port_stats_clr_timeout, port, | 1699 | return bfa_fcport_clear_stats(bfa, cbfn, cbarg); |
1447 | BFA_PORT_STATS_TOV); | ||
1448 | return BFA_STATUS_OK; | ||
1449 | } | 1700 | } |
1450 | 1701 | ||
1451 | bfa_status_t | 1702 | bfa_status_t |
1452 | bfa_pport_trunk_enable(struct bfa_s *bfa, u8 bitmap) | 1703 | bfa_fcport_trunk_enable(struct bfa_s *bfa, u8 bitmap) |
1453 | { | 1704 | { |
1454 | struct bfa_pport_s *pport = BFA_PORT_MOD(bfa); | 1705 | struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(bfa); |
1455 | 1706 | ||
1456 | bfa_trc(bfa, bitmap); | 1707 | bfa_trc(bfa, bitmap); |
1457 | bfa_trc(bfa, pport->cfg.trunked); | 1708 | bfa_trc(bfa, fcport->cfg.trunked); |
1458 | bfa_trc(bfa, pport->cfg.trunk_ports); | 1709 | bfa_trc(bfa, fcport->cfg.trunk_ports); |
1459 | 1710 | ||
1460 | if (!bitmap || (bitmap & (bitmap - 1))) | 1711 | if (!bitmap || (bitmap & (bitmap - 1))) |
1461 | return BFA_STATUS_EINVAL; | 1712 | return BFA_STATUS_EINVAL; |
1462 | 1713 | ||
1463 | pport->cfg.trunked = BFA_TRUE; | 1714 | fcport->cfg.trunked = BFA_TRUE; |
1464 | pport->cfg.trunk_ports = bitmap; | 1715 | fcport->cfg.trunk_ports = bitmap; |
1465 | 1716 | ||
1466 | return BFA_STATUS_OK; | 1717 | return BFA_STATUS_OK; |
1467 | } | 1718 | } |
1468 | 1719 | ||
1469 | void | 1720 | void |
1470 | bfa_pport_qos_get_attr(struct bfa_s *bfa, struct bfa_qos_attr_s *qos_attr) | 1721 | bfa_fcport_qos_get_attr(struct bfa_s *bfa, struct bfa_qos_attr_s *qos_attr) |
1471 | { | 1722 | { |
1472 | struct bfa_pport_s *pport = BFA_PORT_MOD(bfa); | 1723 | struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(bfa); |
1473 | 1724 | ||
1474 | qos_attr->state = bfa_os_ntohl(pport->qos_attr.state); | 1725 | qos_attr->state = bfa_os_ntohl(fcport->qos_attr.state); |
1475 | qos_attr->total_bb_cr = bfa_os_ntohl(pport->qos_attr.total_bb_cr); | 1726 | qos_attr->total_bb_cr = bfa_os_ntohl(fcport->qos_attr.total_bb_cr); |
1476 | } | 1727 | } |
1477 | 1728 | ||
1478 | void | 1729 | void |
1479 | bfa_pport_qos_get_vc_attr(struct bfa_s *bfa, | 1730 | bfa_fcport_qos_get_vc_attr(struct bfa_s *bfa, |
1480 | struct bfa_qos_vc_attr_s *qos_vc_attr) | 1731 | struct bfa_qos_vc_attr_s *qos_vc_attr) |
1481 | { | 1732 | { |
1482 | struct bfa_pport_s *pport = BFA_PORT_MOD(bfa); | 1733 | struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(bfa); |
1483 | struct bfa_qos_vc_attr_s *bfa_vc_attr = &pport->qos_vc_attr; | 1734 | struct bfa_qos_vc_attr_s *bfa_vc_attr = &fcport->qos_vc_attr; |
1484 | u32 i = 0; | 1735 | u32 i = 0; |
1485 | 1736 | ||
1486 | qos_vc_attr->total_vc_count = bfa_os_ntohs(bfa_vc_attr->total_vc_count); | 1737 | qos_vc_attr->total_vc_count = bfa_os_ntohs(bfa_vc_attr->total_vc_count); |
@@ -1503,119 +1754,89 @@ bfa_pport_qos_get_vc_attr(struct bfa_s *bfa, | |||
1503 | } | 1754 | } |
1504 | 1755 | ||
1505 | /** | 1756 | /** |
1506 | * Fetch QoS Stats. | ||
1507 | */ | ||
1508 | bfa_status_t | ||
1509 | bfa_pport_get_qos_stats(struct bfa_s *bfa, union bfa_pport_stats_u *stats, | ||
1510 | bfa_cb_pport_t cbfn, void *cbarg) | ||
1511 | { | ||
1512 | /* | ||
1513 | * QoS stats is embedded in port stats | ||
1514 | */ | ||
1515 | return bfa_pport_get_stats(bfa, stats, cbfn, cbarg); | ||
1516 | } | ||
1517 | |||
1518 | bfa_status_t | ||
1519 | bfa_pport_clear_qos_stats(struct bfa_s *bfa, bfa_cb_pport_t cbfn, void *cbarg) | ||
1520 | { | ||
1521 | struct bfa_pport_s *port = BFA_PORT_MOD(bfa); | ||
1522 | |||
1523 | if (port->stats_busy) { | ||
1524 | bfa_trc(bfa, port->stats_busy); | ||
1525 | return BFA_STATUS_DEVBUSY; | ||
1526 | } | ||
1527 | |||
1528 | port->stats_busy = BFA_TRUE; | ||
1529 | port->stats_cbfn = cbfn; | ||
1530 | port->stats_cbarg = cbarg; | ||
1531 | |||
1532 | bfa_port_qos_stats_clear(port); | ||
1533 | |||
1534 | bfa_timer_start(bfa, &port->timer, bfa_port_stats_clr_timeout, port, | ||
1535 | BFA_PORT_STATS_TOV); | ||
1536 | return BFA_STATUS_OK; | ||
1537 | } | ||
1538 | |||
1539 | /** | ||
1540 | * Fetch port attributes. | 1757 | * Fetch port attributes. |
1541 | */ | 1758 | */ |
1542 | bfa_status_t | 1759 | bfa_status_t |
1543 | bfa_pport_trunk_disable(struct bfa_s *bfa) | 1760 | bfa_fcport_trunk_disable(struct bfa_s *bfa) |
1544 | { | 1761 | { |
1545 | return BFA_STATUS_OK; | 1762 | return BFA_STATUS_OK; |
1546 | } | 1763 | } |
1547 | 1764 | ||
1548 | bfa_boolean_t | 1765 | bfa_boolean_t |
1549 | bfa_pport_trunk_query(struct bfa_s *bfa, u32 *bitmap) | 1766 | bfa_fcport_trunk_query(struct bfa_s *bfa, u32 *bitmap) |
1550 | { | 1767 | { |
1551 | struct bfa_pport_s *port = BFA_PORT_MOD(bfa); | 1768 | struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(bfa); |
1552 | 1769 | ||
1553 | *bitmap = port->cfg.trunk_ports; | 1770 | *bitmap = fcport->cfg.trunk_ports; |
1554 | return port->cfg.trunked; | 1771 | return fcport->cfg.trunked; |
1555 | } | 1772 | } |
1556 | 1773 | ||
1557 | bfa_boolean_t | 1774 | bfa_boolean_t |
1558 | bfa_pport_is_disabled(struct bfa_s *bfa) | 1775 | bfa_fcport_is_disabled(struct bfa_s *bfa) |
1559 | { | 1776 | { |
1560 | struct bfa_pport_s *port = BFA_PORT_MOD(bfa); | 1777 | struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(bfa); |
1561 | 1778 | ||
1562 | return bfa_sm_to_state(hal_pport_sm_table, port->sm) == | 1779 | return bfa_sm_to_state(hal_pport_sm_table, fcport->sm) == |
1563 | BFA_PPORT_ST_DISABLED; | 1780 | BFA_PPORT_ST_DISABLED; |
1564 | 1781 | ||
1565 | } | 1782 | } |
1566 | 1783 | ||
1567 | bfa_boolean_t | 1784 | bfa_boolean_t |
1568 | bfa_pport_is_ratelim(struct bfa_s *bfa) | 1785 | bfa_fcport_is_ratelim(struct bfa_s *bfa) |
1569 | { | 1786 | { |
1570 | struct bfa_pport_s *pport = BFA_PORT_MOD(bfa); | 1787 | struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(bfa); |
1571 | 1788 | ||
1572 | return pport->cfg.ratelimit ? BFA_TRUE : BFA_FALSE; | 1789 | return fcport->cfg.ratelimit ? BFA_TRUE : BFA_FALSE; |
1573 | 1790 | ||
1574 | } | 1791 | } |
1575 | 1792 | ||
1576 | void | 1793 | void |
1577 | bfa_pport_cfg_qos(struct bfa_s *bfa, bfa_boolean_t on_off) | 1794 | bfa_fcport_cfg_qos(struct bfa_s *bfa, bfa_boolean_t on_off) |
1578 | { | 1795 | { |
1579 | struct bfa_pport_s *pport = BFA_PORT_MOD(bfa); | 1796 | struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(bfa); |
1797 | enum bfa_ioc_type_e ioc_type = bfa_get_type(bfa); | ||
1580 | 1798 | ||
1581 | bfa_trc(bfa, on_off); | 1799 | bfa_trc(bfa, on_off); |
1582 | bfa_trc(bfa, pport->cfg.qos_enabled); | 1800 | bfa_trc(bfa, fcport->cfg.qos_enabled); |
1801 | |||
1802 | bfa_trc(bfa, ioc_type); | ||
1583 | 1803 | ||
1584 | pport->cfg.qos_enabled = on_off; | 1804 | if (ioc_type == BFA_IOC_TYPE_FC) |
1805 | fcport->cfg.qos_enabled = on_off; | ||
1585 | } | 1806 | } |
1586 | 1807 | ||
1587 | void | 1808 | void |
1588 | bfa_pport_cfg_ratelim(struct bfa_s *bfa, bfa_boolean_t on_off) | 1809 | bfa_fcport_cfg_ratelim(struct bfa_s *bfa, bfa_boolean_t on_off) |
1589 | { | 1810 | { |
1590 | struct bfa_pport_s *pport = BFA_PORT_MOD(bfa); | 1811 | struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(bfa); |
1591 | 1812 | ||
1592 | bfa_trc(bfa, on_off); | 1813 | bfa_trc(bfa, on_off); |
1593 | bfa_trc(bfa, pport->cfg.ratelimit); | 1814 | bfa_trc(bfa, fcport->cfg.ratelimit); |
1594 | 1815 | ||
1595 | pport->cfg.ratelimit = on_off; | 1816 | fcport->cfg.ratelimit = on_off; |
1596 | if (pport->cfg.trl_def_speed == BFA_PPORT_SPEED_UNKNOWN) | 1817 | if (fcport->cfg.trl_def_speed == BFA_PPORT_SPEED_UNKNOWN) |
1597 | pport->cfg.trl_def_speed = BFA_PPORT_SPEED_1GBPS; | 1818 | fcport->cfg.trl_def_speed = BFA_PPORT_SPEED_1GBPS; |
1598 | } | 1819 | } |
1599 | 1820 | ||
1600 | /** | 1821 | /** |
1601 | * Configure default minimum ratelim speed | 1822 | * Configure default minimum ratelim speed |
1602 | */ | 1823 | */ |
1603 | bfa_status_t | 1824 | bfa_status_t |
1604 | bfa_pport_cfg_ratelim_speed(struct bfa_s *bfa, enum bfa_pport_speed speed) | 1825 | bfa_fcport_cfg_ratelim_speed(struct bfa_s *bfa, enum bfa_pport_speed speed) |
1605 | { | 1826 | { |
1606 | struct bfa_pport_s *pport = BFA_PORT_MOD(bfa); | 1827 | struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(bfa); |
1607 | 1828 | ||
1608 | bfa_trc(bfa, speed); | 1829 | bfa_trc(bfa, speed); |
1609 | 1830 | ||
1610 | /* | 1831 | /* |
1611 | * Auto and speeds greater than the supported speed, are invalid | 1832 | * Auto and speeds greater than the supported speed, are invalid |
1612 | */ | 1833 | */ |
1613 | if ((speed == BFA_PPORT_SPEED_AUTO) || (speed > pport->speed_sup)) { | 1834 | if ((speed == BFA_PPORT_SPEED_AUTO) || (speed > fcport->speed_sup)) { |
1614 | bfa_trc(bfa, pport->speed_sup); | 1835 | bfa_trc(bfa, fcport->speed_sup); |
1615 | return BFA_STATUS_UNSUPP_SPEED; | 1836 | return BFA_STATUS_UNSUPP_SPEED; |
1616 | } | 1837 | } |
1617 | 1838 | ||
1618 | pport->cfg.trl_def_speed = speed; | 1839 | fcport->cfg.trl_def_speed = speed; |
1619 | 1840 | ||
1620 | return BFA_STATUS_OK; | 1841 | return BFA_STATUS_OK; |
1621 | } | 1842 | } |
@@ -1624,45 +1845,45 @@ bfa_pport_cfg_ratelim_speed(struct bfa_s *bfa, enum bfa_pport_speed speed) | |||
1624 | * Get default minimum ratelim speed | 1845 | * Get default minimum ratelim speed |
1625 | */ | 1846 | */ |
1626 | enum bfa_pport_speed | 1847 | enum bfa_pport_speed |
1627 | bfa_pport_get_ratelim_speed(struct bfa_s *bfa) | 1848 | bfa_fcport_get_ratelim_speed(struct bfa_s *bfa) |
1628 | { | 1849 | { |
1629 | struct bfa_pport_s *pport = BFA_PORT_MOD(bfa); | 1850 | struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(bfa); |
1630 | 1851 | ||
1631 | bfa_trc(bfa, pport->cfg.trl_def_speed); | 1852 | bfa_trc(bfa, fcport->cfg.trl_def_speed); |
1632 | return pport->cfg.trl_def_speed; | 1853 | return fcport->cfg.trl_def_speed; |
1633 | 1854 | ||
1634 | } | 1855 | } |
1635 | 1856 | ||
1636 | void | 1857 | void |
1637 | bfa_pport_busy(struct bfa_s *bfa, bfa_boolean_t status) | 1858 | bfa_fcport_busy(struct bfa_s *bfa, bfa_boolean_t status) |
1638 | { | 1859 | { |
1639 | struct bfa_pport_s *pport = BFA_PORT_MOD(bfa); | 1860 | struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(bfa); |
1640 | 1861 | ||
1641 | bfa_trc(bfa, status); | 1862 | bfa_trc(bfa, status); |
1642 | bfa_trc(bfa, pport->diag_busy); | 1863 | bfa_trc(bfa, fcport->diag_busy); |
1643 | 1864 | ||
1644 | pport->diag_busy = status; | 1865 | fcport->diag_busy = status; |
1645 | } | 1866 | } |
1646 | 1867 | ||
1647 | void | 1868 | void |
1648 | bfa_pport_beacon(struct bfa_s *bfa, bfa_boolean_t beacon, | 1869 | bfa_fcport_beacon(struct bfa_s *bfa, bfa_boolean_t beacon, |
1649 | bfa_boolean_t link_e2e_beacon) | 1870 | bfa_boolean_t link_e2e_beacon) |
1650 | { | 1871 | { |
1651 | struct bfa_pport_s *pport = BFA_PORT_MOD(bfa); | 1872 | struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(bfa); |
1652 | 1873 | ||
1653 | bfa_trc(bfa, beacon); | 1874 | bfa_trc(bfa, beacon); |
1654 | bfa_trc(bfa, link_e2e_beacon); | 1875 | bfa_trc(bfa, link_e2e_beacon); |
1655 | bfa_trc(bfa, pport->beacon); | 1876 | bfa_trc(bfa, fcport->beacon); |
1656 | bfa_trc(bfa, pport->link_e2e_beacon); | 1877 | bfa_trc(bfa, fcport->link_e2e_beacon); |
1657 | 1878 | ||
1658 | pport->beacon = beacon; | 1879 | fcport->beacon = beacon; |
1659 | pport->link_e2e_beacon = link_e2e_beacon; | 1880 | fcport->link_e2e_beacon = link_e2e_beacon; |
1660 | } | 1881 | } |
1661 | 1882 | ||
1662 | bfa_boolean_t | 1883 | bfa_boolean_t |
1663 | bfa_pport_is_linkup(struct bfa_s *bfa) | 1884 | bfa_fcport_is_linkup(struct bfa_s *bfa) |
1664 | { | 1885 | { |
1665 | return bfa_sm_cmp_state(BFA_PORT_MOD(bfa), bfa_pport_sm_linkup); | 1886 | return bfa_sm_cmp_state(BFA_FCPORT_MOD(bfa), bfa_fcport_sm_linkup); |
1666 | } | 1887 | } |
1667 | 1888 | ||
1668 | 1889 | ||
diff --git a/drivers/scsi/bfa/bfa_fcs.c b/drivers/scsi/bfa/bfa_fcs.c index 7cb39a306ea9..3516172c597c 100644 --- a/drivers/scsi/bfa/bfa_fcs.c +++ b/drivers/scsi/bfa/bfa_fcs.c | |||
@@ -36,6 +36,7 @@ | |||
36 | * FCS sub-modules | 36 | * FCS sub-modules |
37 | */ | 37 | */ |
38 | struct bfa_fcs_mod_s { | 38 | struct bfa_fcs_mod_s { |
39 | void (*attach) (struct bfa_fcs_s *fcs); | ||
39 | void (*modinit) (struct bfa_fcs_s *fcs); | 40 | void (*modinit) (struct bfa_fcs_s *fcs); |
40 | void (*modexit) (struct bfa_fcs_s *fcs); | 41 | void (*modexit) (struct bfa_fcs_s *fcs); |
41 | }; | 42 | }; |
@@ -43,12 +44,10 @@ struct bfa_fcs_mod_s { | |||
43 | #define BFA_FCS_MODULE(_mod) { _mod ## _modinit, _mod ## _modexit } | 44 | #define BFA_FCS_MODULE(_mod) { _mod ## _modinit, _mod ## _modexit } |
44 | 45 | ||
45 | static struct bfa_fcs_mod_s fcs_modules[] = { | 46 | static struct bfa_fcs_mod_s fcs_modules[] = { |
46 | BFA_FCS_MODULE(bfa_fcs_pport), | 47 | { bfa_fcs_pport_attach, NULL, NULL }, |
47 | BFA_FCS_MODULE(bfa_fcs_uf), | 48 | { bfa_fcs_uf_attach, NULL, NULL }, |
48 | BFA_FCS_MODULE(bfa_fcs_fabric), | 49 | { bfa_fcs_fabric_attach, bfa_fcs_fabric_modinit, |
49 | BFA_FCS_MODULE(bfa_fcs_vport), | 50 | bfa_fcs_fabric_modexit }, |
50 | BFA_FCS_MODULE(bfa_fcs_rport), | ||
51 | BFA_FCS_MODULE(bfa_fcs_fcpim), | ||
52 | }; | 51 | }; |
53 | 52 | ||
54 | /** | 53 | /** |
@@ -71,16 +70,10 @@ bfa_fcs_exit_comp(void *fcs_cbarg) | |||
71 | */ | 70 | */ |
72 | 71 | ||
73 | /** | 72 | /** |
74 | * FCS instance initialization. | 73 | * fcs attach -- called once to initialize data structures at driver attach time |
75 | * | ||
76 | * param[in] fcs FCS instance | ||
77 | * param[in] bfa BFA instance | ||
78 | * param[in] bfad BFA driver instance | ||
79 | * | ||
80 | * return None | ||
81 | */ | 74 | */ |
82 | void | 75 | void |
83 | bfa_fcs_init(struct bfa_fcs_s *fcs, struct bfa_s *bfa, struct bfad_s *bfad, | 76 | bfa_fcs_attach(struct bfa_fcs_s *fcs, struct bfa_s *bfa, struct bfad_s *bfad, |
84 | bfa_boolean_t min_cfg) | 77 | bfa_boolean_t min_cfg) |
85 | { | 78 | { |
86 | int i; | 79 | int i; |
@@ -95,7 +88,24 @@ bfa_fcs_init(struct bfa_fcs_s *fcs, struct bfa_s *bfa, struct bfad_s *bfad, | |||
95 | 88 | ||
96 | for (i = 0; i < sizeof(fcs_modules) / sizeof(fcs_modules[0]); i++) { | 89 | for (i = 0; i < sizeof(fcs_modules) / sizeof(fcs_modules[0]); i++) { |
97 | mod = &fcs_modules[i]; | 90 | mod = &fcs_modules[i]; |
98 | mod->modinit(fcs); | 91 | if (mod->attach) |
92 | mod->attach(fcs); | ||
93 | } | ||
94 | } | ||
95 | |||
96 | /** | ||
97 | * fcs initialization, called once after bfa initialization is complete | ||
98 | */ | ||
99 | void | ||
100 | bfa_fcs_init(struct bfa_fcs_s *fcs) | ||
101 | { | ||
102 | int i; | ||
103 | struct bfa_fcs_mod_s *mod; | ||
104 | |||
105 | for (i = 0; i < sizeof(fcs_modules) / sizeof(fcs_modules[0]); i++) { | ||
106 | mod = &fcs_modules[i]; | ||
107 | if (mod->modinit) | ||
108 | mod->modinit(fcs); | ||
99 | } | 109 | } |
100 | } | 110 | } |
101 | 111 | ||
@@ -127,6 +137,23 @@ bfa_fcs_driver_info_init(struct bfa_fcs_s *fcs, | |||
127 | } | 137 | } |
128 | 138 | ||
129 | /** | 139 | /** |
140 | * @brief | ||
141 | * FCS FDMI Driver Parameter Initialization | ||
142 | * | ||
143 | * @param[in] fcs FCS instance | ||
144 | * @param[in] fdmi_enable TRUE/FALSE | ||
145 | * | ||
146 | * @return None | ||
147 | */ | ||
148 | void | ||
149 | bfa_fcs_set_fdmi_param(struct bfa_fcs_s *fcs, bfa_boolean_t fdmi_enable) | ||
150 | { | ||
151 | |||
152 | fcs->fdmi_enabled = fdmi_enable; | ||
153 | |||
154 | } | ||
155 | |||
156 | /** | ||
130 | * FCS instance cleanup and exit. | 157 | * FCS instance cleanup and exit. |
131 | * | 158 | * |
132 | * param[in] fcs FCS instance | 159 | * param[in] fcs FCS instance |
@@ -143,10 +170,12 @@ bfa_fcs_exit(struct bfa_fcs_s *fcs) | |||
143 | nmods = sizeof(fcs_modules) / sizeof(fcs_modules[0]); | 170 | nmods = sizeof(fcs_modules) / sizeof(fcs_modules[0]); |
144 | 171 | ||
145 | for (i = 0; i < nmods; i++) { | 172 | for (i = 0; i < nmods; i++) { |
146 | bfa_wc_up(&fcs->wc); | ||
147 | 173 | ||
148 | mod = &fcs_modules[i]; | 174 | mod = &fcs_modules[i]; |
149 | mod->modexit(fcs); | 175 | if (mod->modexit) { |
176 | bfa_wc_up(&fcs->wc); | ||
177 | mod->modexit(fcs); | ||
178 | } | ||
150 | } | 179 | } |
151 | 180 | ||
152 | bfa_wc_wait(&fcs->wc); | 181 | bfa_wc_wait(&fcs->wc); |
diff --git a/drivers/scsi/bfa/bfa_fcs_lport.c b/drivers/scsi/bfa/bfa_fcs_lport.c index c7ab257f10a7..7c1251c682d8 100644 --- a/drivers/scsi/bfa/bfa_fcs_lport.c +++ b/drivers/scsi/bfa/bfa_fcs_lport.c | |||
@@ -114,7 +114,7 @@ bfa_fcs_port_sm_uninit(struct bfa_fcs_port_s *port, | |||
114 | break; | 114 | break; |
115 | 115 | ||
116 | default: | 116 | default: |
117 | bfa_assert(0); | 117 | bfa_sm_fault(port->fcs, event); |
118 | } | 118 | } |
119 | } | 119 | } |
120 | 120 | ||
@@ -136,7 +136,7 @@ bfa_fcs_port_sm_init(struct bfa_fcs_port_s *port, enum bfa_fcs_port_event event) | |||
136 | break; | 136 | break; |
137 | 137 | ||
138 | default: | 138 | default: |
139 | bfa_assert(0); | 139 | bfa_sm_fault(port->fcs, event); |
140 | } | 140 | } |
141 | } | 141 | } |
142 | 142 | ||
@@ -176,7 +176,7 @@ bfa_fcs_port_sm_online(struct bfa_fcs_port_s *port, | |||
176 | break; | 176 | break; |
177 | 177 | ||
178 | default: | 178 | default: |
179 | bfa_assert(0); | 179 | bfa_sm_fault(port->fcs, event); |
180 | } | 180 | } |
181 | } | 181 | } |
182 | 182 | ||
@@ -214,7 +214,7 @@ bfa_fcs_port_sm_offline(struct bfa_fcs_port_s *port, | |||
214 | break; | 214 | break; |
215 | 215 | ||
216 | default: | 216 | default: |
217 | bfa_assert(0); | 217 | bfa_sm_fault(port->fcs, event); |
218 | } | 218 | } |
219 | } | 219 | } |
220 | 220 | ||
@@ -234,7 +234,7 @@ bfa_fcs_port_sm_deleting(struct bfa_fcs_port_s *port, | |||
234 | break; | 234 | break; |
235 | 235 | ||
236 | default: | 236 | default: |
237 | bfa_assert(0); | 237 | bfa_sm_fault(port->fcs, event); |
238 | } | 238 | } |
239 | } | 239 | } |
240 | 240 | ||
@@ -263,30 +263,8 @@ bfa_fcs_port_aen_post(struct bfa_fcs_port_s *port, | |||
263 | 263 | ||
264 | bfa_assert(role <= BFA_PORT_ROLE_FCP_MAX); | 264 | bfa_assert(role <= BFA_PORT_ROLE_FCP_MAX); |
265 | 265 | ||
266 | switch (event) { | 266 | bfa_log(logmod, BFA_LOG_CREATE_ID(BFA_AEN_CAT_LPORT, event), lpwwn_ptr, |
267 | case BFA_LPORT_AEN_ONLINE: | 267 | role_str[role/2]); |
268 | bfa_log(logmod, BFA_AEN_LPORT_ONLINE, lpwwn_ptr, | ||
269 | role_str[role / 2]); | ||
270 | break; | ||
271 | case BFA_LPORT_AEN_OFFLINE: | ||
272 | bfa_log(logmod, BFA_AEN_LPORT_OFFLINE, lpwwn_ptr, | ||
273 | role_str[role / 2]); | ||
274 | break; | ||
275 | case BFA_LPORT_AEN_NEW: | ||
276 | bfa_log(logmod, BFA_AEN_LPORT_NEW, lpwwn_ptr, | ||
277 | role_str[role / 2]); | ||
278 | break; | ||
279 | case BFA_LPORT_AEN_DELETE: | ||
280 | bfa_log(logmod, BFA_AEN_LPORT_DELETE, lpwwn_ptr, | ||
281 | role_str[role / 2]); | ||
282 | break; | ||
283 | case BFA_LPORT_AEN_DISCONNECT: | ||
284 | bfa_log(logmod, BFA_AEN_LPORT_DISCONNECT, lpwwn_ptr, | ||
285 | role_str[role / 2]); | ||
286 | break; | ||
287 | default: | ||
288 | break; | ||
289 | } | ||
290 | 268 | ||
291 | aen_data.lport.vf_id = port->fabric->vf_id; | 269 | aen_data.lport.vf_id = port->fabric->vf_id; |
292 | aen_data.lport.roles = role; | 270 | aen_data.lport.roles = role; |
@@ -873,36 +851,46 @@ bfa_fcs_port_is_online(struct bfa_fcs_port_s *port) | |||
873 | } | 851 | } |
874 | 852 | ||
875 | /** | 853 | /** |
876 | * Logical port initialization of base or virtual port. | 854 | * Attach time initialization of logical ports. |
877 | * Called by fabric for base port or by vport for virtual ports. | ||
878 | */ | 855 | */ |
879 | void | 856 | void |
880 | bfa_fcs_lport_init(struct bfa_fcs_port_s *lport, struct bfa_fcs_s *fcs, | 857 | bfa_fcs_lport_attach(struct bfa_fcs_port_s *lport, struct bfa_fcs_s *fcs, |
881 | u16 vf_id, struct bfa_port_cfg_s *port_cfg, | 858 | uint16_t vf_id, struct bfa_fcs_vport_s *vport) |
882 | struct bfa_fcs_vport_s *vport) | ||
883 | { | 859 | { |
884 | lport->fcs = fcs; | 860 | lport->fcs = fcs; |
885 | lport->fabric = bfa_fcs_vf_lookup(fcs, vf_id); | 861 | lport->fabric = bfa_fcs_vf_lookup(fcs, vf_id); |
886 | bfa_os_assign(lport->port_cfg, *port_cfg); | ||
887 | lport->vport = vport; | 862 | lport->vport = vport; |
888 | lport->lp_tag = (vport) ? bfa_lps_get_tag(vport->lps) : | 863 | lport->lp_tag = (vport) ? bfa_lps_get_tag(vport->lps) : |
889 | bfa_lps_get_tag(lport->fabric->lps); | 864 | bfa_lps_get_tag(lport->fabric->lps); |
890 | 865 | ||
891 | INIT_LIST_HEAD(&lport->rport_q); | 866 | INIT_LIST_HEAD(&lport->rport_q); |
892 | lport->num_rports = 0; | 867 | lport->num_rports = 0; |
868 | } | ||
869 | |||
870 | /** | ||
871 | * Logical port initialization of base or virtual port. | ||
872 | * Called by fabric for base port or by vport for virtual ports. | ||
873 | */ | ||
893 | 874 | ||
894 | lport->bfad_port = | 875 | void |
895 | bfa_fcb_port_new(fcs->bfad, lport, lport->port_cfg.roles, | 876 | bfa_fcs_lport_init(struct bfa_fcs_port_s *lport, |
877 | struct bfa_port_cfg_s *port_cfg) | ||
878 | { | ||
879 | struct bfa_fcs_vport_s *vport = lport->vport; | ||
880 | |||
881 | bfa_os_assign(lport->port_cfg, *port_cfg); | ||
882 | |||
883 | lport->bfad_port = bfa_fcb_port_new(lport->fcs->bfad, lport, | ||
884 | lport->port_cfg.roles, | ||
896 | lport->fabric->vf_drv, | 885 | lport->fabric->vf_drv, |
897 | vport ? vport->vport_drv : NULL); | 886 | vport ? vport->vport_drv : NULL); |
887 | |||
898 | bfa_fcs_port_aen_post(lport, BFA_LPORT_AEN_NEW); | 888 | bfa_fcs_port_aen_post(lport, BFA_LPORT_AEN_NEW); |
899 | 889 | ||
900 | bfa_sm_set_state(lport, bfa_fcs_port_sm_uninit); | 890 | bfa_sm_set_state(lport, bfa_fcs_port_sm_uninit); |
901 | bfa_sm_send_event(lport, BFA_FCS_PORT_SM_CREATE); | 891 | bfa_sm_send_event(lport, BFA_FCS_PORT_SM_CREATE); |
902 | } | 892 | } |
903 | 893 | ||
904 | |||
905 | |||
906 | /** | 894 | /** |
907 | * fcs_lport_api | 895 | * fcs_lport_api |
908 | */ | 896 | */ |
@@ -921,13 +909,20 @@ bfa_fcs_port_get_attr(struct bfa_fcs_port_s *port, | |||
921 | if (port->fabric) { | 909 | if (port->fabric) { |
922 | port_attr->port_type = bfa_fcs_fabric_port_type(port->fabric); | 910 | port_attr->port_type = bfa_fcs_fabric_port_type(port->fabric); |
923 | port_attr->loopback = bfa_fcs_fabric_is_loopback(port->fabric); | 911 | port_attr->loopback = bfa_fcs_fabric_is_loopback(port->fabric); |
912 | port_attr->authfail = | ||
913 | bfa_fcs_fabric_is_auth_failed(port->fabric); | ||
924 | port_attr->fabric_name = bfa_fcs_port_get_fabric_name(port); | 914 | port_attr->fabric_name = bfa_fcs_port_get_fabric_name(port); |
925 | memcpy(port_attr->fabric_ip_addr, | 915 | memcpy(port_attr->fabric_ip_addr, |
926 | bfa_fcs_port_get_fabric_ipaddr(port), | 916 | bfa_fcs_port_get_fabric_ipaddr(port), |
927 | BFA_FCS_FABRIC_IPADDR_SZ); | 917 | BFA_FCS_FABRIC_IPADDR_SZ); |
928 | 918 | ||
929 | if (port->vport != NULL) | 919 | if (port->vport != NULL) { |
930 | port_attr->port_type = BFA_PPORT_TYPE_VPORT; | 920 | port_attr->port_type = BFA_PPORT_TYPE_VPORT; |
921 | port_attr->fpma_mac = | ||
922 | bfa_lps_get_lp_mac(port->vport->lps); | ||
923 | } else | ||
924 | port_attr->fpma_mac = | ||
925 | bfa_lps_get_lp_mac(port->fabric->lps); | ||
931 | 926 | ||
932 | } else { | 927 | } else { |
933 | port_attr->port_type = BFA_PPORT_TYPE_UNKNOWN; | 928 | port_attr->port_type = BFA_PPORT_TYPE_UNKNOWN; |
diff --git a/drivers/scsi/bfa/bfa_fcs_port.c b/drivers/scsi/bfa/bfa_fcs_port.c index 9c4b24e62de1..3c27788cd527 100644 --- a/drivers/scsi/bfa/bfa_fcs_port.c +++ b/drivers/scsi/bfa/bfa_fcs_port.c | |||
@@ -55,14 +55,7 @@ bfa_fcs_pport_event_handler(void *cbarg, bfa_pport_event_t event) | |||
55 | } | 55 | } |
56 | 56 | ||
57 | void | 57 | void |
58 | bfa_fcs_pport_modinit(struct bfa_fcs_s *fcs) | 58 | bfa_fcs_pport_attach(struct bfa_fcs_s *fcs) |
59 | { | 59 | { |
60 | bfa_pport_event_register(fcs->bfa, bfa_fcs_pport_event_handler, | 60 | bfa_fcport_event_register(fcs->bfa, bfa_fcs_pport_event_handler, fcs); |
61 | fcs); | ||
62 | } | ||
63 | |||
64 | void | ||
65 | bfa_fcs_pport_modexit(struct bfa_fcs_s *fcs) | ||
66 | { | ||
67 | bfa_fcs_modexit_comp(fcs); | ||
68 | } | 61 | } |
diff --git a/drivers/scsi/bfa/bfa_fcs_uf.c b/drivers/scsi/bfa/bfa_fcs_uf.c index ad01db6444b2..3d57d48bbae4 100644 --- a/drivers/scsi/bfa/bfa_fcs_uf.c +++ b/drivers/scsi/bfa/bfa_fcs_uf.c | |||
@@ -93,13 +93,7 @@ bfa_fcs_uf_recv(void *cbarg, struct bfa_uf_s *uf) | |||
93 | } | 93 | } |
94 | 94 | ||
95 | void | 95 | void |
96 | bfa_fcs_uf_modinit(struct bfa_fcs_s *fcs) | 96 | bfa_fcs_uf_attach(struct bfa_fcs_s *fcs) |
97 | { | 97 | { |
98 | bfa_uf_recv_register(fcs->bfa, bfa_fcs_uf_recv, fcs); | 98 | bfa_uf_recv_register(fcs->bfa, bfa_fcs_uf_recv, fcs); |
99 | } | 99 | } |
100 | |||
101 | void | ||
102 | bfa_fcs_uf_modexit(struct bfa_fcs_s *fcs) | ||
103 | { | ||
104 | bfa_fcs_modexit_comp(fcs); | ||
105 | } | ||
diff --git a/drivers/scsi/bfa/bfa_hw_cb.c b/drivers/scsi/bfa/bfa_hw_cb.c index ede1438619e2..871a4e28575c 100644 --- a/drivers/scsi/bfa/bfa_hw_cb.c +++ b/drivers/scsi/bfa/bfa_hw_cb.c | |||
@@ -53,6 +53,18 @@ bfa_hwcb_reginit(struct bfa_s *bfa) | |||
53 | } | 53 | } |
54 | 54 | ||
55 | void | 55 | void |
56 | bfa_hwcb_reqq_ack(struct bfa_s *bfa, int reqq) | ||
57 | { | ||
58 | } | ||
59 | |||
60 | static void | ||
61 | bfa_hwcb_reqq_ack_msix(struct bfa_s *bfa, int reqq) | ||
62 | { | ||
63 | bfa_reg_write(bfa->iocfc.bfa_regs.intr_status, | ||
64 | __HFN_INT_CPE_Q0 << CPE_Q_NUM(bfa_ioc_pcifn(&bfa->ioc), reqq)); | ||
65 | } | ||
66 | |||
67 | void | ||
56 | bfa_hwcb_rspq_ack(struct bfa_s *bfa, int rspq) | 68 | bfa_hwcb_rspq_ack(struct bfa_s *bfa, int rspq) |
57 | { | 69 | { |
58 | } | 70 | } |
@@ -136,6 +148,7 @@ bfa_hwcb_msix_uninstall(struct bfa_s *bfa) | |||
136 | void | 148 | void |
137 | bfa_hwcb_isr_mode_set(struct bfa_s *bfa, bfa_boolean_t msix) | 149 | bfa_hwcb_isr_mode_set(struct bfa_s *bfa, bfa_boolean_t msix) |
138 | { | 150 | { |
151 | bfa->iocfc.hwif.hw_reqq_ack = bfa_hwcb_reqq_ack_msix; | ||
139 | bfa->iocfc.hwif.hw_rspq_ack = bfa_hwcb_rspq_ack_msix; | 152 | bfa->iocfc.hwif.hw_rspq_ack = bfa_hwcb_rspq_ack_msix; |
140 | } | 153 | } |
141 | 154 | ||
diff --git a/drivers/scsi/bfa/bfa_hw_ct.c b/drivers/scsi/bfa/bfa_hw_ct.c index 51ae5740e6e9..76ceb9a4bf2f 100644 --- a/drivers/scsi/bfa/bfa_hw_ct.c +++ b/drivers/scsi/bfa/bfa_hw_ct.c | |||
@@ -85,6 +85,15 @@ bfa_hwct_reginit(struct bfa_s *bfa) | |||
85 | } | 85 | } |
86 | 86 | ||
87 | void | 87 | void |
88 | bfa_hwct_reqq_ack(struct bfa_s *bfa, int reqq) | ||
89 | { | ||
90 | u32 r32; | ||
91 | |||
92 | r32 = bfa_reg_read(bfa->iocfc.bfa_regs.cpe_q_ctrl[reqq]); | ||
93 | bfa_reg_write(bfa->iocfc.bfa_regs.cpe_q_ctrl[reqq], r32); | ||
94 | } | ||
95 | |||
96 | void | ||
88 | bfa_hwct_rspq_ack(struct bfa_s *bfa, int rspq) | 97 | bfa_hwct_rspq_ack(struct bfa_s *bfa, int rspq) |
89 | { | 98 | { |
90 | u32 r32; | 99 | u32 r32; |
diff --git a/drivers/scsi/bfa/bfa_intr.c b/drivers/scsi/bfa/bfa_intr.c index b36540e4ed76..0eba3f930d5b 100644 --- a/drivers/scsi/bfa/bfa_intr.c +++ b/drivers/scsi/bfa/bfa_intr.c | |||
@@ -15,7 +15,7 @@ | |||
15 | * General Public License for more details. | 15 | * General Public License for more details. |
16 | */ | 16 | */ |
17 | #include <bfa.h> | 17 | #include <bfa.h> |
18 | #include <bfi/bfi_cbreg.h> | 18 | #include <bfi/bfi_ctreg.h> |
19 | #include <bfa_port_priv.h> | 19 | #include <bfa_port_priv.h> |
20 | #include <bfa_intr_priv.h> | 20 | #include <bfa_intr_priv.h> |
21 | #include <cs/bfa_debug.h> | 21 | #include <cs/bfa_debug.h> |
@@ -34,6 +34,26 @@ bfa_msix_lpu(struct bfa_s *bfa) | |||
34 | bfa_ioc_mbox_isr(&bfa->ioc); | 34 | bfa_ioc_mbox_isr(&bfa->ioc); |
35 | } | 35 | } |
36 | 36 | ||
37 | static void | ||
38 | bfa_reqq_resume(struct bfa_s *bfa, int qid) | ||
39 | { | ||
40 | struct list_head *waitq, *qe, *qen; | ||
41 | struct bfa_reqq_wait_s *wqe; | ||
42 | |||
43 | waitq = bfa_reqq(bfa, qid); | ||
44 | list_for_each_safe(qe, qen, waitq) { | ||
45 | /** | ||
46 | * Callback only as long as there is room in request queue | ||
47 | */ | ||
48 | if (bfa_reqq_full(bfa, qid)) | ||
49 | break; | ||
50 | |||
51 | list_del(qe); | ||
52 | wqe = (struct bfa_reqq_wait_s *) qe; | ||
53 | wqe->qresume(wqe->cbarg); | ||
54 | } | ||
55 | } | ||
56 | |||
37 | void | 57 | void |
38 | bfa_msix_all(struct bfa_s *bfa, int vec) | 58 | bfa_msix_all(struct bfa_s *bfa, int vec) |
39 | { | 59 | { |
@@ -96,7 +116,8 @@ bfa_isr_enable(struct bfa_s *bfa) | |||
96 | 116 | ||
97 | bfa_msix_install(bfa); | 117 | bfa_msix_install(bfa); |
98 | intr_unmask = (__HFN_INT_ERR_EMC | __HFN_INT_ERR_LPU0 | | 118 | intr_unmask = (__HFN_INT_ERR_EMC | __HFN_INT_ERR_LPU0 | |
99 | __HFN_INT_ERR_LPU1 | __HFN_INT_ERR_PSS); | 119 | __HFN_INT_ERR_LPU1 | __HFN_INT_ERR_PSS | |
120 | __HFN_INT_LL_HALT); | ||
100 | 121 | ||
101 | if (pci_func == 0) | 122 | if (pci_func == 0) |
102 | intr_unmask |= (__HFN_INT_CPE_Q0 | __HFN_INT_CPE_Q1 | | 123 | intr_unmask |= (__HFN_INT_CPE_Q0 | __HFN_INT_CPE_Q1 | |
@@ -127,23 +148,18 @@ bfa_isr_disable(struct bfa_s *bfa) | |||
127 | void | 148 | void |
128 | bfa_msix_reqq(struct bfa_s *bfa, int qid) | 149 | bfa_msix_reqq(struct bfa_s *bfa, int qid) |
129 | { | 150 | { |
130 | struct list_head *waitq, *qe, *qen; | 151 | struct list_head *waitq; |
131 | struct bfa_reqq_wait_s *wqe; | ||
132 | 152 | ||
133 | qid &= (BFI_IOC_MAX_CQS - 1); | 153 | qid &= (BFI_IOC_MAX_CQS - 1); |
134 | 154 | ||
135 | waitq = bfa_reqq(bfa, qid); | 155 | bfa->iocfc.hwif.hw_reqq_ack(bfa, qid); |
136 | list_for_each_safe(qe, qen, waitq) { | ||
137 | /** | ||
138 | * Callback only as long as there is room in request queue | ||
139 | */ | ||
140 | if (bfa_reqq_full(bfa, qid)) | ||
141 | break; | ||
142 | 156 | ||
143 | list_del(qe); | 157 | /** |
144 | wqe = (struct bfa_reqq_wait_s *) qe; | 158 | * Resume any pending requests in the corresponding reqq. |
145 | wqe->qresume(wqe->cbarg); | 159 | */ |
146 | } | 160 | waitq = bfa_reqq(bfa, qid); |
161 | if (!list_empty(waitq)) | ||
162 | bfa_reqq_resume(bfa, qid); | ||
147 | } | 163 | } |
148 | 164 | ||
149 | void | 165 | void |
@@ -157,26 +173,27 @@ bfa_isr_unhandled(struct bfa_s *bfa, struct bfi_msg_s *m) | |||
157 | } | 173 | } |
158 | 174 | ||
159 | void | 175 | void |
160 | bfa_msix_rspq(struct bfa_s *bfa, int rsp_qid) | 176 | bfa_msix_rspq(struct bfa_s *bfa, int qid) |
161 | { | 177 | { |
162 | struct bfi_msg_s *m; | 178 | struct bfi_msg_s *m; |
163 | u32 pi, ci; | 179 | u32 pi, ci; |
180 | struct list_head *waitq; | ||
164 | 181 | ||
165 | bfa_trc_fp(bfa, rsp_qid); | 182 | bfa_trc_fp(bfa, qid); |
166 | 183 | ||
167 | rsp_qid &= (BFI_IOC_MAX_CQS - 1); | 184 | qid &= (BFI_IOC_MAX_CQS - 1); |
168 | 185 | ||
169 | bfa->iocfc.hwif.hw_rspq_ack(bfa, rsp_qid); | 186 | bfa->iocfc.hwif.hw_rspq_ack(bfa, qid); |
170 | 187 | ||
171 | ci = bfa_rspq_ci(bfa, rsp_qid); | 188 | ci = bfa_rspq_ci(bfa, qid); |
172 | pi = bfa_rspq_pi(bfa, rsp_qid); | 189 | pi = bfa_rspq_pi(bfa, qid); |
173 | 190 | ||
174 | bfa_trc_fp(bfa, ci); | 191 | bfa_trc_fp(bfa, ci); |
175 | bfa_trc_fp(bfa, pi); | 192 | bfa_trc_fp(bfa, pi); |
176 | 193 | ||
177 | if (bfa->rme_process) { | 194 | if (bfa->rme_process) { |
178 | while (ci != pi) { | 195 | while (ci != pi) { |
179 | m = bfa_rspq_elem(bfa, rsp_qid, ci); | 196 | m = bfa_rspq_elem(bfa, qid, ci); |
180 | bfa_assert_fp(m->mhdr.msg_class < BFI_MC_MAX); | 197 | bfa_assert_fp(m->mhdr.msg_class < BFI_MC_MAX); |
181 | 198 | ||
182 | bfa_isrs[m->mhdr.msg_class] (bfa, m); | 199 | bfa_isrs[m->mhdr.msg_class] (bfa, m); |
@@ -188,25 +205,59 @@ bfa_msix_rspq(struct bfa_s *bfa, int rsp_qid) | |||
188 | /** | 205 | /** |
189 | * update CI | 206 | * update CI |
190 | */ | 207 | */ |
191 | bfa_rspq_ci(bfa, rsp_qid) = pi; | 208 | bfa_rspq_ci(bfa, qid) = pi; |
192 | bfa_reg_write(bfa->iocfc.bfa_regs.rme_q_ci[rsp_qid], pi); | 209 | bfa_reg_write(bfa->iocfc.bfa_regs.rme_q_ci[qid], pi); |
193 | bfa_os_mmiowb(); | 210 | bfa_os_mmiowb(); |
211 | |||
212 | /** | ||
213 | * Resume any pending requests in the corresponding reqq. | ||
214 | */ | ||
215 | waitq = bfa_reqq(bfa, qid); | ||
216 | if (!list_empty(waitq)) | ||
217 | bfa_reqq_resume(bfa, qid); | ||
194 | } | 218 | } |
195 | 219 | ||
196 | void | 220 | void |
197 | bfa_msix_lpu_err(struct bfa_s *bfa, int vec) | 221 | bfa_msix_lpu_err(struct bfa_s *bfa, int vec) |
198 | { | 222 | { |
199 | u32 intr; | 223 | u32 intr, curr_value; |
200 | 224 | ||
201 | intr = bfa_reg_read(bfa->iocfc.bfa_regs.intr_status); | 225 | intr = bfa_reg_read(bfa->iocfc.bfa_regs.intr_status); |
202 | 226 | ||
203 | if (intr & (__HFN_INT_MBOX_LPU0 | __HFN_INT_MBOX_LPU1)) | 227 | if (intr & (__HFN_INT_MBOX_LPU0 | __HFN_INT_MBOX_LPU1)) |
204 | bfa_msix_lpu(bfa); | 228 | bfa_msix_lpu(bfa); |
205 | 229 | ||
206 | if (intr & (__HFN_INT_ERR_EMC | | 230 | intr &= (__HFN_INT_ERR_EMC | __HFN_INT_ERR_LPU0 | |
207 | __HFN_INT_ERR_LPU0 | __HFN_INT_ERR_LPU1 | | 231 | __HFN_INT_ERR_LPU1 | __HFN_INT_ERR_PSS | __HFN_INT_LL_HALT); |
208 | __HFN_INT_ERR_PSS)) | 232 | |
233 | if (intr) { | ||
234 | if (intr & __HFN_INT_LL_HALT) { | ||
235 | /** | ||
236 | * If LL_HALT bit is set then FW Init Halt LL Port | ||
237 | * Register needs to be cleared as well so Interrupt | ||
238 | * Status Register will be cleared. | ||
239 | */ | ||
240 | curr_value = bfa_reg_read(bfa->ioc.ioc_regs.ll_halt); | ||
241 | curr_value &= ~__FW_INIT_HALT_P; | ||
242 | bfa_reg_write(bfa->ioc.ioc_regs.ll_halt, curr_value); | ||
243 | } | ||
244 | |||
245 | if (intr & __HFN_INT_ERR_PSS) { | ||
246 | /** | ||
247 | * ERR_PSS bit needs to be cleared as well in case | ||
248 | * interrups are shared so driver's interrupt handler is | ||
249 | * still called eventhough it is already masked out. | ||
250 | */ | ||
251 | curr_value = bfa_reg_read( | ||
252 | bfa->ioc.ioc_regs.pss_err_status_reg); | ||
253 | curr_value &= __PSS_ERR_STATUS_SET; | ||
254 | bfa_reg_write(bfa->ioc.ioc_regs.pss_err_status_reg, | ||
255 | curr_value); | ||
256 | } | ||
257 | |||
258 | bfa_reg_write(bfa->iocfc.bfa_regs.intr_status, intr); | ||
209 | bfa_msix_errint(bfa, intr); | 259 | bfa_msix_errint(bfa, intr); |
260 | } | ||
210 | } | 261 | } |
211 | 262 | ||
212 | void | 263 | void |
diff --git a/drivers/scsi/bfa/bfa_ioc.c b/drivers/scsi/bfa/bfa_ioc.c index 397d7e9eade5..e038bc9769f6 100644 --- a/drivers/scsi/bfa/bfa_ioc.c +++ b/drivers/scsi/bfa/bfa_ioc.c | |||
@@ -18,7 +18,7 @@ | |||
18 | #include <bfa.h> | 18 | #include <bfa.h> |
19 | #include <bfa_ioc.h> | 19 | #include <bfa_ioc.h> |
20 | #include <bfa_fwimg_priv.h> | 20 | #include <bfa_fwimg_priv.h> |
21 | #include <bfa_trcmod_priv.h> | 21 | #include <cna/bfa_cna_trcmod.h> |
22 | #include <cs/bfa_debug.h> | 22 | #include <cs/bfa_debug.h> |
23 | #include <bfi/bfi_ioc.h> | 23 | #include <bfi/bfi_ioc.h> |
24 | #include <bfi/bfi_ctreg.h> | 24 | #include <bfi/bfi_ctreg.h> |
@@ -27,18 +27,17 @@ | |||
27 | #include <log/bfa_log_hal.h> | 27 | #include <log/bfa_log_hal.h> |
28 | #include <defs/bfa_defs_pci.h> | 28 | #include <defs/bfa_defs_pci.h> |
29 | 29 | ||
30 | BFA_TRC_FILE(HAL, IOC); | 30 | BFA_TRC_FILE(CNA, IOC); |
31 | 31 | ||
32 | /** | 32 | /** |
33 | * IOC local definitions | 33 | * IOC local definitions |
34 | */ | 34 | */ |
35 | #define BFA_IOC_TOV 2000 /* msecs */ | 35 | #define BFA_IOC_TOV 2000 /* msecs */ |
36 | #define BFA_IOC_HB_TOV 1000 /* msecs */ | 36 | #define BFA_IOC_HWSEM_TOV 500 /* msecs */ |
37 | #define BFA_IOC_HB_FAIL_MAX 4 | 37 | #define BFA_IOC_HB_TOV 500 /* msecs */ |
38 | #define BFA_IOC_HWINIT_MAX 2 | 38 | #define BFA_IOC_HWINIT_MAX 2 |
39 | #define BFA_IOC_FWIMG_MINSZ (16 * 1024) | 39 | #define BFA_IOC_FWIMG_MINSZ (16 * 1024) |
40 | #define BFA_IOC_TOV_RECOVER (BFA_IOC_HB_FAIL_MAX * BFA_IOC_HB_TOV \ | 40 | #define BFA_IOC_TOV_RECOVER BFA_IOC_HB_TOV |
41 | + BFA_IOC_TOV) | ||
42 | 41 | ||
43 | #define bfa_ioc_timer_start(__ioc) \ | 42 | #define bfa_ioc_timer_start(__ioc) \ |
44 | bfa_timer_begin((__ioc)->timer_mod, &(__ioc)->ioc_timer, \ | 43 | bfa_timer_begin((__ioc)->timer_mod, &(__ioc)->ioc_timer, \ |
@@ -51,12 +50,25 @@ BFA_TRC_FILE(HAL, IOC); | |||
51 | (sizeof(struct bfa_trc_mod_s) - \ | 50 | (sizeof(struct bfa_trc_mod_s) - \ |
52 | BFA_TRC_MAX * sizeof(struct bfa_trc_s))) | 51 | BFA_TRC_MAX * sizeof(struct bfa_trc_s))) |
53 | #define BFA_DBG_FWTRC_OFF(_fn) (BFI_IOC_TRC_OFF + BFA_DBG_FWTRC_LEN * (_fn)) | 52 | #define BFA_DBG_FWTRC_OFF(_fn) (BFI_IOC_TRC_OFF + BFA_DBG_FWTRC_LEN * (_fn)) |
54 | #define bfa_ioc_stats(_ioc, _stats) ((_ioc)->stats._stats++) | ||
55 | 53 | ||
56 | #define BFA_FLASH_CHUNK_NO(off) (off / BFI_FLASH_CHUNK_SZ_WORDS) | 54 | /** |
57 | #define BFA_FLASH_OFFSET_IN_CHUNK(off) (off % BFI_FLASH_CHUNK_SZ_WORDS) | 55 | * Asic specific macros : see bfa_hw_cb.c and bfa_hw_ct.c for details. |
58 | #define BFA_FLASH_CHUNK_ADDR(chunkno) (chunkno * BFI_FLASH_CHUNK_SZ_WORDS) | 56 | */ |
59 | bfa_boolean_t bfa_auto_recover = BFA_FALSE; | 57 | |
58 | #define bfa_ioc_firmware_lock(__ioc) \ | ||
59 | ((__ioc)->ioc_hwif->ioc_firmware_lock(__ioc)) | ||
60 | #define bfa_ioc_firmware_unlock(__ioc) \ | ||
61 | ((__ioc)->ioc_hwif->ioc_firmware_unlock(__ioc)) | ||
62 | #define bfa_ioc_fwimg_get_chunk(__ioc, __off) \ | ||
63 | ((__ioc)->ioc_hwif->ioc_fwimg_get_chunk(__ioc, __off)) | ||
64 | #define bfa_ioc_fwimg_get_size(__ioc) \ | ||
65 | ((__ioc)->ioc_hwif->ioc_fwimg_get_size(__ioc)) | ||
66 | #define bfa_ioc_reg_init(__ioc) ((__ioc)->ioc_hwif->ioc_reg_init(__ioc)) | ||
67 | #define bfa_ioc_map_port(__ioc) ((__ioc)->ioc_hwif->ioc_map_port(__ioc)) | ||
68 | #define bfa_ioc_notify_hbfail(__ioc) \ | ||
69 | ((__ioc)->ioc_hwif->ioc_notify_hbfail(__ioc)) | ||
70 | |||
71 | bfa_boolean_t bfa_auto_recover = BFA_TRUE; | ||
60 | 72 | ||
61 | /* | 73 | /* |
62 | * forward declarations | 74 | * forward declarations |
@@ -64,7 +76,6 @@ bfa_boolean_t bfa_auto_recover = BFA_FALSE; | |||
64 | static void bfa_ioc_aen_post(struct bfa_ioc_s *bfa, | 76 | static void bfa_ioc_aen_post(struct bfa_ioc_s *bfa, |
65 | enum bfa_ioc_aen_event event); | 77 | enum bfa_ioc_aen_event event); |
66 | static void bfa_ioc_hw_sem_get(struct bfa_ioc_s *ioc); | 78 | static void bfa_ioc_hw_sem_get(struct bfa_ioc_s *ioc); |
67 | static void bfa_ioc_hw_sem_release(struct bfa_ioc_s *ioc); | ||
68 | static void bfa_ioc_hw_sem_get_cancel(struct bfa_ioc_s *ioc); | 79 | static void bfa_ioc_hw_sem_get_cancel(struct bfa_ioc_s *ioc); |
69 | static void bfa_ioc_hwinit(struct bfa_ioc_s *ioc, bfa_boolean_t force); | 80 | static void bfa_ioc_hwinit(struct bfa_ioc_s *ioc, bfa_boolean_t force); |
70 | static void bfa_ioc_timeout(void *ioc); | 81 | static void bfa_ioc_timeout(void *ioc); |
@@ -77,8 +88,6 @@ static void bfa_ioc_reset(struct bfa_ioc_s *ioc, bfa_boolean_t force); | |||
77 | static void bfa_ioc_mbox_poll(struct bfa_ioc_s *ioc); | 88 | static void bfa_ioc_mbox_poll(struct bfa_ioc_s *ioc); |
78 | static void bfa_ioc_mbox_hbfail(struct bfa_ioc_s *ioc); | 89 | static void bfa_ioc_mbox_hbfail(struct bfa_ioc_s *ioc); |
79 | static void bfa_ioc_recover(struct bfa_ioc_s *ioc); | 90 | static void bfa_ioc_recover(struct bfa_ioc_s *ioc); |
80 | static bfa_boolean_t bfa_ioc_firmware_lock(struct bfa_ioc_s *ioc); | ||
81 | static void bfa_ioc_firmware_unlock(struct bfa_ioc_s *ioc); | ||
82 | static void bfa_ioc_disable_comp(struct bfa_ioc_s *ioc); | 91 | static void bfa_ioc_disable_comp(struct bfa_ioc_s *ioc); |
83 | static void bfa_ioc_lpu_stop(struct bfa_ioc_s *ioc); | 92 | static void bfa_ioc_lpu_stop(struct bfa_ioc_s *ioc); |
84 | 93 | ||
@@ -508,14 +517,19 @@ bfa_ioc_sm_disabling(struct bfa_ioc_s *ioc, enum ioc_event event) | |||
508 | bfa_trc(ioc, event); | 517 | bfa_trc(ioc, event); |
509 | 518 | ||
510 | switch (event) { | 519 | switch (event) { |
511 | case IOC_E_HWERROR: | ||
512 | case IOC_E_FWRSP_DISABLE: | 520 | case IOC_E_FWRSP_DISABLE: |
513 | bfa_ioc_timer_stop(ioc); | 521 | bfa_ioc_timer_stop(ioc); |
522 | bfa_fsm_set_state(ioc, bfa_ioc_sm_disabled); | ||
523 | break; | ||
524 | |||
525 | case IOC_E_HWERROR: | ||
526 | bfa_ioc_timer_stop(ioc); | ||
514 | /* | 527 | /* |
515 | * !!! fall through !!! | 528 | * !!! fall through !!! |
516 | */ | 529 | */ |
517 | 530 | ||
518 | case IOC_E_TIMEOUT: | 531 | case IOC_E_TIMEOUT: |
532 | bfa_reg_write(ioc->ioc_regs.ioc_fwstate, BFI_IOC_FAIL); | ||
519 | bfa_fsm_set_state(ioc, bfa_ioc_sm_disabled); | 533 | bfa_fsm_set_state(ioc, bfa_ioc_sm_disabled); |
520 | break; | 534 | break; |
521 | 535 | ||
@@ -608,15 +622,12 @@ bfa_ioc_sm_hbfail_entry(struct bfa_ioc_s *ioc) | |||
608 | * Mark IOC as failed in hardware and stop firmware. | 622 | * Mark IOC as failed in hardware and stop firmware. |
609 | */ | 623 | */ |
610 | bfa_ioc_lpu_stop(ioc); | 624 | bfa_ioc_lpu_stop(ioc); |
611 | bfa_reg_write(ioc->ioc_regs.ioc_fwstate, BFI_IOC_HBFAIL); | 625 | bfa_reg_write(ioc->ioc_regs.ioc_fwstate, BFI_IOC_FAIL); |
612 | 626 | ||
613 | if (ioc->pcidev.device_id == BFA_PCI_DEVICE_ID_CT) { | 627 | /** |
614 | bfa_reg_write(ioc->ioc_regs.ll_halt, __FW_INIT_HALT_P); | 628 | * Notify other functions on HB failure. |
615 | /* | 629 | */ |
616 | * Wait for halt to take effect | 630 | bfa_ioc_notify_hbfail(ioc); |
617 | */ | ||
618 | bfa_reg_read(ioc->ioc_regs.ll_halt); | ||
619 | } | ||
620 | 631 | ||
621 | /** | 632 | /** |
622 | * Notify driver and common modules registered for notification. | 633 | * Notify driver and common modules registered for notification. |
@@ -672,6 +683,12 @@ bfa_ioc_sm_hbfail(struct bfa_ioc_s *ioc, enum ioc_event event) | |||
672 | */ | 683 | */ |
673 | break; | 684 | break; |
674 | 685 | ||
686 | case IOC_E_HWERROR: | ||
687 | /* | ||
688 | * HB failure notification, ignore. | ||
689 | */ | ||
690 | break; | ||
691 | |||
675 | default: | 692 | default: |
676 | bfa_sm_fault(ioc, event); | 693 | bfa_sm_fault(ioc, event); |
677 | } | 694 | } |
@@ -700,7 +717,7 @@ bfa_ioc_disable_comp(struct bfa_ioc_s *ioc) | |||
700 | } | 717 | } |
701 | } | 718 | } |
702 | 719 | ||
703 | static void | 720 | void |
704 | bfa_ioc_sem_timeout(void *ioc_arg) | 721 | bfa_ioc_sem_timeout(void *ioc_arg) |
705 | { | 722 | { |
706 | struct bfa_ioc_s *ioc = (struct bfa_ioc_s *)ioc_arg; | 723 | struct bfa_ioc_s *ioc = (struct bfa_ioc_s *)ioc_arg; |
@@ -708,26 +725,32 @@ bfa_ioc_sem_timeout(void *ioc_arg) | |||
708 | bfa_ioc_hw_sem_get(ioc); | 725 | bfa_ioc_hw_sem_get(ioc); |
709 | } | 726 | } |
710 | 727 | ||
711 | static void | 728 | bfa_boolean_t |
712 | bfa_ioc_usage_sem_get(struct bfa_ioc_s *ioc) | 729 | bfa_ioc_sem_get(bfa_os_addr_t sem_reg) |
713 | { | 730 | { |
714 | u32 r32; | 731 | u32 r32; |
715 | int cnt = 0; | 732 | int cnt = 0; |
716 | #define BFA_SEM_SPINCNT 1000 | 733 | #define BFA_SEM_SPINCNT 3000 |
717 | 734 | ||
718 | do { | 735 | r32 = bfa_reg_read(sem_reg); |
719 | r32 = bfa_reg_read(ioc->ioc_regs.ioc_usage_sem_reg); | 736 | |
737 | while (r32 && (cnt < BFA_SEM_SPINCNT)) { | ||
720 | cnt++; | 738 | cnt++; |
721 | if (cnt > BFA_SEM_SPINCNT) | 739 | bfa_os_udelay(2); |
722 | break; | 740 | r32 = bfa_reg_read(sem_reg); |
723 | } while (r32 != 0); | 741 | } |
742 | |||
743 | if (r32 == 0) | ||
744 | return BFA_TRUE; | ||
745 | |||
724 | bfa_assert(cnt < BFA_SEM_SPINCNT); | 746 | bfa_assert(cnt < BFA_SEM_SPINCNT); |
747 | return BFA_FALSE; | ||
725 | } | 748 | } |
726 | 749 | ||
727 | static void | 750 | void |
728 | bfa_ioc_usage_sem_release(struct bfa_ioc_s *ioc) | 751 | bfa_ioc_sem_release(bfa_os_addr_t sem_reg) |
729 | { | 752 | { |
730 | bfa_reg_write(ioc->ioc_regs.ioc_usage_sem_reg, 1); | 753 | bfa_reg_write(sem_reg, 1); |
731 | } | 754 | } |
732 | 755 | ||
733 | static void | 756 | static void |
@@ -737,7 +760,7 @@ bfa_ioc_hw_sem_get(struct bfa_ioc_s *ioc) | |||
737 | 760 | ||
738 | /** | 761 | /** |
739 | * First read to the semaphore register will return 0, subsequent reads | 762 | * First read to the semaphore register will return 0, subsequent reads |
740 | * will return 1. Semaphore is released by writing 0 to the register | 763 | * will return 1. Semaphore is released by writing 1 to the register |
741 | */ | 764 | */ |
742 | r32 = bfa_reg_read(ioc->ioc_regs.ioc_sem_reg); | 765 | r32 = bfa_reg_read(ioc->ioc_regs.ioc_sem_reg); |
743 | if (r32 == 0) { | 766 | if (r32 == 0) { |
@@ -746,10 +769,10 @@ bfa_ioc_hw_sem_get(struct bfa_ioc_s *ioc) | |||
746 | } | 769 | } |
747 | 770 | ||
748 | bfa_timer_begin(ioc->timer_mod, &ioc->sem_timer, bfa_ioc_sem_timeout, | 771 | bfa_timer_begin(ioc->timer_mod, &ioc->sem_timer, bfa_ioc_sem_timeout, |
749 | ioc, BFA_IOC_TOV); | 772 | ioc, BFA_IOC_HWSEM_TOV); |
750 | } | 773 | } |
751 | 774 | ||
752 | static void | 775 | void |
753 | bfa_ioc_hw_sem_release(struct bfa_ioc_s *ioc) | 776 | bfa_ioc_hw_sem_release(struct bfa_ioc_s *ioc) |
754 | { | 777 | { |
755 | bfa_reg_write(ioc->ioc_regs.ioc_sem_reg, 1); | 778 | bfa_reg_write(ioc->ioc_regs.ioc_sem_reg, 1); |
@@ -828,7 +851,7 @@ bfa_ioc_lpu_stop(struct bfa_ioc_s *ioc) | |||
828 | /** | 851 | /** |
829 | * Get driver and firmware versions. | 852 | * Get driver and firmware versions. |
830 | */ | 853 | */ |
831 | static void | 854 | void |
832 | bfa_ioc_fwver_get(struct bfa_ioc_s *ioc, struct bfi_ioc_image_hdr_s *fwhdr) | 855 | bfa_ioc_fwver_get(struct bfa_ioc_s *ioc, struct bfi_ioc_image_hdr_s *fwhdr) |
833 | { | 856 | { |
834 | u32 pgnum, pgoff; | 857 | u32 pgnum, pgoff; |
@@ -847,24 +870,10 @@ bfa_ioc_fwver_get(struct bfa_ioc_s *ioc, struct bfi_ioc_image_hdr_s *fwhdr) | |||
847 | } | 870 | } |
848 | } | 871 | } |
849 | 872 | ||
850 | static u32 * | ||
851 | bfa_ioc_fwimg_get_chunk(struct bfa_ioc_s *ioc, u32 off) | ||
852 | { | ||
853 | if (ioc->ctdev) | ||
854 | return bfi_image_ct_get_chunk(off); | ||
855 | return bfi_image_cb_get_chunk(off); | ||
856 | } | ||
857 | |||
858 | static u32 | ||
859 | bfa_ioc_fwimg_get_size(struct bfa_ioc_s *ioc) | ||
860 | { | ||
861 | return (ioc->ctdev) ? bfi_image_ct_size : bfi_image_cb_size; | ||
862 | } | ||
863 | |||
864 | /** | 873 | /** |
865 | * Returns TRUE if same. | 874 | * Returns TRUE if same. |
866 | */ | 875 | */ |
867 | static bfa_boolean_t | 876 | bfa_boolean_t |
868 | bfa_ioc_fwver_cmp(struct bfa_ioc_s *ioc, struct bfi_ioc_image_hdr_s *fwhdr) | 877 | bfa_ioc_fwver_cmp(struct bfa_ioc_s *ioc, struct bfi_ioc_image_hdr_s *fwhdr) |
869 | { | 878 | { |
870 | struct bfi_ioc_image_hdr_s *drv_fwhdr; | 879 | struct bfi_ioc_image_hdr_s *drv_fwhdr; |
@@ -921,95 +930,6 @@ bfa_ioc_fwver_valid(struct bfa_ioc_s *ioc) | |||
921 | } | 930 | } |
922 | 931 | ||
923 | /** | 932 | /** |
924 | * Return true if firmware of current driver matches the running firmware. | ||
925 | */ | ||
926 | static bfa_boolean_t | ||
927 | bfa_ioc_firmware_lock(struct bfa_ioc_s *ioc) | ||
928 | { | ||
929 | enum bfi_ioc_state ioc_fwstate; | ||
930 | u32 usecnt; | ||
931 | struct bfi_ioc_image_hdr_s fwhdr; | ||
932 | |||
933 | /** | ||
934 | * Firmware match check is relevant only for CNA. | ||
935 | */ | ||
936 | if (!ioc->cna) | ||
937 | return BFA_TRUE; | ||
938 | |||
939 | /** | ||
940 | * If bios boot (flash based) -- do not increment usage count | ||
941 | */ | ||
942 | if (bfa_ioc_fwimg_get_size(ioc) < BFA_IOC_FWIMG_MINSZ) | ||
943 | return BFA_TRUE; | ||
944 | |||
945 | bfa_ioc_usage_sem_get(ioc); | ||
946 | usecnt = bfa_reg_read(ioc->ioc_regs.ioc_usage_reg); | ||
947 | |||
948 | /** | ||
949 | * If usage count is 0, always return TRUE. | ||
950 | */ | ||
951 | if (usecnt == 0) { | ||
952 | bfa_reg_write(ioc->ioc_regs.ioc_usage_reg, 1); | ||
953 | bfa_ioc_usage_sem_release(ioc); | ||
954 | bfa_trc(ioc, usecnt); | ||
955 | return BFA_TRUE; | ||
956 | } | ||
957 | |||
958 | ioc_fwstate = bfa_reg_read(ioc->ioc_regs.ioc_fwstate); | ||
959 | bfa_trc(ioc, ioc_fwstate); | ||
960 | |||
961 | /** | ||
962 | * Use count cannot be non-zero and chip in uninitialized state. | ||
963 | */ | ||
964 | bfa_assert(ioc_fwstate != BFI_IOC_UNINIT); | ||
965 | |||
966 | /** | ||
967 | * Check if another driver with a different firmware is active | ||
968 | */ | ||
969 | bfa_ioc_fwver_get(ioc, &fwhdr); | ||
970 | if (!bfa_ioc_fwver_cmp(ioc, &fwhdr)) { | ||
971 | bfa_ioc_usage_sem_release(ioc); | ||
972 | bfa_trc(ioc, usecnt); | ||
973 | return BFA_FALSE; | ||
974 | } | ||
975 | |||
976 | /** | ||
977 | * Same firmware version. Increment the reference count. | ||
978 | */ | ||
979 | usecnt++; | ||
980 | bfa_reg_write(ioc->ioc_regs.ioc_usage_reg, usecnt); | ||
981 | bfa_ioc_usage_sem_release(ioc); | ||
982 | bfa_trc(ioc, usecnt); | ||
983 | return BFA_TRUE; | ||
984 | } | ||
985 | |||
986 | static void | ||
987 | bfa_ioc_firmware_unlock(struct bfa_ioc_s *ioc) | ||
988 | { | ||
989 | u32 usecnt; | ||
990 | |||
991 | /** | ||
992 | * Firmware lock is relevant only for CNA. | ||
993 | * If bios boot (flash based) -- do not decrement usage count | ||
994 | */ | ||
995 | if (!ioc->cna || (bfa_ioc_fwimg_get_size(ioc) < BFA_IOC_FWIMG_MINSZ)) | ||
996 | return; | ||
997 | |||
998 | /** | ||
999 | * decrement usage count | ||
1000 | */ | ||
1001 | bfa_ioc_usage_sem_get(ioc); | ||
1002 | usecnt = bfa_reg_read(ioc->ioc_regs.ioc_usage_reg); | ||
1003 | bfa_assert(usecnt > 0); | ||
1004 | |||
1005 | usecnt--; | ||
1006 | bfa_reg_write(ioc->ioc_regs.ioc_usage_reg, usecnt); | ||
1007 | bfa_trc(ioc, usecnt); | ||
1008 | |||
1009 | bfa_ioc_usage_sem_release(ioc); | ||
1010 | } | ||
1011 | |||
1012 | /** | ||
1013 | * Conditionally flush any pending message from firmware at start. | 933 | * Conditionally flush any pending message from firmware at start. |
1014 | */ | 934 | */ |
1015 | static void | 935 | static void |
@@ -1152,33 +1072,27 @@ bfa_ioc_send_getattr(struct bfa_ioc_s *ioc) | |||
1152 | static void | 1072 | static void |
1153 | bfa_ioc_hb_check(void *cbarg) | 1073 | bfa_ioc_hb_check(void *cbarg) |
1154 | { | 1074 | { |
1155 | struct bfa_ioc_s *ioc = cbarg; | 1075 | struct bfa_ioc_s *ioc = cbarg; |
1156 | u32 hb_count; | 1076 | u32 hb_count; |
1157 | 1077 | ||
1158 | hb_count = bfa_reg_read(ioc->ioc_regs.heartbeat); | 1078 | hb_count = bfa_reg_read(ioc->ioc_regs.heartbeat); |
1159 | if (ioc->hb_count == hb_count) { | 1079 | if (ioc->hb_count == hb_count) { |
1160 | ioc->hb_fail++; | 1080 | bfa_log(ioc->logm, BFA_LOG_HAL_HEARTBEAT_FAILURE, |
1161 | } else { | 1081 | hb_count); |
1162 | ioc->hb_count = hb_count; | ||
1163 | ioc->hb_fail = 0; | ||
1164 | } | ||
1165 | |||
1166 | if (ioc->hb_fail >= BFA_IOC_HB_FAIL_MAX) { | ||
1167 | bfa_log(ioc->logm, BFA_LOG_HAL_HEARTBEAT_FAILURE, hb_count); | ||
1168 | ioc->hb_fail = 0; | ||
1169 | bfa_ioc_recover(ioc); | 1082 | bfa_ioc_recover(ioc); |
1170 | return; | 1083 | return; |
1084 | } else { | ||
1085 | ioc->hb_count = hb_count; | ||
1171 | } | 1086 | } |
1172 | 1087 | ||
1173 | bfa_ioc_mbox_poll(ioc); | 1088 | bfa_ioc_mbox_poll(ioc); |
1174 | bfa_timer_begin(ioc->timer_mod, &ioc->ioc_timer, bfa_ioc_hb_check, ioc, | 1089 | bfa_timer_begin(ioc->timer_mod, &ioc->ioc_timer, bfa_ioc_hb_check, |
1175 | BFA_IOC_HB_TOV); | 1090 | ioc, BFA_IOC_HB_TOV); |
1176 | } | 1091 | } |
1177 | 1092 | ||
1178 | static void | 1093 | static void |
1179 | bfa_ioc_hb_monitor(struct bfa_ioc_s *ioc) | 1094 | bfa_ioc_hb_monitor(struct bfa_ioc_s *ioc) |
1180 | { | 1095 | { |
1181 | ioc->hb_fail = 0; | ||
1182 | ioc->hb_count = bfa_reg_read(ioc->ioc_regs.heartbeat); | 1096 | ioc->hb_count = bfa_reg_read(ioc->ioc_regs.heartbeat); |
1183 | bfa_timer_begin(ioc->timer_mod, &ioc->ioc_timer, bfa_ioc_hb_check, ioc, | 1097 | bfa_timer_begin(ioc->timer_mod, &ioc->ioc_timer, bfa_ioc_hb_check, ioc, |
1184 | BFA_IOC_HB_TOV); | 1098 | BFA_IOC_HB_TOV); |
@@ -1191,112 +1105,6 @@ bfa_ioc_hb_stop(struct bfa_ioc_s *ioc) | |||
1191 | } | 1105 | } |
1192 | 1106 | ||
1193 | /** | 1107 | /** |
1194 | * Host to LPU mailbox message addresses | ||
1195 | */ | ||
1196 | static struct { | ||
1197 | u32 hfn_mbox, lpu_mbox, hfn_pgn; | ||
1198 | } iocreg_fnreg[] = { | ||
1199 | { | ||
1200 | HOSTFN0_LPU_MBOX0_0, LPU_HOSTFN0_MBOX0_0, HOST_PAGE_NUM_FN0}, { | ||
1201 | HOSTFN1_LPU_MBOX0_8, LPU_HOSTFN1_MBOX0_8, HOST_PAGE_NUM_FN1}, { | ||
1202 | HOSTFN2_LPU_MBOX0_0, LPU_HOSTFN2_MBOX0_0, HOST_PAGE_NUM_FN2}, { | ||
1203 | HOSTFN3_LPU_MBOX0_8, LPU_HOSTFN3_MBOX0_8, HOST_PAGE_NUM_FN3} | ||
1204 | }; | ||
1205 | |||
1206 | /** | ||
1207 | * Host <-> LPU mailbox command/status registers - port 0 | ||
1208 | */ | ||
1209 | static struct { | ||
1210 | u32 hfn, lpu; | ||
1211 | } iocreg_mbcmd_p0[] = { | ||
1212 | { | ||
1213 | HOSTFN0_LPU0_MBOX0_CMD_STAT, LPU0_HOSTFN0_MBOX0_CMD_STAT}, { | ||
1214 | HOSTFN1_LPU0_MBOX0_CMD_STAT, LPU0_HOSTFN1_MBOX0_CMD_STAT}, { | ||
1215 | HOSTFN2_LPU0_MBOX0_CMD_STAT, LPU0_HOSTFN2_MBOX0_CMD_STAT}, { | ||
1216 | HOSTFN3_LPU0_MBOX0_CMD_STAT, LPU0_HOSTFN3_MBOX0_CMD_STAT} | ||
1217 | }; | ||
1218 | |||
1219 | /** | ||
1220 | * Host <-> LPU mailbox command/status registers - port 1 | ||
1221 | */ | ||
1222 | static struct { | ||
1223 | u32 hfn, lpu; | ||
1224 | } iocreg_mbcmd_p1[] = { | ||
1225 | { | ||
1226 | HOSTFN0_LPU1_MBOX0_CMD_STAT, LPU1_HOSTFN0_MBOX0_CMD_STAT}, { | ||
1227 | HOSTFN1_LPU1_MBOX0_CMD_STAT, LPU1_HOSTFN1_MBOX0_CMD_STAT}, { | ||
1228 | HOSTFN2_LPU1_MBOX0_CMD_STAT, LPU1_HOSTFN2_MBOX0_CMD_STAT}, { | ||
1229 | HOSTFN3_LPU1_MBOX0_CMD_STAT, LPU1_HOSTFN3_MBOX0_CMD_STAT} | ||
1230 | }; | ||
1231 | |||
1232 | /** | ||
1233 | * Shared IRQ handling in INTX mode | ||
1234 | */ | ||
1235 | static struct { | ||
1236 | u32 isr, msk; | ||
1237 | } iocreg_shirq_next[] = { | ||
1238 | { | ||
1239 | HOSTFN1_INT_STATUS, HOSTFN1_INT_MSK}, { | ||
1240 | HOSTFN2_INT_STATUS, HOSTFN2_INT_MSK}, { | ||
1241 | HOSTFN3_INT_STATUS, HOSTFN3_INT_MSK}, { | ||
1242 | HOSTFN0_INT_STATUS, HOSTFN0_INT_MSK},}; | ||
1243 | |||
1244 | static void | ||
1245 | bfa_ioc_reg_init(struct bfa_ioc_s *ioc) | ||
1246 | { | ||
1247 | bfa_os_addr_t rb; | ||
1248 | int pcifn = bfa_ioc_pcifn(ioc); | ||
1249 | |||
1250 | rb = bfa_ioc_bar0(ioc); | ||
1251 | |||
1252 | ioc->ioc_regs.hfn_mbox = rb + iocreg_fnreg[pcifn].hfn_mbox; | ||
1253 | ioc->ioc_regs.lpu_mbox = rb + iocreg_fnreg[pcifn].lpu_mbox; | ||
1254 | ioc->ioc_regs.host_page_num_fn = rb + iocreg_fnreg[pcifn].hfn_pgn; | ||
1255 | |||
1256 | if (ioc->port_id == 0) { | ||
1257 | ioc->ioc_regs.heartbeat = rb + BFA_IOC0_HBEAT_REG; | ||
1258 | ioc->ioc_regs.ioc_fwstate = rb + BFA_IOC0_STATE_REG; | ||
1259 | ioc->ioc_regs.hfn_mbox_cmd = rb + iocreg_mbcmd_p0[pcifn].hfn; | ||
1260 | ioc->ioc_regs.lpu_mbox_cmd = rb + iocreg_mbcmd_p0[pcifn].lpu; | ||
1261 | ioc->ioc_regs.ll_halt = rb + FW_INIT_HALT_P0; | ||
1262 | } else { | ||
1263 | ioc->ioc_regs.heartbeat = (rb + BFA_IOC1_HBEAT_REG); | ||
1264 | ioc->ioc_regs.ioc_fwstate = (rb + BFA_IOC1_STATE_REG); | ||
1265 | ioc->ioc_regs.hfn_mbox_cmd = rb + iocreg_mbcmd_p1[pcifn].hfn; | ||
1266 | ioc->ioc_regs.lpu_mbox_cmd = rb + iocreg_mbcmd_p1[pcifn].lpu; | ||
1267 | ioc->ioc_regs.ll_halt = rb + FW_INIT_HALT_P1; | ||
1268 | } | ||
1269 | |||
1270 | /** | ||
1271 | * Shared IRQ handling in INTX mode | ||
1272 | */ | ||
1273 | ioc->ioc_regs.shirq_isr_next = rb + iocreg_shirq_next[pcifn].isr; | ||
1274 | ioc->ioc_regs.shirq_msk_next = rb + iocreg_shirq_next[pcifn].msk; | ||
1275 | |||
1276 | /* | ||
1277 | * PSS control registers | ||
1278 | */ | ||
1279 | ioc->ioc_regs.pss_ctl_reg = (rb + PSS_CTL_REG); | ||
1280 | ioc->ioc_regs.app_pll_fast_ctl_reg = (rb + APP_PLL_425_CTL_REG); | ||
1281 | ioc->ioc_regs.app_pll_slow_ctl_reg = (rb + APP_PLL_312_CTL_REG); | ||
1282 | |||
1283 | /* | ||
1284 | * IOC semaphore registers and serialization | ||
1285 | */ | ||
1286 | ioc->ioc_regs.ioc_sem_reg = (rb + HOST_SEM0_REG); | ||
1287 | ioc->ioc_regs.ioc_usage_sem_reg = (rb + HOST_SEM1_REG); | ||
1288 | ioc->ioc_regs.ioc_usage_reg = (rb + BFA_FW_USE_COUNT); | ||
1289 | |||
1290 | /** | ||
1291 | * sram memory access | ||
1292 | */ | ||
1293 | ioc->ioc_regs.smem_page_start = (rb + PSS_SMEM_PAGE_START); | ||
1294 | ioc->ioc_regs.smem_pg0 = BFI_IOC_SMEM_PG0_CB; | ||
1295 | if (ioc->pcidev.device_id == BFA_PCI_DEVICE_ID_CT) | ||
1296 | ioc->ioc_regs.smem_pg0 = BFI_IOC_SMEM_PG0_CT; | ||
1297 | } | ||
1298 | |||
1299 | /** | ||
1300 | * Initiate a full firmware download. | 1108 | * Initiate a full firmware download. |
1301 | */ | 1109 | */ |
1302 | static void | 1110 | static void |
@@ -1321,9 +1129,6 @@ bfa_ioc_download_fw(struct bfa_ioc_s *ioc, u32 boot_type, | |||
1321 | if (bfa_ioc_fwimg_get_size(ioc) < BFA_IOC_FWIMG_MINSZ) | 1129 | if (bfa_ioc_fwimg_get_size(ioc) < BFA_IOC_FWIMG_MINSZ) |
1322 | boot_type = BFI_BOOT_TYPE_FLASH; | 1130 | boot_type = BFI_BOOT_TYPE_FLASH; |
1323 | fwimg = bfa_ioc_fwimg_get_chunk(ioc, chunkno); | 1131 | fwimg = bfa_ioc_fwimg_get_chunk(ioc, chunkno); |
1324 | fwimg[BFI_BOOT_TYPE_OFF / sizeof(u32)] = bfa_os_swap32(boot_type); | ||
1325 | fwimg[BFI_BOOT_PARAM_OFF / sizeof(u32)] = | ||
1326 | bfa_os_swap32(boot_param); | ||
1327 | 1132 | ||
1328 | pgnum = bfa_ioc_smem_pgnum(ioc, loff); | 1133 | pgnum = bfa_ioc_smem_pgnum(ioc, loff); |
1329 | pgoff = bfa_ioc_smem_pgoff(ioc, loff); | 1134 | pgoff = bfa_ioc_smem_pgoff(ioc, loff); |
@@ -1332,17 +1137,17 @@ bfa_ioc_download_fw(struct bfa_ioc_s *ioc, u32 boot_type, | |||
1332 | 1137 | ||
1333 | for (i = 0; i < bfa_ioc_fwimg_get_size(ioc); i++) { | 1138 | for (i = 0; i < bfa_ioc_fwimg_get_size(ioc); i++) { |
1334 | 1139 | ||
1335 | if (BFA_FLASH_CHUNK_NO(i) != chunkno) { | 1140 | if (BFA_IOC_FLASH_CHUNK_NO(i) != chunkno) { |
1336 | chunkno = BFA_FLASH_CHUNK_NO(i); | 1141 | chunkno = BFA_IOC_FLASH_CHUNK_NO(i); |
1337 | fwimg = bfa_ioc_fwimg_get_chunk(ioc, | 1142 | fwimg = bfa_ioc_fwimg_get_chunk(ioc, |
1338 | BFA_FLASH_CHUNK_ADDR(chunkno)); | 1143 | BFA_IOC_FLASH_CHUNK_ADDR(chunkno)); |
1339 | } | 1144 | } |
1340 | 1145 | ||
1341 | /** | 1146 | /** |
1342 | * write smem | 1147 | * write smem |
1343 | */ | 1148 | */ |
1344 | bfa_mem_write(ioc->ioc_regs.smem_page_start, loff, | 1149 | bfa_mem_write(ioc->ioc_regs.smem_page_start, loff, |
1345 | fwimg[BFA_FLASH_OFFSET_IN_CHUNK(i)]); | 1150 | fwimg[BFA_IOC_FLASH_OFFSET_IN_CHUNK(i)]); |
1346 | 1151 | ||
1347 | loff += sizeof(u32); | 1152 | loff += sizeof(u32); |
1348 | 1153 | ||
@@ -1358,6 +1163,14 @@ bfa_ioc_download_fw(struct bfa_ioc_s *ioc, u32 boot_type, | |||
1358 | 1163 | ||
1359 | bfa_reg_write(ioc->ioc_regs.host_page_num_fn, | 1164 | bfa_reg_write(ioc->ioc_regs.host_page_num_fn, |
1360 | bfa_ioc_smem_pgnum(ioc, 0)); | 1165 | bfa_ioc_smem_pgnum(ioc, 0)); |
1166 | |||
1167 | /* | ||
1168 | * Set boot type and boot param at the end. | ||
1169 | */ | ||
1170 | bfa_mem_write(ioc->ioc_regs.smem_page_start, BFI_BOOT_TYPE_OFF, | ||
1171 | bfa_os_swap32(boot_type)); | ||
1172 | bfa_mem_write(ioc->ioc_regs.smem_page_start, BFI_BOOT_PARAM_OFF, | ||
1173 | bfa_os_swap32(boot_param)); | ||
1361 | } | 1174 | } |
1362 | 1175 | ||
1363 | static void | 1176 | static void |
@@ -1440,168 +1253,10 @@ bfa_ioc_mbox_hbfail(struct bfa_ioc_s *ioc) | |||
1440 | } | 1253 | } |
1441 | 1254 | ||
1442 | /** | 1255 | /** |
1443 | * Initialize IOC to port mapping. | ||
1444 | */ | ||
1445 | |||
1446 | #define FNC_PERS_FN_SHIFT(__fn) ((__fn) * 8) | ||
1447 | static void | ||
1448 | bfa_ioc_map_port(struct bfa_ioc_s *ioc) | ||
1449 | { | ||
1450 | bfa_os_addr_t rb = ioc->pcidev.pci_bar_kva; | ||
1451 | u32 r32; | ||
1452 | |||
1453 | /** | ||
1454 | * For crossbow, port id is same as pci function. | ||
1455 | */ | ||
1456 | if (ioc->pcidev.device_id != BFA_PCI_DEVICE_ID_CT) { | ||
1457 | ioc->port_id = bfa_ioc_pcifn(ioc); | ||
1458 | return; | ||
1459 | } | ||
1460 | |||
1461 | /** | ||
1462 | * For catapult, base port id on personality register and IOC type | ||
1463 | */ | ||
1464 | r32 = bfa_reg_read(rb + FNC_PERS_REG); | ||
1465 | r32 >>= FNC_PERS_FN_SHIFT(bfa_ioc_pcifn(ioc)); | ||
1466 | ioc->port_id = (r32 & __F0_PORT_MAP_MK) >> __F0_PORT_MAP_SH; | ||
1467 | |||
1468 | bfa_trc(ioc, bfa_ioc_pcifn(ioc)); | ||
1469 | bfa_trc(ioc, ioc->port_id); | ||
1470 | } | ||
1471 | |||
1472 | |||
1473 | |||
1474 | /** | ||
1475 | * bfa_ioc_public | 1256 | * bfa_ioc_public |
1476 | */ | 1257 | */ |
1477 | 1258 | ||
1478 | /** | 1259 | /** |
1479 | * Set interrupt mode for a function: INTX or MSIX | ||
1480 | */ | ||
1481 | void | ||
1482 | bfa_ioc_isr_mode_set(struct bfa_ioc_s *ioc, bfa_boolean_t msix) | ||
1483 | { | ||
1484 | bfa_os_addr_t rb = ioc->pcidev.pci_bar_kva; | ||
1485 | u32 r32, mode; | ||
1486 | |||
1487 | r32 = bfa_reg_read(rb + FNC_PERS_REG); | ||
1488 | bfa_trc(ioc, r32); | ||
1489 | |||
1490 | mode = (r32 >> FNC_PERS_FN_SHIFT(bfa_ioc_pcifn(ioc))) & | ||
1491 | __F0_INTX_STATUS; | ||
1492 | |||
1493 | /** | ||
1494 | * If already in desired mode, do not change anything | ||
1495 | */ | ||
1496 | if (!msix && mode) | ||
1497 | return; | ||
1498 | |||
1499 | if (msix) | ||
1500 | mode = __F0_INTX_STATUS_MSIX; | ||
1501 | else | ||
1502 | mode = __F0_INTX_STATUS_INTA; | ||
1503 | |||
1504 | r32 &= ~(__F0_INTX_STATUS << FNC_PERS_FN_SHIFT(bfa_ioc_pcifn(ioc))); | ||
1505 | r32 |= (mode << FNC_PERS_FN_SHIFT(bfa_ioc_pcifn(ioc))); | ||
1506 | bfa_trc(ioc, r32); | ||
1507 | |||
1508 | bfa_reg_write(rb + FNC_PERS_REG, r32); | ||
1509 | } | ||
1510 | |||
1511 | bfa_status_t | ||
1512 | bfa_ioc_pll_init(struct bfa_ioc_s *ioc) | ||
1513 | { | ||
1514 | bfa_os_addr_t rb = ioc->pcidev.pci_bar_kva; | ||
1515 | u32 pll_sclk, pll_fclk, r32; | ||
1516 | |||
1517 | if (ioc->pcidev.device_id == BFA_PCI_DEVICE_ID_CT) { | ||
1518 | pll_sclk = | ||
1519 | __APP_PLL_312_ENABLE | __APP_PLL_312_LRESETN | | ||
1520 | __APP_PLL_312_RSEL200500 | __APP_PLL_312_P0_1(0U) | | ||
1521 | __APP_PLL_312_JITLMT0_1(3U) | | ||
1522 | __APP_PLL_312_CNTLMT0_1(1U); | ||
1523 | pll_fclk = | ||
1524 | __APP_PLL_425_ENABLE | __APP_PLL_425_LRESETN | | ||
1525 | __APP_PLL_425_RSEL200500 | __APP_PLL_425_P0_1(0U) | | ||
1526 | __APP_PLL_425_JITLMT0_1(3U) | | ||
1527 | __APP_PLL_425_CNTLMT0_1(1U); | ||
1528 | |||
1529 | /** | ||
1530 | * For catapult, choose operational mode FC/FCoE | ||
1531 | */ | ||
1532 | if (ioc->fcmode) { | ||
1533 | bfa_reg_write((rb + OP_MODE), 0); | ||
1534 | bfa_reg_write((rb + ETH_MAC_SER_REG), | ||
1535 | __APP_EMS_CMLCKSEL | __APP_EMS_REFCKBUFEN2 | ||
1536 | | __APP_EMS_CHANNEL_SEL); | ||
1537 | } else { | ||
1538 | ioc->pllinit = BFA_TRUE; | ||
1539 | bfa_reg_write((rb + OP_MODE), __GLOBAL_FCOE_MODE); | ||
1540 | bfa_reg_write((rb + ETH_MAC_SER_REG), | ||
1541 | __APP_EMS_REFCKBUFEN1); | ||
1542 | } | ||
1543 | } else { | ||
1544 | pll_sclk = | ||
1545 | __APP_PLL_312_ENABLE | __APP_PLL_312_LRESETN | | ||
1546 | __APP_PLL_312_P0_1(3U) | __APP_PLL_312_JITLMT0_1(3U) | | ||
1547 | __APP_PLL_312_CNTLMT0_1(3U); | ||
1548 | pll_fclk = | ||
1549 | __APP_PLL_425_ENABLE | __APP_PLL_425_LRESETN | | ||
1550 | __APP_PLL_425_RSEL200500 | __APP_PLL_425_P0_1(3U) | | ||
1551 | __APP_PLL_425_JITLMT0_1(3U) | | ||
1552 | __APP_PLL_425_CNTLMT0_1(3U); | ||
1553 | } | ||
1554 | |||
1555 | bfa_reg_write((rb + BFA_IOC0_STATE_REG), BFI_IOC_UNINIT); | ||
1556 | bfa_reg_write((rb + BFA_IOC1_STATE_REG), BFI_IOC_UNINIT); | ||
1557 | |||
1558 | bfa_reg_write((rb + HOSTFN0_INT_MSK), 0xffffffffU); | ||
1559 | bfa_reg_write((rb + HOSTFN1_INT_MSK), 0xffffffffU); | ||
1560 | bfa_reg_write((rb + HOSTFN0_INT_STATUS), 0xffffffffU); | ||
1561 | bfa_reg_write((rb + HOSTFN1_INT_STATUS), 0xffffffffU); | ||
1562 | bfa_reg_write((rb + HOSTFN0_INT_MSK), 0xffffffffU); | ||
1563 | bfa_reg_write((rb + HOSTFN1_INT_MSK), 0xffffffffU); | ||
1564 | |||
1565 | bfa_reg_write(ioc->ioc_regs.app_pll_slow_ctl_reg, | ||
1566 | __APP_PLL_312_LOGIC_SOFT_RESET); | ||
1567 | bfa_reg_write(ioc->ioc_regs.app_pll_slow_ctl_reg, | ||
1568 | __APP_PLL_312_BYPASS | __APP_PLL_312_LOGIC_SOFT_RESET); | ||
1569 | bfa_reg_write(ioc->ioc_regs.app_pll_fast_ctl_reg, | ||
1570 | __APP_PLL_425_LOGIC_SOFT_RESET); | ||
1571 | bfa_reg_write(ioc->ioc_regs.app_pll_fast_ctl_reg, | ||
1572 | __APP_PLL_425_BYPASS | __APP_PLL_425_LOGIC_SOFT_RESET); | ||
1573 | bfa_os_udelay(2); | ||
1574 | bfa_reg_write(ioc->ioc_regs.app_pll_slow_ctl_reg, | ||
1575 | __APP_PLL_312_LOGIC_SOFT_RESET); | ||
1576 | bfa_reg_write(ioc->ioc_regs.app_pll_fast_ctl_reg, | ||
1577 | __APP_PLL_425_LOGIC_SOFT_RESET); | ||
1578 | |||
1579 | bfa_reg_write(ioc->ioc_regs.app_pll_slow_ctl_reg, | ||
1580 | pll_sclk | __APP_PLL_312_LOGIC_SOFT_RESET); | ||
1581 | bfa_reg_write(ioc->ioc_regs.app_pll_fast_ctl_reg, | ||
1582 | pll_fclk | __APP_PLL_425_LOGIC_SOFT_RESET); | ||
1583 | |||
1584 | /** | ||
1585 | * Wait for PLLs to lock. | ||
1586 | */ | ||
1587 | bfa_os_udelay(2000); | ||
1588 | bfa_reg_write((rb + HOSTFN0_INT_STATUS), 0xffffffffU); | ||
1589 | bfa_reg_write((rb + HOSTFN1_INT_STATUS), 0xffffffffU); | ||
1590 | |||
1591 | bfa_reg_write(ioc->ioc_regs.app_pll_slow_ctl_reg, pll_sclk); | ||
1592 | bfa_reg_write(ioc->ioc_regs.app_pll_fast_ctl_reg, pll_fclk); | ||
1593 | |||
1594 | if (ioc->pcidev.device_id == BFA_PCI_DEVICE_ID_CT) { | ||
1595 | bfa_reg_write((rb + MBIST_CTL_REG), __EDRAM_BISTR_START); | ||
1596 | bfa_os_udelay(1000); | ||
1597 | r32 = bfa_reg_read((rb + MBIST_STAT_REG)); | ||
1598 | bfa_trc(ioc, r32); | ||
1599 | } | ||
1600 | |||
1601 | return BFA_STATUS_OK; | ||
1602 | } | ||
1603 | |||
1604 | /** | ||
1605 | * Interface used by diag module to do firmware boot with memory test | 1260 | * Interface used by diag module to do firmware boot with memory test |
1606 | * as the entry vector. | 1261 | * as the entry vector. |
1607 | */ | 1262 | */ |
@@ -1642,7 +1297,7 @@ bfa_ioc_boot(struct bfa_ioc_s *ioc, u32 boot_type, u32 boot_param) | |||
1642 | void | 1297 | void |
1643 | bfa_ioc_auto_recover(bfa_boolean_t auto_recover) | 1298 | bfa_ioc_auto_recover(bfa_boolean_t auto_recover) |
1644 | { | 1299 | { |
1645 | bfa_auto_recover = BFA_FALSE; | 1300 | bfa_auto_recover = auto_recover; |
1646 | } | 1301 | } |
1647 | 1302 | ||
1648 | 1303 | ||
@@ -1764,6 +1419,14 @@ bfa_ioc_pci_init(struct bfa_ioc_s *ioc, struct bfa_pcidev_s *pcidev, | |||
1764 | ioc->ctdev = (ioc->pcidev.device_id == BFA_PCI_DEVICE_ID_CT); | 1419 | ioc->ctdev = (ioc->pcidev.device_id == BFA_PCI_DEVICE_ID_CT); |
1765 | ioc->cna = ioc->ctdev && !ioc->fcmode; | 1420 | ioc->cna = ioc->ctdev && !ioc->fcmode; |
1766 | 1421 | ||
1422 | /** | ||
1423 | * Set asic specific interfaces. See bfa_ioc_cb.c and bfa_ioc_ct.c | ||
1424 | */ | ||
1425 | if (ioc->ctdev) | ||
1426 | bfa_ioc_set_ct_hwif(ioc); | ||
1427 | else | ||
1428 | bfa_ioc_set_cb_hwif(ioc); | ||
1429 | |||
1767 | bfa_ioc_map_port(ioc); | 1430 | bfa_ioc_map_port(ioc); |
1768 | bfa_ioc_reg_init(ioc); | 1431 | bfa_ioc_reg_init(ioc); |
1769 | } | 1432 | } |
@@ -1830,7 +1493,6 @@ return (auto_recover) ? BFA_DBG_FWTRC_LEN : 0; | |||
1830 | void | 1493 | void |
1831 | bfa_ioc_debug_memclaim(struct bfa_ioc_s *ioc, void *dbg_fwsave) | 1494 | bfa_ioc_debug_memclaim(struct bfa_ioc_s *ioc, void *dbg_fwsave) |
1832 | { | 1495 | { |
1833 | bfa_assert(ioc->auto_recover); | ||
1834 | ioc->dbg_fwsave = dbg_fwsave; | 1496 | ioc->dbg_fwsave = dbg_fwsave; |
1835 | ioc->dbg_fwsave_len = bfa_ioc_debug_trcsz(ioc->auto_recover); | 1497 | ioc->dbg_fwsave_len = bfa_ioc_debug_trcsz(ioc->auto_recover); |
1836 | } | 1498 | } |
@@ -1973,7 +1635,7 @@ bfa_ioc_fw_mismatch(struct bfa_ioc_s *ioc) | |||
1973 | ((__sm) == BFI_IOC_INITING) || \ | 1635 | ((__sm) == BFI_IOC_INITING) || \ |
1974 | ((__sm) == BFI_IOC_HWINIT) || \ | 1636 | ((__sm) == BFI_IOC_HWINIT) || \ |
1975 | ((__sm) == BFI_IOC_DISABLED) || \ | 1637 | ((__sm) == BFI_IOC_DISABLED) || \ |
1976 | ((__sm) == BFI_IOC_HBFAIL) || \ | 1638 | ((__sm) == BFI_IOC_FAIL) || \ |
1977 | ((__sm) == BFI_IOC_CFG_DISABLED)) | 1639 | ((__sm) == BFI_IOC_CFG_DISABLED)) |
1978 | 1640 | ||
1979 | /** | 1641 | /** |
@@ -2017,46 +1679,28 @@ bfa_ioc_get_adapter_attr(struct bfa_ioc_s *ioc, | |||
2017 | struct bfa_adapter_attr_s *ad_attr) | 1679 | struct bfa_adapter_attr_s *ad_attr) |
2018 | { | 1680 | { |
2019 | struct bfi_ioc_attr_s *ioc_attr; | 1681 | struct bfi_ioc_attr_s *ioc_attr; |
2020 | char model[BFA_ADAPTER_MODEL_NAME_LEN]; | ||
2021 | 1682 | ||
2022 | ioc_attr = ioc->attr; | 1683 | ioc_attr = ioc->attr; |
2023 | bfa_os_memcpy((void *)&ad_attr->serial_num, | 1684 | |
2024 | (void *)ioc_attr->brcd_serialnum, | 1685 | bfa_ioc_get_adapter_serial_num(ioc, ad_attr->serial_num); |
2025 | BFA_ADAPTER_SERIAL_NUM_LEN); | 1686 | bfa_ioc_get_adapter_fw_ver(ioc, ad_attr->fw_ver); |
2026 | 1687 | bfa_ioc_get_adapter_optrom_ver(ioc, ad_attr->optrom_ver); | |
2027 | bfa_os_memcpy(&ad_attr->fw_ver, ioc_attr->fw_version, BFA_VERSION_LEN); | 1688 | bfa_ioc_get_adapter_manufacturer(ioc, ad_attr->manufacturer); |
2028 | bfa_os_memcpy(&ad_attr->optrom_ver, ioc_attr->optrom_version, | ||
2029 | BFA_VERSION_LEN); | ||
2030 | bfa_os_memcpy(&ad_attr->manufacturer, BFA_MFG_NAME, | ||
2031 | BFA_ADAPTER_MFG_NAME_LEN); | ||
2032 | bfa_os_memcpy(&ad_attr->vpd, &ioc_attr->vpd, | 1689 | bfa_os_memcpy(&ad_attr->vpd, &ioc_attr->vpd, |
2033 | sizeof(struct bfa_mfg_vpd_s)); | 1690 | sizeof(struct bfa_mfg_vpd_s)); |
2034 | 1691 | ||
2035 | ad_attr->nports = BFI_ADAPTER_GETP(NPORTS, ioc_attr->adapter_prop); | 1692 | ad_attr->nports = bfa_ioc_get_nports(ioc); |
2036 | ad_attr->max_speed = BFI_ADAPTER_GETP(SPEED, ioc_attr->adapter_prop); | 1693 | ad_attr->max_speed = bfa_ioc_speed_sup(ioc); |
2037 | 1694 | ||
2038 | /** | 1695 | bfa_ioc_get_adapter_model(ioc, ad_attr->model); |
2039 | * model name | 1696 | /* For now, model descr uses same model string */ |
2040 | */ | 1697 | bfa_ioc_get_adapter_model(ioc, ad_attr->model_descr); |
2041 | if (BFI_ADAPTER_GETP(SPEED, ioc_attr->adapter_prop) == 10) { | ||
2042 | strcpy(model, "BR-10?0"); | ||
2043 | model[5] = '0' + ad_attr->nports; | ||
2044 | } else { | ||
2045 | strcpy(model, "Brocade-??5"); | ||
2046 | model[8] = | ||
2047 | '0' + BFI_ADAPTER_GETP(SPEED, ioc_attr->adapter_prop); | ||
2048 | model[9] = '0' + ad_attr->nports; | ||
2049 | } | ||
2050 | 1698 | ||
2051 | if (BFI_ADAPTER_IS_SPECIAL(ioc_attr->adapter_prop)) | 1699 | if (BFI_ADAPTER_IS_SPECIAL(ioc_attr->adapter_prop)) |
2052 | ad_attr->prototype = 1; | 1700 | ad_attr->prototype = 1; |
2053 | else | 1701 | else |
2054 | ad_attr->prototype = 0; | 1702 | ad_attr->prototype = 0; |
2055 | 1703 | ||
2056 | bfa_os_memcpy(&ad_attr->model, model, BFA_ADAPTER_MODEL_NAME_LEN); | ||
2057 | bfa_os_memcpy(&ad_attr->model_descr, &ad_attr->model, | ||
2058 | BFA_ADAPTER_MODEL_NAME_LEN); | ||
2059 | |||
2060 | ad_attr->pwwn = bfa_ioc_get_pwwn(ioc); | 1704 | ad_attr->pwwn = bfa_ioc_get_pwwn(ioc); |
2061 | ad_attr->mac = bfa_ioc_get_mac(ioc); | 1705 | ad_attr->mac = bfa_ioc_get_mac(ioc); |
2062 | 1706 | ||
@@ -2064,41 +1708,122 @@ bfa_ioc_get_adapter_attr(struct bfa_ioc_s *ioc, | |||
2064 | ad_attr->pcie_lanes = ioc_attr->pcie_lanes; | 1708 | ad_attr->pcie_lanes = ioc_attr->pcie_lanes; |
2065 | ad_attr->pcie_lanes_orig = ioc_attr->pcie_lanes_orig; | 1709 | ad_attr->pcie_lanes_orig = ioc_attr->pcie_lanes_orig; |
2066 | ad_attr->asic_rev = ioc_attr->asic_rev; | 1710 | ad_attr->asic_rev = ioc_attr->asic_rev; |
2067 | ad_attr->hw_ver[0] = 'R'; | 1711 | |
2068 | ad_attr->hw_ver[1] = 'e'; | 1712 | bfa_ioc_get_pci_chip_rev(ioc, ad_attr->hw_ver); |
2069 | ad_attr->hw_ver[2] = 'v'; | ||
2070 | ad_attr->hw_ver[3] = '-'; | ||
2071 | ad_attr->hw_ver[4] = ioc_attr->asic_rev; | ||
2072 | ad_attr->hw_ver[5] = '\0'; | ||
2073 | 1713 | ||
2074 | ad_attr->cna_capable = ioc->cna; | 1714 | ad_attr->cna_capable = ioc->cna; |
2075 | } | 1715 | } |
2076 | 1716 | ||
1717 | enum bfa_ioc_type_e | ||
1718 | bfa_ioc_get_type(struct bfa_ioc_s *ioc) | ||
1719 | { | ||
1720 | if (!ioc->ctdev || ioc->fcmode) | ||
1721 | return BFA_IOC_TYPE_FC; | ||
1722 | else if (ioc->ioc_mc == BFI_MC_IOCFC) | ||
1723 | return BFA_IOC_TYPE_FCoE; | ||
1724 | else if (ioc->ioc_mc == BFI_MC_LL) | ||
1725 | return BFA_IOC_TYPE_LL; | ||
1726 | else { | ||
1727 | bfa_assert(ioc->ioc_mc == BFI_MC_LL); | ||
1728 | return BFA_IOC_TYPE_LL; | ||
1729 | } | ||
1730 | } | ||
1731 | |||
1732 | void | ||
1733 | bfa_ioc_get_adapter_serial_num(struct bfa_ioc_s *ioc, char *serial_num) | ||
1734 | { | ||
1735 | bfa_os_memset((void *)serial_num, 0, BFA_ADAPTER_SERIAL_NUM_LEN); | ||
1736 | bfa_os_memcpy((void *)serial_num, | ||
1737 | (void *)ioc->attr->brcd_serialnum, | ||
1738 | BFA_ADAPTER_SERIAL_NUM_LEN); | ||
1739 | } | ||
1740 | |||
1741 | void | ||
1742 | bfa_ioc_get_adapter_fw_ver(struct bfa_ioc_s *ioc, char *fw_ver) | ||
1743 | { | ||
1744 | bfa_os_memset((void *)fw_ver, 0, BFA_VERSION_LEN); | ||
1745 | bfa_os_memcpy(fw_ver, ioc->attr->fw_version, BFA_VERSION_LEN); | ||
1746 | } | ||
1747 | |||
1748 | void | ||
1749 | bfa_ioc_get_pci_chip_rev(struct bfa_ioc_s *ioc, char *chip_rev) | ||
1750 | { | ||
1751 | bfa_assert(chip_rev); | ||
1752 | |||
1753 | bfa_os_memset((void *)chip_rev, 0, BFA_IOC_CHIP_REV_LEN); | ||
1754 | |||
1755 | chip_rev[0] = 'R'; | ||
1756 | chip_rev[1] = 'e'; | ||
1757 | chip_rev[2] = 'v'; | ||
1758 | chip_rev[3] = '-'; | ||
1759 | chip_rev[4] = ioc->attr->asic_rev; | ||
1760 | chip_rev[5] = '\0'; | ||
1761 | } | ||
1762 | |||
1763 | void | ||
1764 | bfa_ioc_get_adapter_optrom_ver(struct bfa_ioc_s *ioc, char *optrom_ver) | ||
1765 | { | ||
1766 | bfa_os_memset((void *)optrom_ver, 0, BFA_VERSION_LEN); | ||
1767 | bfa_os_memcpy(optrom_ver, ioc->attr->optrom_version, | ||
1768 | BFA_VERSION_LEN); | ||
1769 | } | ||
1770 | |||
1771 | void | ||
1772 | bfa_ioc_get_adapter_manufacturer(struct bfa_ioc_s *ioc, char *manufacturer) | ||
1773 | { | ||
1774 | bfa_os_memset((void *)manufacturer, 0, BFA_ADAPTER_MFG_NAME_LEN); | ||
1775 | bfa_os_memcpy(manufacturer, BFA_MFG_NAME, BFA_ADAPTER_MFG_NAME_LEN); | ||
1776 | } | ||
1777 | |||
1778 | void | ||
1779 | bfa_ioc_get_adapter_model(struct bfa_ioc_s *ioc, char *model) | ||
1780 | { | ||
1781 | struct bfi_ioc_attr_s *ioc_attr; | ||
1782 | u8 nports; | ||
1783 | u8 max_speed; | ||
1784 | |||
1785 | bfa_assert(model); | ||
1786 | bfa_os_memset((void *)model, 0, BFA_ADAPTER_MODEL_NAME_LEN); | ||
1787 | |||
1788 | ioc_attr = ioc->attr; | ||
1789 | |||
1790 | nports = bfa_ioc_get_nports(ioc); | ||
1791 | max_speed = bfa_ioc_speed_sup(ioc); | ||
1792 | |||
1793 | /** | ||
1794 | * model name | ||
1795 | */ | ||
1796 | if (max_speed == 10) { | ||
1797 | strcpy(model, "BR-10?0"); | ||
1798 | model[5] = '0' + nports; | ||
1799 | } else { | ||
1800 | strcpy(model, "Brocade-??5"); | ||
1801 | model[8] = '0' + max_speed; | ||
1802 | model[9] = '0' + nports; | ||
1803 | } | ||
1804 | } | ||
1805 | |||
1806 | enum bfa_ioc_state | ||
1807 | bfa_ioc_get_state(struct bfa_ioc_s *ioc) | ||
1808 | { | ||
1809 | return bfa_sm_to_state(ioc_sm_table, ioc->fsm); | ||
1810 | } | ||
1811 | |||
2077 | void | 1812 | void |
2078 | bfa_ioc_get_attr(struct bfa_ioc_s *ioc, struct bfa_ioc_attr_s *ioc_attr) | 1813 | bfa_ioc_get_attr(struct bfa_ioc_s *ioc, struct bfa_ioc_attr_s *ioc_attr) |
2079 | { | 1814 | { |
2080 | bfa_os_memset((void *)ioc_attr, 0, sizeof(struct bfa_ioc_attr_s)); | 1815 | bfa_os_memset((void *)ioc_attr, 0, sizeof(struct bfa_ioc_attr_s)); |
2081 | 1816 | ||
2082 | ioc_attr->state = bfa_sm_to_state(ioc_sm_table, ioc->fsm); | 1817 | ioc_attr->state = bfa_ioc_get_state(ioc); |
2083 | ioc_attr->port_id = ioc->port_id; | 1818 | ioc_attr->port_id = ioc->port_id; |
2084 | 1819 | ||
2085 | if (!ioc->ctdev) | 1820 | ioc_attr->ioc_type = bfa_ioc_get_type(ioc); |
2086 | ioc_attr->ioc_type = BFA_IOC_TYPE_FC; | ||
2087 | else if (ioc->ioc_mc == BFI_MC_IOCFC) | ||
2088 | ioc_attr->ioc_type = BFA_IOC_TYPE_FCoE; | ||
2089 | else if (ioc->ioc_mc == BFI_MC_LL) | ||
2090 | ioc_attr->ioc_type = BFA_IOC_TYPE_LL; | ||
2091 | 1821 | ||
2092 | bfa_ioc_get_adapter_attr(ioc, &ioc_attr->adapter_attr); | 1822 | bfa_ioc_get_adapter_attr(ioc, &ioc_attr->adapter_attr); |
2093 | 1823 | ||
2094 | ioc_attr->pci_attr.device_id = ioc->pcidev.device_id; | 1824 | ioc_attr->pci_attr.device_id = ioc->pcidev.device_id; |
2095 | ioc_attr->pci_attr.pcifn = ioc->pcidev.pci_func; | 1825 | ioc_attr->pci_attr.pcifn = ioc->pcidev.pci_func; |
2096 | ioc_attr->pci_attr.chip_rev[0] = 'R'; | 1826 | bfa_ioc_get_pci_chip_rev(ioc, ioc_attr->pci_attr.chip_rev); |
2097 | ioc_attr->pci_attr.chip_rev[1] = 'e'; | ||
2098 | ioc_attr->pci_attr.chip_rev[2] = 'v'; | ||
2099 | ioc_attr->pci_attr.chip_rev[3] = '-'; | ||
2100 | ioc_attr->pci_attr.chip_rev[4] = ioc_attr->adapter_attr.asic_rev; | ||
2101 | ioc_attr->pci_attr.chip_rev[5] = '\0'; | ||
2102 | } | 1827 | } |
2103 | 1828 | ||
2104 | /** | 1829 | /** |
@@ -2195,29 +1920,6 @@ bfa_ioc_get_fcmode(struct bfa_ioc_s *ioc) | |||
2195 | } | 1920 | } |
2196 | 1921 | ||
2197 | /** | 1922 | /** |
2198 | * Return true if interrupt should be claimed. | ||
2199 | */ | ||
2200 | bfa_boolean_t | ||
2201 | bfa_ioc_intx_claim(struct bfa_ioc_s *ioc) | ||
2202 | { | ||
2203 | u32 isr, msk; | ||
2204 | |||
2205 | /** | ||
2206 | * Always claim if not catapult. | ||
2207 | */ | ||
2208 | if (!ioc->ctdev) | ||
2209 | return BFA_TRUE; | ||
2210 | |||
2211 | /** | ||
2212 | * FALSE if next device is claiming interrupt. | ||
2213 | * TRUE if next device is not interrupting or not present. | ||
2214 | */ | ||
2215 | msk = bfa_reg_read(ioc->ioc_regs.shirq_msk_next); | ||
2216 | isr = bfa_reg_read(ioc->ioc_regs.shirq_isr_next); | ||
2217 | return !(isr & ~msk); | ||
2218 | } | ||
2219 | |||
2220 | /** | ||
2221 | * Send AEN notification | 1923 | * Send AEN notification |
2222 | */ | 1924 | */ |
2223 | static void | 1925 | static void |
@@ -2226,32 +1928,14 @@ bfa_ioc_aen_post(struct bfa_ioc_s *ioc, enum bfa_ioc_aen_event event) | |||
2226 | union bfa_aen_data_u aen_data; | 1928 | union bfa_aen_data_u aen_data; |
2227 | struct bfa_log_mod_s *logmod = ioc->logm; | 1929 | struct bfa_log_mod_s *logmod = ioc->logm; |
2228 | s32 inst_num = 0; | 1930 | s32 inst_num = 0; |
2229 | struct bfa_ioc_attr_s ioc_attr; | 1931 | enum bfa_ioc_type_e ioc_type; |
2230 | 1932 | ||
2231 | switch (event) { | 1933 | bfa_log(logmod, BFA_LOG_CREATE_ID(BFA_AEN_CAT_IOC, event), inst_num); |
2232 | case BFA_IOC_AEN_HBGOOD: | ||
2233 | bfa_log(logmod, BFA_AEN_IOC_HBGOOD, inst_num); | ||
2234 | break; | ||
2235 | case BFA_IOC_AEN_HBFAIL: | ||
2236 | bfa_log(logmod, BFA_AEN_IOC_HBFAIL, inst_num); | ||
2237 | break; | ||
2238 | case BFA_IOC_AEN_ENABLE: | ||
2239 | bfa_log(logmod, BFA_AEN_IOC_ENABLE, inst_num); | ||
2240 | break; | ||
2241 | case BFA_IOC_AEN_DISABLE: | ||
2242 | bfa_log(logmod, BFA_AEN_IOC_DISABLE, inst_num); | ||
2243 | break; | ||
2244 | case BFA_IOC_AEN_FWMISMATCH: | ||
2245 | bfa_log(logmod, BFA_AEN_IOC_FWMISMATCH, inst_num); | ||
2246 | break; | ||
2247 | default: | ||
2248 | break; | ||
2249 | } | ||
2250 | 1934 | ||
2251 | memset(&aen_data.ioc.pwwn, 0, sizeof(aen_data.ioc.pwwn)); | 1935 | memset(&aen_data.ioc.pwwn, 0, sizeof(aen_data.ioc.pwwn)); |
2252 | memset(&aen_data.ioc.mac, 0, sizeof(aen_data.ioc.mac)); | 1936 | memset(&aen_data.ioc.mac, 0, sizeof(aen_data.ioc.mac)); |
2253 | bfa_ioc_get_attr(ioc, &ioc_attr); | 1937 | ioc_type = bfa_ioc_get_type(ioc); |
2254 | switch (ioc_attr.ioc_type) { | 1938 | switch (ioc_type) { |
2255 | case BFA_IOC_TYPE_FC: | 1939 | case BFA_IOC_TYPE_FC: |
2256 | aen_data.ioc.pwwn = bfa_ioc_get_pwwn(ioc); | 1940 | aen_data.ioc.pwwn = bfa_ioc_get_pwwn(ioc); |
2257 | break; | 1941 | break; |
@@ -2263,10 +1947,10 @@ bfa_ioc_aen_post(struct bfa_ioc_s *ioc, enum bfa_ioc_aen_event event) | |||
2263 | aen_data.ioc.mac = bfa_ioc_get_mac(ioc); | 1947 | aen_data.ioc.mac = bfa_ioc_get_mac(ioc); |
2264 | break; | 1948 | break; |
2265 | default: | 1949 | default: |
2266 | bfa_assert(ioc_attr.ioc_type == BFA_IOC_TYPE_FC); | 1950 | bfa_assert(ioc_type == BFA_IOC_TYPE_FC); |
2267 | break; | 1951 | break; |
2268 | } | 1952 | } |
2269 | aen_data.ioc.ioc_type = ioc_attr.ioc_type; | 1953 | aen_data.ioc.ioc_type = ioc_type; |
2270 | } | 1954 | } |
2271 | 1955 | ||
2272 | /** | 1956 | /** |
@@ -2290,6 +1974,15 @@ bfa_ioc_debug_fwsave(struct bfa_ioc_s *ioc, void *trcdata, int *trclen) | |||
2290 | } | 1974 | } |
2291 | 1975 | ||
2292 | /** | 1976 | /** |
1977 | * Clear saved firmware trace | ||
1978 | */ | ||
1979 | void | ||
1980 | bfa_ioc_debug_fwsave_clear(struct bfa_ioc_s *ioc) | ||
1981 | { | ||
1982 | ioc->dbg_fwsave_once = BFA_TRUE; | ||
1983 | } | ||
1984 | |||
1985 | /** | ||
2293 | * Retrieve saved firmware trace from a prior IOC failure. | 1986 | * Retrieve saved firmware trace from a prior IOC failure. |
2294 | */ | 1987 | */ |
2295 | bfa_status_t | 1988 | bfa_status_t |
@@ -2304,6 +1997,13 @@ bfa_ioc_debug_fwtrc(struct bfa_ioc_s *ioc, void *trcdata, int *trclen) | |||
2304 | 1997 | ||
2305 | pgnum = bfa_ioc_smem_pgnum(ioc, loff); | 1998 | pgnum = bfa_ioc_smem_pgnum(ioc, loff); |
2306 | loff = bfa_ioc_smem_pgoff(ioc, loff); | 1999 | loff = bfa_ioc_smem_pgoff(ioc, loff); |
2000 | |||
2001 | /* | ||
2002 | * Hold semaphore to serialize pll init and fwtrc. | ||
2003 | */ | ||
2004 | if (BFA_FALSE == bfa_ioc_sem_get(ioc->ioc_regs.ioc_init_sem_reg)) | ||
2005 | return BFA_STATUS_FAILED; | ||
2006 | |||
2307 | bfa_reg_write(ioc->ioc_regs.host_page_num_fn, pgnum); | 2007 | bfa_reg_write(ioc->ioc_regs.host_page_num_fn, pgnum); |
2308 | 2008 | ||
2309 | tlen = *trclen; | 2009 | tlen = *trclen; |
@@ -2329,6 +2029,12 @@ bfa_ioc_debug_fwtrc(struct bfa_ioc_s *ioc, void *trcdata, int *trclen) | |||
2329 | } | 2029 | } |
2330 | bfa_reg_write(ioc->ioc_regs.host_page_num_fn, | 2030 | bfa_reg_write(ioc->ioc_regs.host_page_num_fn, |
2331 | bfa_ioc_smem_pgnum(ioc, 0)); | 2031 | bfa_ioc_smem_pgnum(ioc, 0)); |
2032 | |||
2033 | /* | ||
2034 | * release semaphore. | ||
2035 | */ | ||
2036 | bfa_ioc_sem_release(ioc->ioc_regs.ioc_init_sem_reg); | ||
2037 | |||
2332 | bfa_trc(ioc, pgnum); | 2038 | bfa_trc(ioc, pgnum); |
2333 | 2039 | ||
2334 | *trclen = tlen * sizeof(u32); | 2040 | *trclen = tlen * sizeof(u32); |
diff --git a/drivers/scsi/bfa/bfa_ioc.h b/drivers/scsi/bfa/bfa_ioc.h index 7c30f05ab137..d0804406ea1a 100644 --- a/drivers/scsi/bfa/bfa_ioc.h +++ b/drivers/scsi/bfa/bfa_ioc.h | |||
@@ -74,15 +74,18 @@ struct bfa_ioc_regs_s { | |||
74 | bfa_os_addr_t lpu_mbox_cmd; | 74 | bfa_os_addr_t lpu_mbox_cmd; |
75 | bfa_os_addr_t lpu_mbox; | 75 | bfa_os_addr_t lpu_mbox; |
76 | bfa_os_addr_t pss_ctl_reg; | 76 | bfa_os_addr_t pss_ctl_reg; |
77 | bfa_os_addr_t pss_err_status_reg; | ||
77 | bfa_os_addr_t app_pll_fast_ctl_reg; | 78 | bfa_os_addr_t app_pll_fast_ctl_reg; |
78 | bfa_os_addr_t app_pll_slow_ctl_reg; | 79 | bfa_os_addr_t app_pll_slow_ctl_reg; |
79 | bfa_os_addr_t ioc_sem_reg; | 80 | bfa_os_addr_t ioc_sem_reg; |
80 | bfa_os_addr_t ioc_usage_sem_reg; | 81 | bfa_os_addr_t ioc_usage_sem_reg; |
82 | bfa_os_addr_t ioc_init_sem_reg; | ||
81 | bfa_os_addr_t ioc_usage_reg; | 83 | bfa_os_addr_t ioc_usage_reg; |
82 | bfa_os_addr_t host_page_num_fn; | 84 | bfa_os_addr_t host_page_num_fn; |
83 | bfa_os_addr_t heartbeat; | 85 | bfa_os_addr_t heartbeat; |
84 | bfa_os_addr_t ioc_fwstate; | 86 | bfa_os_addr_t ioc_fwstate; |
85 | bfa_os_addr_t ll_halt; | 87 | bfa_os_addr_t ll_halt; |
88 | bfa_os_addr_t err_set; | ||
86 | bfa_os_addr_t shirq_isr_next; | 89 | bfa_os_addr_t shirq_isr_next; |
87 | bfa_os_addr_t shirq_msk_next; | 90 | bfa_os_addr_t shirq_msk_next; |
88 | bfa_os_addr_t smem_page_start; | 91 | bfa_os_addr_t smem_page_start; |
@@ -154,7 +157,6 @@ struct bfa_ioc_s { | |||
154 | struct bfa_timer_s ioc_timer; | 157 | struct bfa_timer_s ioc_timer; |
155 | struct bfa_timer_s sem_timer; | 158 | struct bfa_timer_s sem_timer; |
156 | u32 hb_count; | 159 | u32 hb_count; |
157 | u32 hb_fail; | ||
158 | u32 retry_count; | 160 | u32 retry_count; |
159 | struct list_head hb_notify_q; | 161 | struct list_head hb_notify_q; |
160 | void *dbg_fwsave; | 162 | void *dbg_fwsave; |
@@ -177,6 +179,22 @@ struct bfa_ioc_s { | |||
177 | struct bfi_ioc_attr_s *attr; | 179 | struct bfi_ioc_attr_s *attr; |
178 | struct bfa_ioc_cbfn_s *cbfn; | 180 | struct bfa_ioc_cbfn_s *cbfn; |
179 | struct bfa_ioc_mbox_mod_s mbox_mod; | 181 | struct bfa_ioc_mbox_mod_s mbox_mod; |
182 | struct bfa_ioc_hwif_s *ioc_hwif; | ||
183 | }; | ||
184 | |||
185 | struct bfa_ioc_hwif_s { | ||
186 | bfa_status_t (*ioc_pll_init) (struct bfa_ioc_s *ioc); | ||
187 | bfa_boolean_t (*ioc_firmware_lock) (struct bfa_ioc_s *ioc); | ||
188 | void (*ioc_firmware_unlock) (struct bfa_ioc_s *ioc); | ||
189 | u32 * (*ioc_fwimg_get_chunk) (struct bfa_ioc_s *ioc, | ||
190 | u32 off); | ||
191 | u32 (*ioc_fwimg_get_size) (struct bfa_ioc_s *ioc); | ||
192 | void (*ioc_reg_init) (struct bfa_ioc_s *ioc); | ||
193 | void (*ioc_map_port) (struct bfa_ioc_s *ioc); | ||
194 | void (*ioc_isr_mode_set) (struct bfa_ioc_s *ioc, | ||
195 | bfa_boolean_t msix); | ||
196 | void (*ioc_notify_hbfail) (struct bfa_ioc_s *ioc); | ||
197 | void (*ioc_ownership_reset) (struct bfa_ioc_s *ioc); | ||
180 | }; | 198 | }; |
181 | 199 | ||
182 | #define bfa_ioc_pcifn(__ioc) ((__ioc)->pcidev.pci_func) | 200 | #define bfa_ioc_pcifn(__ioc) ((__ioc)->pcidev.pci_func) |
@@ -191,6 +209,15 @@ struct bfa_ioc_s { | |||
191 | #define bfa_ioc_rx_bbcredit(__ioc) ((__ioc)->attr->rx_bbcredit) | 209 | #define bfa_ioc_rx_bbcredit(__ioc) ((__ioc)->attr->rx_bbcredit) |
192 | #define bfa_ioc_speed_sup(__ioc) \ | 210 | #define bfa_ioc_speed_sup(__ioc) \ |
193 | BFI_ADAPTER_GETP(SPEED, (__ioc)->attr->adapter_prop) | 211 | BFI_ADAPTER_GETP(SPEED, (__ioc)->attr->adapter_prop) |
212 | #define bfa_ioc_get_nports(__ioc) \ | ||
213 | BFI_ADAPTER_GETP(NPORTS, (__ioc)->attr->adapter_prop) | ||
214 | |||
215 | #define bfa_ioc_stats(_ioc, _stats) ((_ioc)->stats._stats++) | ||
216 | #define BFA_IOC_FWIMG_MINSZ (16 * 1024) | ||
217 | |||
218 | #define BFA_IOC_FLASH_CHUNK_NO(off) (off / BFI_FLASH_CHUNK_SZ_WORDS) | ||
219 | #define BFA_IOC_FLASH_OFFSET_IN_CHUNK(off) (off % BFI_FLASH_CHUNK_SZ_WORDS) | ||
220 | #define BFA_IOC_FLASH_CHUNK_ADDR(chunkno) (chunkno * BFI_FLASH_CHUNK_SZ_WORDS) | ||
194 | 221 | ||
195 | /** | 222 | /** |
196 | * IOC mailbox interface | 223 | * IOC mailbox interface |
@@ -207,6 +234,14 @@ void bfa_ioc_mbox_regisr(struct bfa_ioc_s *ioc, enum bfi_mclass mc, | |||
207 | /** | 234 | /** |
208 | * IOC interfaces | 235 | * IOC interfaces |
209 | */ | 236 | */ |
237 | #define bfa_ioc_pll_init(__ioc) ((__ioc)->ioc_hwif->ioc_pll_init(__ioc)) | ||
238 | #define bfa_ioc_isr_mode_set(__ioc, __msix) \ | ||
239 | ((__ioc)->ioc_hwif->ioc_isr_mode_set(__ioc, __msix)) | ||
240 | #define bfa_ioc_ownership_reset(__ioc) \ | ||
241 | ((__ioc)->ioc_hwif->ioc_ownership_reset(__ioc)) | ||
242 | |||
243 | void bfa_ioc_set_ct_hwif(struct bfa_ioc_s *ioc); | ||
244 | void bfa_ioc_set_cb_hwif(struct bfa_ioc_s *ioc); | ||
210 | void bfa_ioc_attach(struct bfa_ioc_s *ioc, void *bfa, | 245 | void bfa_ioc_attach(struct bfa_ioc_s *ioc, void *bfa, |
211 | struct bfa_ioc_cbfn_s *cbfn, struct bfa_timer_mod_s *timer_mod, | 246 | struct bfa_ioc_cbfn_s *cbfn, struct bfa_timer_mod_s *timer_mod, |
212 | struct bfa_trc_mod_s *trcmod, | 247 | struct bfa_trc_mod_s *trcmod, |
@@ -223,13 +258,21 @@ bfa_boolean_t bfa_ioc_intx_claim(struct bfa_ioc_s *ioc); | |||
223 | void bfa_ioc_boot(struct bfa_ioc_s *ioc, u32 boot_type, u32 boot_param); | 258 | void bfa_ioc_boot(struct bfa_ioc_s *ioc, u32 boot_type, u32 boot_param); |
224 | void bfa_ioc_isr(struct bfa_ioc_s *ioc, struct bfi_mbmsg_s *msg); | 259 | void bfa_ioc_isr(struct bfa_ioc_s *ioc, struct bfi_mbmsg_s *msg); |
225 | void bfa_ioc_error_isr(struct bfa_ioc_s *ioc); | 260 | void bfa_ioc_error_isr(struct bfa_ioc_s *ioc); |
226 | void bfa_ioc_isr_mode_set(struct bfa_ioc_s *ioc, bfa_boolean_t intx); | ||
227 | bfa_status_t bfa_ioc_pll_init(struct bfa_ioc_s *ioc); | ||
228 | bfa_boolean_t bfa_ioc_is_operational(struct bfa_ioc_s *ioc); | 261 | bfa_boolean_t bfa_ioc_is_operational(struct bfa_ioc_s *ioc); |
229 | bfa_boolean_t bfa_ioc_is_disabled(struct bfa_ioc_s *ioc); | 262 | bfa_boolean_t bfa_ioc_is_disabled(struct bfa_ioc_s *ioc); |
230 | bfa_boolean_t bfa_ioc_fw_mismatch(struct bfa_ioc_s *ioc); | 263 | bfa_boolean_t bfa_ioc_fw_mismatch(struct bfa_ioc_s *ioc); |
231 | bfa_boolean_t bfa_ioc_adapter_is_disabled(struct bfa_ioc_s *ioc); | 264 | bfa_boolean_t bfa_ioc_adapter_is_disabled(struct bfa_ioc_s *ioc); |
232 | void bfa_ioc_cfg_complete(struct bfa_ioc_s *ioc); | 265 | void bfa_ioc_cfg_complete(struct bfa_ioc_s *ioc); |
266 | enum bfa_ioc_type_e bfa_ioc_get_type(struct bfa_ioc_s *ioc); | ||
267 | void bfa_ioc_get_adapter_serial_num(struct bfa_ioc_s *ioc, char *serial_num); | ||
268 | void bfa_ioc_get_adapter_fw_ver(struct bfa_ioc_s *ioc, char *fw_ver); | ||
269 | void bfa_ioc_get_adapter_optrom_ver(struct bfa_ioc_s *ioc, char *optrom_ver); | ||
270 | void bfa_ioc_get_adapter_model(struct bfa_ioc_s *ioc, char *model); | ||
271 | void bfa_ioc_get_adapter_manufacturer(struct bfa_ioc_s *ioc, | ||
272 | char *manufacturer); | ||
273 | void bfa_ioc_get_pci_chip_rev(struct bfa_ioc_s *ioc, char *chip_rev); | ||
274 | enum bfa_ioc_state bfa_ioc_get_state(struct bfa_ioc_s *ioc); | ||
275 | |||
233 | void bfa_ioc_get_attr(struct bfa_ioc_s *ioc, struct bfa_ioc_attr_s *ioc_attr); | 276 | void bfa_ioc_get_attr(struct bfa_ioc_s *ioc, struct bfa_ioc_attr_s *ioc_attr); |
234 | void bfa_ioc_get_adapter_attr(struct bfa_ioc_s *ioc, | 277 | void bfa_ioc_get_adapter_attr(struct bfa_ioc_s *ioc, |
235 | struct bfa_adapter_attr_s *ad_attr); | 278 | struct bfa_adapter_attr_s *ad_attr); |
@@ -237,6 +280,7 @@ int bfa_ioc_debug_trcsz(bfa_boolean_t auto_recover); | |||
237 | void bfa_ioc_debug_memclaim(struct bfa_ioc_s *ioc, void *dbg_fwsave); | 280 | void bfa_ioc_debug_memclaim(struct bfa_ioc_s *ioc, void *dbg_fwsave); |
238 | bfa_status_t bfa_ioc_debug_fwsave(struct bfa_ioc_s *ioc, void *trcdata, | 281 | bfa_status_t bfa_ioc_debug_fwsave(struct bfa_ioc_s *ioc, void *trcdata, |
239 | int *trclen); | 282 | int *trclen); |
283 | void bfa_ioc_debug_fwsave_clear(struct bfa_ioc_s *ioc); | ||
240 | bfa_status_t bfa_ioc_debug_fwtrc(struct bfa_ioc_s *ioc, void *trcdata, | 284 | bfa_status_t bfa_ioc_debug_fwtrc(struct bfa_ioc_s *ioc, void *trcdata, |
241 | int *trclen); | 285 | int *trclen); |
242 | u32 bfa_ioc_smem_pgnum(struct bfa_ioc_s *ioc, u32 fmaddr); | 286 | u32 bfa_ioc_smem_pgnum(struct bfa_ioc_s *ioc, u32 fmaddr); |
@@ -245,6 +289,13 @@ void bfa_ioc_set_fcmode(struct bfa_ioc_s *ioc); | |||
245 | bfa_boolean_t bfa_ioc_get_fcmode(struct bfa_ioc_s *ioc); | 289 | bfa_boolean_t bfa_ioc_get_fcmode(struct bfa_ioc_s *ioc); |
246 | void bfa_ioc_hbfail_register(struct bfa_ioc_s *ioc, | 290 | void bfa_ioc_hbfail_register(struct bfa_ioc_s *ioc, |
247 | struct bfa_ioc_hbfail_notify_s *notify); | 291 | struct bfa_ioc_hbfail_notify_s *notify); |
292 | bfa_boolean_t bfa_ioc_sem_get(bfa_os_addr_t sem_reg); | ||
293 | void bfa_ioc_sem_release(bfa_os_addr_t sem_reg); | ||
294 | void bfa_ioc_hw_sem_release(struct bfa_ioc_s *ioc); | ||
295 | void bfa_ioc_fwver_get(struct bfa_ioc_s *ioc, | ||
296 | struct bfi_ioc_image_hdr_s *fwhdr); | ||
297 | bfa_boolean_t bfa_ioc_fwver_cmp(struct bfa_ioc_s *ioc, | ||
298 | struct bfi_ioc_image_hdr_s *fwhdr); | ||
248 | 299 | ||
249 | /* | 300 | /* |
250 | * bfa mfg wwn API functions | 301 | * bfa mfg wwn API functions |
diff --git a/drivers/scsi/bfa/bfa_ioc_cb.c b/drivers/scsi/bfa/bfa_ioc_cb.c new file mode 100644 index 000000000000..3ce85319f739 --- /dev/null +++ b/drivers/scsi/bfa/bfa_ioc_cb.c | |||
@@ -0,0 +1,274 @@ | |||
1 | /* | ||
2 | * Copyright (c) 2005-2009 Brocade Communications Systems, Inc. | ||
3 | * All rights reserved | ||
4 | * www.brocade.com | ||
5 | * | ||
6 | * Linux driver for Brocade Fibre Channel Host Bus Adapter. | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify it | ||
9 | * under the terms of the GNU General Public License (GPL) Version 2 as | ||
10 | * published by the Free Software Foundation | ||
11 | * | ||
12 | * This program is distributed in the hope that it will be useful, but | ||
13 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
15 | * General Public License for more details. | ||
16 | */ | ||
17 | |||
18 | #include <bfa.h> | ||
19 | #include <bfa_ioc.h> | ||
20 | #include <bfa_fwimg_priv.h> | ||
21 | #include <cna/bfa_cna_trcmod.h> | ||
22 | #include <cs/bfa_debug.h> | ||
23 | #include <bfi/bfi_ioc.h> | ||
24 | #include <bfi/bfi_cbreg.h> | ||
25 | #include <log/bfa_log_hal.h> | ||
26 | #include <defs/bfa_defs_pci.h> | ||
27 | |||
28 | BFA_TRC_FILE(CNA, IOC_CB); | ||
29 | |||
30 | /* | ||
31 | * forward declarations | ||
32 | */ | ||
33 | static bfa_status_t bfa_ioc_cb_pll_init(struct bfa_ioc_s *ioc); | ||
34 | static bfa_boolean_t bfa_ioc_cb_firmware_lock(struct bfa_ioc_s *ioc); | ||
35 | static void bfa_ioc_cb_firmware_unlock(struct bfa_ioc_s *ioc); | ||
36 | static u32 *bfa_ioc_cb_fwimg_get_chunk(struct bfa_ioc_s *ioc, u32 off); | ||
37 | static u32 bfa_ioc_cb_fwimg_get_size(struct bfa_ioc_s *ioc); | ||
38 | static void bfa_ioc_cb_reg_init(struct bfa_ioc_s *ioc); | ||
39 | static void bfa_ioc_cb_map_port(struct bfa_ioc_s *ioc); | ||
40 | static void bfa_ioc_cb_isr_mode_set(struct bfa_ioc_s *ioc, bfa_boolean_t msix); | ||
41 | static void bfa_ioc_cb_notify_hbfail(struct bfa_ioc_s *ioc); | ||
42 | static void bfa_ioc_cb_ownership_reset(struct bfa_ioc_s *ioc); | ||
43 | |||
44 | struct bfa_ioc_hwif_s hwif_cb = { | ||
45 | bfa_ioc_cb_pll_init, | ||
46 | bfa_ioc_cb_firmware_lock, | ||
47 | bfa_ioc_cb_firmware_unlock, | ||
48 | bfa_ioc_cb_fwimg_get_chunk, | ||
49 | bfa_ioc_cb_fwimg_get_size, | ||
50 | bfa_ioc_cb_reg_init, | ||
51 | bfa_ioc_cb_map_port, | ||
52 | bfa_ioc_cb_isr_mode_set, | ||
53 | bfa_ioc_cb_notify_hbfail, | ||
54 | bfa_ioc_cb_ownership_reset, | ||
55 | }; | ||
56 | |||
57 | /** | ||
58 | * Called from bfa_ioc_attach() to map asic specific calls. | ||
59 | */ | ||
60 | void | ||
61 | bfa_ioc_set_cb_hwif(struct bfa_ioc_s *ioc) | ||
62 | { | ||
63 | ioc->ioc_hwif = &hwif_cb; | ||
64 | } | ||
65 | |||
66 | static u32 * | ||
67 | bfa_ioc_cb_fwimg_get_chunk(struct bfa_ioc_s *ioc, u32 off) | ||
68 | { | ||
69 | return bfi_image_cb_get_chunk(off); | ||
70 | } | ||
71 | |||
72 | static u32 | ||
73 | bfa_ioc_cb_fwimg_get_size(struct bfa_ioc_s *ioc) | ||
74 | { | ||
75 | return bfi_image_cb_size; | ||
76 | } | ||
77 | |||
78 | /** | ||
79 | * Return true if firmware of current driver matches the running firmware. | ||
80 | */ | ||
81 | static bfa_boolean_t | ||
82 | bfa_ioc_cb_firmware_lock(struct bfa_ioc_s *ioc) | ||
83 | { | ||
84 | return BFA_TRUE; | ||
85 | } | ||
86 | |||
87 | static void | ||
88 | bfa_ioc_cb_firmware_unlock(struct bfa_ioc_s *ioc) | ||
89 | { | ||
90 | } | ||
91 | |||
92 | /** | ||
93 | * Notify other functions on HB failure. | ||
94 | */ | ||
95 | static void | ||
96 | bfa_ioc_cb_notify_hbfail(struct bfa_ioc_s *ioc) | ||
97 | { | ||
98 | bfa_reg_write(ioc->ioc_regs.err_set, __PSS_ERR_STATUS_SET); | ||
99 | bfa_reg_read(ioc->ioc_regs.err_set); | ||
100 | } | ||
101 | |||
102 | /** | ||
103 | * Host to LPU mailbox message addresses | ||
104 | */ | ||
105 | static struct { u32 hfn_mbox, lpu_mbox, hfn_pgn; } iocreg_fnreg[] = { | ||
106 | { HOSTFN0_LPU_MBOX0_0, LPU_HOSTFN0_MBOX0_0, HOST_PAGE_NUM_FN0 }, | ||
107 | { HOSTFN1_LPU_MBOX0_8, LPU_HOSTFN1_MBOX0_8, HOST_PAGE_NUM_FN1 } | ||
108 | }; | ||
109 | |||
110 | /** | ||
111 | * Host <-> LPU mailbox command/status registers | ||
112 | */ | ||
113 | static struct { u32 hfn, lpu; } iocreg_mbcmd[] = { | ||
114 | { HOSTFN0_LPU0_CMD_STAT, LPU0_HOSTFN0_CMD_STAT }, | ||
115 | { HOSTFN1_LPU1_CMD_STAT, LPU1_HOSTFN1_CMD_STAT } | ||
116 | }; | ||
117 | |||
118 | static void | ||
119 | bfa_ioc_cb_reg_init(struct bfa_ioc_s *ioc) | ||
120 | { | ||
121 | bfa_os_addr_t rb; | ||
122 | int pcifn = bfa_ioc_pcifn(ioc); | ||
123 | |||
124 | rb = bfa_ioc_bar0(ioc); | ||
125 | |||
126 | ioc->ioc_regs.hfn_mbox = rb + iocreg_fnreg[pcifn].hfn_mbox; | ||
127 | ioc->ioc_regs.lpu_mbox = rb + iocreg_fnreg[pcifn].lpu_mbox; | ||
128 | ioc->ioc_regs.host_page_num_fn = rb + iocreg_fnreg[pcifn].hfn_pgn; | ||
129 | |||
130 | if (ioc->port_id == 0) { | ||
131 | ioc->ioc_regs.heartbeat = rb + BFA_IOC0_HBEAT_REG; | ||
132 | ioc->ioc_regs.ioc_fwstate = rb + BFA_IOC0_STATE_REG; | ||
133 | } else { | ||
134 | ioc->ioc_regs.heartbeat = (rb + BFA_IOC1_HBEAT_REG); | ||
135 | ioc->ioc_regs.ioc_fwstate = (rb + BFA_IOC1_STATE_REG); | ||
136 | } | ||
137 | |||
138 | /** | ||
139 | * Host <-> LPU mailbox command/status registers | ||
140 | */ | ||
141 | ioc->ioc_regs.hfn_mbox_cmd = rb + iocreg_mbcmd[pcifn].hfn; | ||
142 | ioc->ioc_regs.lpu_mbox_cmd = rb + iocreg_mbcmd[pcifn].lpu; | ||
143 | |||
144 | /* | ||
145 | * PSS control registers | ||
146 | */ | ||
147 | ioc->ioc_regs.pss_ctl_reg = (rb + PSS_CTL_REG); | ||
148 | ioc->ioc_regs.pss_err_status_reg = (rb + PSS_ERR_STATUS_REG); | ||
149 | ioc->ioc_regs.app_pll_fast_ctl_reg = (rb + APP_PLL_400_CTL_REG); | ||
150 | ioc->ioc_regs.app_pll_slow_ctl_reg = (rb + APP_PLL_212_CTL_REG); | ||
151 | |||
152 | /* | ||
153 | * IOC semaphore registers and serialization | ||
154 | */ | ||
155 | ioc->ioc_regs.ioc_sem_reg = (rb + HOST_SEM0_REG); | ||
156 | ioc->ioc_regs.ioc_init_sem_reg = (rb + HOST_SEM2_REG); | ||
157 | |||
158 | /** | ||
159 | * sram memory access | ||
160 | */ | ||
161 | ioc->ioc_regs.smem_page_start = (rb + PSS_SMEM_PAGE_START); | ||
162 | ioc->ioc_regs.smem_pg0 = BFI_IOC_SMEM_PG0_CB; | ||
163 | |||
164 | /* | ||
165 | * err set reg : for notification of hb failure | ||
166 | */ | ||
167 | ioc->ioc_regs.err_set = (rb + ERR_SET_REG); | ||
168 | } | ||
169 | |||
170 | /** | ||
171 | * Initialize IOC to port mapping. | ||
172 | */ | ||
173 | static void | ||
174 | bfa_ioc_cb_map_port(struct bfa_ioc_s *ioc) | ||
175 | { | ||
176 | /** | ||
177 | * For crossbow, port id is same as pci function. | ||
178 | */ | ||
179 | ioc->port_id = bfa_ioc_pcifn(ioc); | ||
180 | bfa_trc(ioc, ioc->port_id); | ||
181 | } | ||
182 | |||
183 | /** | ||
184 | * Set interrupt mode for a function: INTX or MSIX | ||
185 | */ | ||
186 | static void | ||
187 | bfa_ioc_cb_isr_mode_set(struct bfa_ioc_s *ioc, bfa_boolean_t msix) | ||
188 | { | ||
189 | } | ||
190 | |||
191 | static bfa_status_t | ||
192 | bfa_ioc_cb_pll_init(struct bfa_ioc_s *ioc) | ||
193 | { | ||
194 | bfa_os_addr_t rb = ioc->pcidev.pci_bar_kva; | ||
195 | u32 pll_sclk, pll_fclk; | ||
196 | |||
197 | /* | ||
198 | * Hold semaphore so that nobody can access the chip during init. | ||
199 | */ | ||
200 | bfa_ioc_sem_get(ioc->ioc_regs.ioc_init_sem_reg); | ||
201 | |||
202 | pll_sclk = __APP_PLL_212_ENABLE | __APP_PLL_212_LRESETN | | ||
203 | __APP_PLL_212_P0_1(3U) | | ||
204 | __APP_PLL_212_JITLMT0_1(3U) | | ||
205 | __APP_PLL_212_CNTLMT0_1(3U); | ||
206 | pll_fclk = __APP_PLL_400_ENABLE | __APP_PLL_400_LRESETN | | ||
207 | __APP_PLL_400_RSEL200500 | __APP_PLL_400_P0_1(3U) | | ||
208 | __APP_PLL_400_JITLMT0_1(3U) | | ||
209 | __APP_PLL_400_CNTLMT0_1(3U); | ||
210 | |||
211 | bfa_reg_write((rb + BFA_IOC0_STATE_REG), BFI_IOC_UNINIT); | ||
212 | bfa_reg_write((rb + BFA_IOC1_STATE_REG), BFI_IOC_UNINIT); | ||
213 | |||
214 | bfa_reg_write((rb + HOSTFN0_INT_MSK), 0xffffffffU); | ||
215 | bfa_reg_write((rb + HOSTFN1_INT_MSK), 0xffffffffU); | ||
216 | bfa_reg_write((rb + HOSTFN0_INT_STATUS), 0xffffffffU); | ||
217 | bfa_reg_write((rb + HOSTFN1_INT_STATUS), 0xffffffffU); | ||
218 | bfa_reg_write((rb + HOSTFN0_INT_MSK), 0xffffffffU); | ||
219 | bfa_reg_write((rb + HOSTFN1_INT_MSK), 0xffffffffU); | ||
220 | |||
221 | bfa_reg_write(ioc->ioc_regs.app_pll_slow_ctl_reg, | ||
222 | __APP_PLL_212_LOGIC_SOFT_RESET); | ||
223 | bfa_reg_write(ioc->ioc_regs.app_pll_slow_ctl_reg, | ||
224 | __APP_PLL_212_BYPASS | | ||
225 | __APP_PLL_212_LOGIC_SOFT_RESET); | ||
226 | bfa_reg_write(ioc->ioc_regs.app_pll_fast_ctl_reg, | ||
227 | __APP_PLL_400_LOGIC_SOFT_RESET); | ||
228 | bfa_reg_write(ioc->ioc_regs.app_pll_fast_ctl_reg, | ||
229 | __APP_PLL_400_BYPASS | | ||
230 | __APP_PLL_400_LOGIC_SOFT_RESET); | ||
231 | bfa_os_udelay(2); | ||
232 | bfa_reg_write(ioc->ioc_regs.app_pll_slow_ctl_reg, | ||
233 | __APP_PLL_212_LOGIC_SOFT_RESET); | ||
234 | bfa_reg_write(ioc->ioc_regs.app_pll_fast_ctl_reg, | ||
235 | __APP_PLL_400_LOGIC_SOFT_RESET); | ||
236 | |||
237 | bfa_reg_write(ioc->ioc_regs.app_pll_slow_ctl_reg, | ||
238 | pll_sclk | __APP_PLL_212_LOGIC_SOFT_RESET); | ||
239 | bfa_reg_write(ioc->ioc_regs.app_pll_fast_ctl_reg, | ||
240 | pll_fclk | __APP_PLL_400_LOGIC_SOFT_RESET); | ||
241 | |||
242 | /** | ||
243 | * Wait for PLLs to lock. | ||
244 | */ | ||
245 | bfa_os_udelay(2000); | ||
246 | bfa_reg_write((rb + HOSTFN0_INT_STATUS), 0xffffffffU); | ||
247 | bfa_reg_write((rb + HOSTFN1_INT_STATUS), 0xffffffffU); | ||
248 | |||
249 | bfa_reg_write(ioc->ioc_regs.app_pll_slow_ctl_reg, pll_sclk); | ||
250 | bfa_reg_write(ioc->ioc_regs.app_pll_fast_ctl_reg, pll_fclk); | ||
251 | |||
252 | /* | ||
253 | * release semaphore. | ||
254 | */ | ||
255 | bfa_ioc_sem_release(ioc->ioc_regs.ioc_init_sem_reg); | ||
256 | |||
257 | return BFA_STATUS_OK; | ||
258 | } | ||
259 | |||
260 | /** | ||
261 | * Cleanup hw semaphore and usecnt registers | ||
262 | */ | ||
263 | static void | ||
264 | bfa_ioc_cb_ownership_reset(struct bfa_ioc_s *ioc) | ||
265 | { | ||
266 | |||
267 | /* | ||
268 | * Read the hw sem reg to make sure that it is locked | ||
269 | * before we clear it. If it is not locked, writing 1 | ||
270 | * will lock it instead of clearing it. | ||
271 | */ | ||
272 | bfa_reg_read(ioc->ioc_regs.ioc_sem_reg); | ||
273 | bfa_ioc_hw_sem_release(ioc); | ||
274 | } | ||
diff --git a/drivers/scsi/bfa/bfa_ioc_ct.c b/drivers/scsi/bfa/bfa_ioc_ct.c new file mode 100644 index 000000000000..20b58ad5f95c --- /dev/null +++ b/drivers/scsi/bfa/bfa_ioc_ct.c | |||
@@ -0,0 +1,423 @@ | |||
1 | /* | ||
2 | * Copyright (c) 2005-2009 Brocade Communications Systems, Inc. | ||
3 | * All rights reserved | ||
4 | * www.brocade.com | ||
5 | * | ||
6 | * Linux driver for Brocade Fibre Channel Host Bus Adapter. | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify it | ||
9 | * under the terms of the GNU General Public License (GPL) Version 2 as | ||
10 | * published by the Free Software Foundation | ||
11 | * | ||
12 | * This program is distributed in the hope that it will be useful, but | ||
13 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
15 | * General Public License for more details. | ||
16 | */ | ||
17 | |||
18 | #include <bfa.h> | ||
19 | #include <bfa_ioc.h> | ||
20 | #include <bfa_fwimg_priv.h> | ||
21 | #include <cna/bfa_cna_trcmod.h> | ||
22 | #include <cs/bfa_debug.h> | ||
23 | #include <bfi/bfi_ioc.h> | ||
24 | #include <bfi/bfi_ctreg.h> | ||
25 | #include <log/bfa_log_hal.h> | ||
26 | #include <defs/bfa_defs_pci.h> | ||
27 | |||
28 | BFA_TRC_FILE(CNA, IOC_CT); | ||
29 | |||
30 | /* | ||
31 | * forward declarations | ||
32 | */ | ||
33 | static bfa_status_t bfa_ioc_ct_pll_init(struct bfa_ioc_s *ioc); | ||
34 | static bfa_boolean_t bfa_ioc_ct_firmware_lock(struct bfa_ioc_s *ioc); | ||
35 | static void bfa_ioc_ct_firmware_unlock(struct bfa_ioc_s *ioc); | ||
36 | static u32* bfa_ioc_ct_fwimg_get_chunk(struct bfa_ioc_s *ioc, | ||
37 | u32 off); | ||
38 | static u32 bfa_ioc_ct_fwimg_get_size(struct bfa_ioc_s *ioc); | ||
39 | static void bfa_ioc_ct_reg_init(struct bfa_ioc_s *ioc); | ||
40 | static void bfa_ioc_ct_map_port(struct bfa_ioc_s *ioc); | ||
41 | static void bfa_ioc_ct_isr_mode_set(struct bfa_ioc_s *ioc, bfa_boolean_t msix); | ||
42 | static void bfa_ioc_ct_notify_hbfail(struct bfa_ioc_s *ioc); | ||
43 | static void bfa_ioc_ct_ownership_reset(struct bfa_ioc_s *ioc); | ||
44 | |||
45 | struct bfa_ioc_hwif_s hwif_ct = { | ||
46 | bfa_ioc_ct_pll_init, | ||
47 | bfa_ioc_ct_firmware_lock, | ||
48 | bfa_ioc_ct_firmware_unlock, | ||
49 | bfa_ioc_ct_fwimg_get_chunk, | ||
50 | bfa_ioc_ct_fwimg_get_size, | ||
51 | bfa_ioc_ct_reg_init, | ||
52 | bfa_ioc_ct_map_port, | ||
53 | bfa_ioc_ct_isr_mode_set, | ||
54 | bfa_ioc_ct_notify_hbfail, | ||
55 | bfa_ioc_ct_ownership_reset, | ||
56 | }; | ||
57 | |||
58 | /** | ||
59 | * Called from bfa_ioc_attach() to map asic specific calls. | ||
60 | */ | ||
61 | void | ||
62 | bfa_ioc_set_ct_hwif(struct bfa_ioc_s *ioc) | ||
63 | { | ||
64 | ioc->ioc_hwif = &hwif_ct; | ||
65 | } | ||
66 | |||
67 | static u32* | ||
68 | bfa_ioc_ct_fwimg_get_chunk(struct bfa_ioc_s *ioc, u32 off) | ||
69 | { | ||
70 | return bfi_image_ct_get_chunk(off); | ||
71 | } | ||
72 | |||
73 | static u32 | ||
74 | bfa_ioc_ct_fwimg_get_size(struct bfa_ioc_s *ioc) | ||
75 | { | ||
76 | return bfi_image_ct_size; | ||
77 | } | ||
78 | |||
79 | /** | ||
80 | * Return true if firmware of current driver matches the running firmware. | ||
81 | */ | ||
82 | static bfa_boolean_t | ||
83 | bfa_ioc_ct_firmware_lock(struct bfa_ioc_s *ioc) | ||
84 | { | ||
85 | enum bfi_ioc_state ioc_fwstate; | ||
86 | u32 usecnt; | ||
87 | struct bfi_ioc_image_hdr_s fwhdr; | ||
88 | |||
89 | /** | ||
90 | * Firmware match check is relevant only for CNA. | ||
91 | */ | ||
92 | if (!ioc->cna) | ||
93 | return BFA_TRUE; | ||
94 | |||
95 | /** | ||
96 | * If bios boot (flash based) -- do not increment usage count | ||
97 | */ | ||
98 | if (bfa_ioc_ct_fwimg_get_size(ioc) < BFA_IOC_FWIMG_MINSZ) | ||
99 | return BFA_TRUE; | ||
100 | |||
101 | bfa_ioc_sem_get(ioc->ioc_regs.ioc_usage_sem_reg); | ||
102 | usecnt = bfa_reg_read(ioc->ioc_regs.ioc_usage_reg); | ||
103 | |||
104 | /** | ||
105 | * If usage count is 0, always return TRUE. | ||
106 | */ | ||
107 | if (usecnt == 0) { | ||
108 | bfa_reg_write(ioc->ioc_regs.ioc_usage_reg, 1); | ||
109 | bfa_ioc_sem_release(ioc->ioc_regs.ioc_usage_sem_reg); | ||
110 | bfa_trc(ioc, usecnt); | ||
111 | return BFA_TRUE; | ||
112 | } | ||
113 | |||
114 | ioc_fwstate = bfa_reg_read(ioc->ioc_regs.ioc_fwstate); | ||
115 | bfa_trc(ioc, ioc_fwstate); | ||
116 | |||
117 | /** | ||
118 | * Use count cannot be non-zero and chip in uninitialized state. | ||
119 | */ | ||
120 | bfa_assert(ioc_fwstate != BFI_IOC_UNINIT); | ||
121 | |||
122 | /** | ||
123 | * Check if another driver with a different firmware is active | ||
124 | */ | ||
125 | bfa_ioc_fwver_get(ioc, &fwhdr); | ||
126 | if (!bfa_ioc_fwver_cmp(ioc, &fwhdr)) { | ||
127 | bfa_ioc_sem_release(ioc->ioc_regs.ioc_usage_sem_reg); | ||
128 | bfa_trc(ioc, usecnt); | ||
129 | return BFA_FALSE; | ||
130 | } | ||
131 | |||
132 | /** | ||
133 | * Same firmware version. Increment the reference count. | ||
134 | */ | ||
135 | usecnt++; | ||
136 | bfa_reg_write(ioc->ioc_regs.ioc_usage_reg, usecnt); | ||
137 | bfa_ioc_sem_release(ioc->ioc_regs.ioc_usage_sem_reg); | ||
138 | bfa_trc(ioc, usecnt); | ||
139 | return BFA_TRUE; | ||
140 | } | ||
141 | |||
142 | static void | ||
143 | bfa_ioc_ct_firmware_unlock(struct bfa_ioc_s *ioc) | ||
144 | { | ||
145 | u32 usecnt; | ||
146 | |||
147 | /** | ||
148 | * Firmware lock is relevant only for CNA. | ||
149 | * If bios boot (flash based) -- do not decrement usage count | ||
150 | */ | ||
151 | if (!ioc->cna || bfa_ioc_ct_fwimg_get_size(ioc) < BFA_IOC_FWIMG_MINSZ) | ||
152 | return; | ||
153 | |||
154 | /** | ||
155 | * decrement usage count | ||
156 | */ | ||
157 | bfa_ioc_sem_get(ioc->ioc_regs.ioc_usage_sem_reg); | ||
158 | usecnt = bfa_reg_read(ioc->ioc_regs.ioc_usage_reg); | ||
159 | bfa_assert(usecnt > 0); | ||
160 | |||
161 | usecnt--; | ||
162 | bfa_reg_write(ioc->ioc_regs.ioc_usage_reg, usecnt); | ||
163 | bfa_trc(ioc, usecnt); | ||
164 | |||
165 | bfa_ioc_sem_release(ioc->ioc_regs.ioc_usage_sem_reg); | ||
166 | } | ||
167 | |||
168 | /** | ||
169 | * Notify other functions on HB failure. | ||
170 | */ | ||
171 | static void | ||
172 | bfa_ioc_ct_notify_hbfail(struct bfa_ioc_s *ioc) | ||
173 | { | ||
174 | if (ioc->cna) { | ||
175 | bfa_reg_write(ioc->ioc_regs.ll_halt, __FW_INIT_HALT_P); | ||
176 | /* Wait for halt to take effect */ | ||
177 | bfa_reg_read(ioc->ioc_regs.ll_halt); | ||
178 | } else { | ||
179 | bfa_reg_write(ioc->ioc_regs.err_set, __PSS_ERR_STATUS_SET); | ||
180 | bfa_reg_read(ioc->ioc_regs.err_set); | ||
181 | } | ||
182 | } | ||
183 | |||
184 | /** | ||
185 | * Host to LPU mailbox message addresses | ||
186 | */ | ||
187 | static struct { u32 hfn_mbox, lpu_mbox, hfn_pgn; } iocreg_fnreg[] = { | ||
188 | { HOSTFN0_LPU_MBOX0_0, LPU_HOSTFN0_MBOX0_0, HOST_PAGE_NUM_FN0 }, | ||
189 | { HOSTFN1_LPU_MBOX0_8, LPU_HOSTFN1_MBOX0_8, HOST_PAGE_NUM_FN1 }, | ||
190 | { HOSTFN2_LPU_MBOX0_0, LPU_HOSTFN2_MBOX0_0, HOST_PAGE_NUM_FN2 }, | ||
191 | { HOSTFN3_LPU_MBOX0_8, LPU_HOSTFN3_MBOX0_8, HOST_PAGE_NUM_FN3 } | ||
192 | }; | ||
193 | |||
194 | /** | ||
195 | * Host <-> LPU mailbox command/status registers - port 0 | ||
196 | */ | ||
197 | static struct { u32 hfn, lpu; } iocreg_mbcmd_p0[] = { | ||
198 | { HOSTFN0_LPU0_MBOX0_CMD_STAT, LPU0_HOSTFN0_MBOX0_CMD_STAT }, | ||
199 | { HOSTFN1_LPU0_MBOX0_CMD_STAT, LPU0_HOSTFN1_MBOX0_CMD_STAT }, | ||
200 | { HOSTFN2_LPU0_MBOX0_CMD_STAT, LPU0_HOSTFN2_MBOX0_CMD_STAT }, | ||
201 | { HOSTFN3_LPU0_MBOX0_CMD_STAT, LPU0_HOSTFN3_MBOX0_CMD_STAT } | ||
202 | }; | ||
203 | |||
204 | /** | ||
205 | * Host <-> LPU mailbox command/status registers - port 1 | ||
206 | */ | ||
207 | static struct { u32 hfn, lpu; } iocreg_mbcmd_p1[] = { | ||
208 | { HOSTFN0_LPU1_MBOX0_CMD_STAT, LPU1_HOSTFN0_MBOX0_CMD_STAT }, | ||
209 | { HOSTFN1_LPU1_MBOX0_CMD_STAT, LPU1_HOSTFN1_MBOX0_CMD_STAT }, | ||
210 | { HOSTFN2_LPU1_MBOX0_CMD_STAT, LPU1_HOSTFN2_MBOX0_CMD_STAT }, | ||
211 | { HOSTFN3_LPU1_MBOX0_CMD_STAT, LPU1_HOSTFN3_MBOX0_CMD_STAT } | ||
212 | }; | ||
213 | |||
214 | static void | ||
215 | bfa_ioc_ct_reg_init(struct bfa_ioc_s *ioc) | ||
216 | { | ||
217 | bfa_os_addr_t rb; | ||
218 | int pcifn = bfa_ioc_pcifn(ioc); | ||
219 | |||
220 | rb = bfa_ioc_bar0(ioc); | ||
221 | |||
222 | ioc->ioc_regs.hfn_mbox = rb + iocreg_fnreg[pcifn].hfn_mbox; | ||
223 | ioc->ioc_regs.lpu_mbox = rb + iocreg_fnreg[pcifn].lpu_mbox; | ||
224 | ioc->ioc_regs.host_page_num_fn = rb + iocreg_fnreg[pcifn].hfn_pgn; | ||
225 | |||
226 | if (ioc->port_id == 0) { | ||
227 | ioc->ioc_regs.heartbeat = rb + BFA_IOC0_HBEAT_REG; | ||
228 | ioc->ioc_regs.ioc_fwstate = rb + BFA_IOC0_STATE_REG; | ||
229 | ioc->ioc_regs.hfn_mbox_cmd = rb + iocreg_mbcmd_p0[pcifn].hfn; | ||
230 | ioc->ioc_regs.lpu_mbox_cmd = rb + iocreg_mbcmd_p0[pcifn].lpu; | ||
231 | ioc->ioc_regs.ll_halt = rb + FW_INIT_HALT_P0; | ||
232 | } else { | ||
233 | ioc->ioc_regs.heartbeat = (rb + BFA_IOC1_HBEAT_REG); | ||
234 | ioc->ioc_regs.ioc_fwstate = (rb + BFA_IOC1_STATE_REG); | ||
235 | ioc->ioc_regs.hfn_mbox_cmd = rb + iocreg_mbcmd_p1[pcifn].hfn; | ||
236 | ioc->ioc_regs.lpu_mbox_cmd = rb + iocreg_mbcmd_p1[pcifn].lpu; | ||
237 | ioc->ioc_regs.ll_halt = rb + FW_INIT_HALT_P1; | ||
238 | } | ||
239 | |||
240 | /* | ||
241 | * PSS control registers | ||
242 | */ | ||
243 | ioc->ioc_regs.pss_ctl_reg = (rb + PSS_CTL_REG); | ||
244 | ioc->ioc_regs.pss_err_status_reg = (rb + PSS_ERR_STATUS_REG); | ||
245 | ioc->ioc_regs.app_pll_fast_ctl_reg = (rb + APP_PLL_425_CTL_REG); | ||
246 | ioc->ioc_regs.app_pll_slow_ctl_reg = (rb + APP_PLL_312_CTL_REG); | ||
247 | |||
248 | /* | ||
249 | * IOC semaphore registers and serialization | ||
250 | */ | ||
251 | ioc->ioc_regs.ioc_sem_reg = (rb + HOST_SEM0_REG); | ||
252 | ioc->ioc_regs.ioc_usage_sem_reg = (rb + HOST_SEM1_REG); | ||
253 | ioc->ioc_regs.ioc_init_sem_reg = (rb + HOST_SEM2_REG); | ||
254 | ioc->ioc_regs.ioc_usage_reg = (rb + BFA_FW_USE_COUNT); | ||
255 | |||
256 | /** | ||
257 | * sram memory access | ||
258 | */ | ||
259 | ioc->ioc_regs.smem_page_start = (rb + PSS_SMEM_PAGE_START); | ||
260 | ioc->ioc_regs.smem_pg0 = BFI_IOC_SMEM_PG0_CT; | ||
261 | |||
262 | /* | ||
263 | * err set reg : for notification of hb failure in fcmode | ||
264 | */ | ||
265 | ioc->ioc_regs.err_set = (rb + ERR_SET_REG); | ||
266 | } | ||
267 | |||
268 | /** | ||
269 | * Initialize IOC to port mapping. | ||
270 | */ | ||
271 | |||
272 | #define FNC_PERS_FN_SHIFT(__fn) ((__fn) * 8) | ||
273 | static void | ||
274 | bfa_ioc_ct_map_port(struct bfa_ioc_s *ioc) | ||
275 | { | ||
276 | bfa_os_addr_t rb = ioc->pcidev.pci_bar_kva; | ||
277 | u32 r32; | ||
278 | |||
279 | /** | ||
280 | * For catapult, base port id on personality register and IOC type | ||
281 | */ | ||
282 | r32 = bfa_reg_read(rb + FNC_PERS_REG); | ||
283 | r32 >>= FNC_PERS_FN_SHIFT(bfa_ioc_pcifn(ioc)); | ||
284 | ioc->port_id = (r32 & __F0_PORT_MAP_MK) >> __F0_PORT_MAP_SH; | ||
285 | |||
286 | bfa_trc(ioc, bfa_ioc_pcifn(ioc)); | ||
287 | bfa_trc(ioc, ioc->port_id); | ||
288 | } | ||
289 | |||
290 | /** | ||
291 | * Set interrupt mode for a function: INTX or MSIX | ||
292 | */ | ||
293 | static void | ||
294 | bfa_ioc_ct_isr_mode_set(struct bfa_ioc_s *ioc, bfa_boolean_t msix) | ||
295 | { | ||
296 | bfa_os_addr_t rb = ioc->pcidev.pci_bar_kva; | ||
297 | u32 r32, mode; | ||
298 | |||
299 | r32 = bfa_reg_read(rb + FNC_PERS_REG); | ||
300 | bfa_trc(ioc, r32); | ||
301 | |||
302 | mode = (r32 >> FNC_PERS_FN_SHIFT(bfa_ioc_pcifn(ioc))) & | ||
303 | __F0_INTX_STATUS; | ||
304 | |||
305 | /** | ||
306 | * If already in desired mode, do not change anything | ||
307 | */ | ||
308 | if (!msix && mode) | ||
309 | return; | ||
310 | |||
311 | if (msix) | ||
312 | mode = __F0_INTX_STATUS_MSIX; | ||
313 | else | ||
314 | mode = __F0_INTX_STATUS_INTA; | ||
315 | |||
316 | r32 &= ~(__F0_INTX_STATUS << FNC_PERS_FN_SHIFT(bfa_ioc_pcifn(ioc))); | ||
317 | r32 |= (mode << FNC_PERS_FN_SHIFT(bfa_ioc_pcifn(ioc))); | ||
318 | bfa_trc(ioc, r32); | ||
319 | |||
320 | bfa_reg_write(rb + FNC_PERS_REG, r32); | ||
321 | } | ||
322 | |||
323 | static bfa_status_t | ||
324 | bfa_ioc_ct_pll_init(struct bfa_ioc_s *ioc) | ||
325 | { | ||
326 | bfa_os_addr_t rb = ioc->pcidev.pci_bar_kva; | ||
327 | u32 pll_sclk, pll_fclk, r32; | ||
328 | |||
329 | /* | ||
330 | * Hold semaphore so that nobody can access the chip during init. | ||
331 | */ | ||
332 | bfa_ioc_sem_get(ioc->ioc_regs.ioc_init_sem_reg); | ||
333 | |||
334 | pll_sclk = __APP_PLL_312_LRESETN | __APP_PLL_312_ENARST | | ||
335 | __APP_PLL_312_RSEL200500 | __APP_PLL_312_P0_1(3U) | | ||
336 | __APP_PLL_312_JITLMT0_1(3U) | | ||
337 | __APP_PLL_312_CNTLMT0_1(1U); | ||
338 | pll_fclk = __APP_PLL_425_LRESETN | __APP_PLL_425_ENARST | | ||
339 | __APP_PLL_425_RSEL200500 | __APP_PLL_425_P0_1(3U) | | ||
340 | __APP_PLL_425_JITLMT0_1(3U) | | ||
341 | __APP_PLL_425_CNTLMT0_1(1U); | ||
342 | |||
343 | /** | ||
344 | * For catapult, choose operational mode FC/FCoE | ||
345 | */ | ||
346 | if (ioc->fcmode) { | ||
347 | bfa_reg_write((rb + OP_MODE), 0); | ||
348 | bfa_reg_write((rb + ETH_MAC_SER_REG), | ||
349 | __APP_EMS_CMLCKSEL | | ||
350 | __APP_EMS_REFCKBUFEN2 | | ||
351 | __APP_EMS_CHANNEL_SEL); | ||
352 | } else { | ||
353 | ioc->pllinit = BFA_TRUE; | ||
354 | bfa_reg_write((rb + OP_MODE), __GLOBAL_FCOE_MODE); | ||
355 | bfa_reg_write((rb + ETH_MAC_SER_REG), | ||
356 | __APP_EMS_REFCKBUFEN1); | ||
357 | } | ||
358 | |||
359 | bfa_reg_write((rb + BFA_IOC0_STATE_REG), BFI_IOC_UNINIT); | ||
360 | bfa_reg_write((rb + BFA_IOC1_STATE_REG), BFI_IOC_UNINIT); | ||
361 | |||
362 | bfa_reg_write((rb + HOSTFN0_INT_MSK), 0xffffffffU); | ||
363 | bfa_reg_write((rb + HOSTFN1_INT_MSK), 0xffffffffU); | ||
364 | bfa_reg_write((rb + HOSTFN0_INT_STATUS), 0xffffffffU); | ||
365 | bfa_reg_write((rb + HOSTFN1_INT_STATUS), 0xffffffffU); | ||
366 | bfa_reg_write((rb + HOSTFN0_INT_MSK), 0xffffffffU); | ||
367 | bfa_reg_write((rb + HOSTFN1_INT_MSK), 0xffffffffU); | ||
368 | |||
369 | bfa_reg_write(ioc->ioc_regs.app_pll_slow_ctl_reg, pll_sclk | | ||
370 | __APP_PLL_312_LOGIC_SOFT_RESET); | ||
371 | bfa_reg_write(ioc->ioc_regs.app_pll_fast_ctl_reg, pll_fclk | | ||
372 | __APP_PLL_425_LOGIC_SOFT_RESET); | ||
373 | bfa_reg_write(ioc->ioc_regs.app_pll_slow_ctl_reg, pll_sclk | | ||
374 | __APP_PLL_312_LOGIC_SOFT_RESET | __APP_PLL_312_ENABLE); | ||
375 | bfa_reg_write(ioc->ioc_regs.app_pll_fast_ctl_reg, pll_fclk | | ||
376 | __APP_PLL_425_LOGIC_SOFT_RESET | __APP_PLL_425_ENABLE); | ||
377 | |||
378 | /** | ||
379 | * Wait for PLLs to lock. | ||
380 | */ | ||
381 | bfa_reg_read(rb + HOSTFN0_INT_MSK); | ||
382 | bfa_os_udelay(2000); | ||
383 | bfa_reg_write((rb + HOSTFN0_INT_STATUS), 0xffffffffU); | ||
384 | bfa_reg_write((rb + HOSTFN1_INT_STATUS), 0xffffffffU); | ||
385 | |||
386 | bfa_reg_write(ioc->ioc_regs.app_pll_slow_ctl_reg, pll_sclk | | ||
387 | __APP_PLL_312_ENABLE); | ||
388 | bfa_reg_write(ioc->ioc_regs.app_pll_fast_ctl_reg, pll_fclk | | ||
389 | __APP_PLL_425_ENABLE); | ||
390 | |||
391 | bfa_reg_write((rb + MBIST_CTL_REG), __EDRAM_BISTR_START); | ||
392 | bfa_os_udelay(1000); | ||
393 | r32 = bfa_reg_read((rb + MBIST_STAT_REG)); | ||
394 | bfa_trc(ioc, r32); | ||
395 | /* | ||
396 | * release semaphore. | ||
397 | */ | ||
398 | bfa_ioc_sem_release(ioc->ioc_regs.ioc_init_sem_reg); | ||
399 | |||
400 | return BFA_STATUS_OK; | ||
401 | } | ||
402 | |||
403 | /** | ||
404 | * Cleanup hw semaphore and usecnt registers | ||
405 | */ | ||
406 | static void | ||
407 | bfa_ioc_ct_ownership_reset(struct bfa_ioc_s *ioc) | ||
408 | { | ||
409 | |||
410 | if (ioc->cna) { | ||
411 | bfa_ioc_sem_get(ioc->ioc_regs.ioc_usage_sem_reg); | ||
412 | bfa_reg_write(ioc->ioc_regs.ioc_usage_reg, 0); | ||
413 | bfa_ioc_sem_release(ioc->ioc_regs.ioc_usage_sem_reg); | ||
414 | } | ||
415 | |||
416 | /* | ||
417 | * Read the hw sem reg to make sure that it is locked | ||
418 | * before we clear it. If it is not locked, writing 1 | ||
419 | * will lock it instead of clearing it. | ||
420 | */ | ||
421 | bfa_reg_read(ioc->ioc_regs.ioc_sem_reg); | ||
422 | bfa_ioc_hw_sem_release(ioc); | ||
423 | } | ||
diff --git a/drivers/scsi/bfa/bfa_iocfc.c b/drivers/scsi/bfa/bfa_iocfc.c index d7ab792a9e54..a76de2669bfc 100644 --- a/drivers/scsi/bfa/bfa_iocfc.c +++ b/drivers/scsi/bfa/bfa_iocfc.c | |||
@@ -172,6 +172,7 @@ bfa_iocfc_init_mem(struct bfa_s *bfa, void *bfad, struct bfa_iocfc_cfg_s *cfg, | |||
172 | */ | 172 | */ |
173 | if (bfa_ioc_devid(&bfa->ioc) == BFA_PCI_DEVICE_ID_CT) { | 173 | if (bfa_ioc_devid(&bfa->ioc) == BFA_PCI_DEVICE_ID_CT) { |
174 | iocfc->hwif.hw_reginit = bfa_hwct_reginit; | 174 | iocfc->hwif.hw_reginit = bfa_hwct_reginit; |
175 | iocfc->hwif.hw_reqq_ack = bfa_hwct_reqq_ack; | ||
175 | iocfc->hwif.hw_rspq_ack = bfa_hwct_rspq_ack; | 176 | iocfc->hwif.hw_rspq_ack = bfa_hwct_rspq_ack; |
176 | iocfc->hwif.hw_msix_init = bfa_hwct_msix_init; | 177 | iocfc->hwif.hw_msix_init = bfa_hwct_msix_init; |
177 | iocfc->hwif.hw_msix_install = bfa_hwct_msix_install; | 178 | iocfc->hwif.hw_msix_install = bfa_hwct_msix_install; |
@@ -180,6 +181,7 @@ bfa_iocfc_init_mem(struct bfa_s *bfa, void *bfad, struct bfa_iocfc_cfg_s *cfg, | |||
180 | iocfc->hwif.hw_msix_getvecs = bfa_hwct_msix_getvecs; | 181 | iocfc->hwif.hw_msix_getvecs = bfa_hwct_msix_getvecs; |
181 | } else { | 182 | } else { |
182 | iocfc->hwif.hw_reginit = bfa_hwcb_reginit; | 183 | iocfc->hwif.hw_reginit = bfa_hwcb_reginit; |
184 | iocfc->hwif.hw_reqq_ack = bfa_hwcb_reqq_ack; | ||
183 | iocfc->hwif.hw_rspq_ack = bfa_hwcb_rspq_ack; | 185 | iocfc->hwif.hw_rspq_ack = bfa_hwcb_rspq_ack; |
184 | iocfc->hwif.hw_msix_init = bfa_hwcb_msix_init; | 186 | iocfc->hwif.hw_msix_init = bfa_hwcb_msix_init; |
185 | iocfc->hwif.hw_msix_install = bfa_hwcb_msix_install; | 187 | iocfc->hwif.hw_msix_install = bfa_hwcb_msix_install; |
@@ -336,8 +338,10 @@ bfa_iocfc_init_cb(void *bfa_arg, bfa_boolean_t complete) | |||
336 | bfa_cb_init(bfa->bfad, BFA_STATUS_OK); | 338 | bfa_cb_init(bfa->bfad, BFA_STATUS_OK); |
337 | else | 339 | else |
338 | bfa_cb_init(bfa->bfad, BFA_STATUS_FAILED); | 340 | bfa_cb_init(bfa->bfad, BFA_STATUS_FAILED); |
339 | } else | 341 | } else { |
340 | bfa->iocfc.action = BFA_IOCFC_ACT_NONE; | 342 | if (bfa->iocfc.cfgdone) |
343 | bfa->iocfc.action = BFA_IOCFC_ACT_NONE; | ||
344 | } | ||
341 | } | 345 | } |
342 | 346 | ||
343 | static void | 347 | static void |
@@ -619,8 +623,6 @@ bfa_iocfc_attach(struct bfa_s *bfa, void *bfad, struct bfa_iocfc_cfg_s *cfg, | |||
619 | 623 | ||
620 | bfa_ioc_attach(&bfa->ioc, bfa, &bfa_iocfc_cbfn, &bfa->timer_mod, | 624 | bfa_ioc_attach(&bfa->ioc, bfa, &bfa_iocfc_cbfn, &bfa->timer_mod, |
621 | bfa->trcmod, bfa->aen, bfa->logm); | 625 | bfa->trcmod, bfa->aen, bfa->logm); |
622 | bfa_ioc_pci_init(&bfa->ioc, pcidev, BFI_MC_IOCFC); | ||
623 | bfa_ioc_mbox_register(&bfa->ioc, bfa_mbox_isrs); | ||
624 | 626 | ||
625 | /** | 627 | /** |
626 | * Choose FC (ssid: 0x1C) v/s FCoE (ssid: 0x14) mode. | 628 | * Choose FC (ssid: 0x1C) v/s FCoE (ssid: 0x14) mode. |
@@ -628,6 +630,9 @@ bfa_iocfc_attach(struct bfa_s *bfa, void *bfad, struct bfa_iocfc_cfg_s *cfg, | |||
628 | if (0) | 630 | if (0) |
629 | bfa_ioc_set_fcmode(&bfa->ioc); | 631 | bfa_ioc_set_fcmode(&bfa->ioc); |
630 | 632 | ||
633 | bfa_ioc_pci_init(&bfa->ioc, pcidev, BFI_MC_IOCFC); | ||
634 | bfa_ioc_mbox_register(&bfa->ioc, bfa_mbox_isrs); | ||
635 | |||
631 | bfa_iocfc_init_mem(bfa, bfad, cfg, pcidev); | 636 | bfa_iocfc_init_mem(bfa, bfad, cfg, pcidev); |
632 | bfa_iocfc_mem_claim(bfa, cfg, meminfo); | 637 | bfa_iocfc_mem_claim(bfa, cfg, meminfo); |
633 | bfa_timer_init(&bfa->timer_mod); | 638 | bfa_timer_init(&bfa->timer_mod); |
@@ -654,7 +659,6 @@ bfa_iocfc_init(struct bfa_s *bfa) | |||
654 | { | 659 | { |
655 | bfa->iocfc.action = BFA_IOCFC_ACT_INIT; | 660 | bfa->iocfc.action = BFA_IOCFC_ACT_INIT; |
656 | bfa_ioc_enable(&bfa->ioc); | 661 | bfa_ioc_enable(&bfa->ioc); |
657 | bfa_msix_install(bfa); | ||
658 | } | 662 | } |
659 | 663 | ||
660 | /** | 664 | /** |
@@ -797,6 +801,11 @@ bfa_iocfc_get_stats(struct bfa_s *bfa, struct bfa_iocfc_stats_s *stats, | |||
797 | return BFA_STATUS_DEVBUSY; | 801 | return BFA_STATUS_DEVBUSY; |
798 | } | 802 | } |
799 | 803 | ||
804 | if (!bfa_iocfc_is_operational(bfa)) { | ||
805 | bfa_trc(bfa, 0); | ||
806 | return BFA_STATUS_IOC_NON_OP; | ||
807 | } | ||
808 | |||
800 | iocfc->stats_busy = BFA_TRUE; | 809 | iocfc->stats_busy = BFA_TRUE; |
801 | iocfc->stats_ret = stats; | 810 | iocfc->stats_ret = stats; |
802 | iocfc->stats_cbfn = cbfn; | 811 | iocfc->stats_cbfn = cbfn; |
@@ -817,6 +826,11 @@ bfa_iocfc_clear_stats(struct bfa_s *bfa, bfa_cb_ioc_t cbfn, void *cbarg) | |||
817 | return BFA_STATUS_DEVBUSY; | 826 | return BFA_STATUS_DEVBUSY; |
818 | } | 827 | } |
819 | 828 | ||
829 | if (!bfa_iocfc_is_operational(bfa)) { | ||
830 | bfa_trc(bfa, 0); | ||
831 | return BFA_STATUS_IOC_NON_OP; | ||
832 | } | ||
833 | |||
820 | iocfc->stats_busy = BFA_TRUE; | 834 | iocfc->stats_busy = BFA_TRUE; |
821 | iocfc->stats_cbfn = cbfn; | 835 | iocfc->stats_cbfn = cbfn; |
822 | iocfc->stats_cbarg = cbarg; | 836 | iocfc->stats_cbarg = cbarg; |
diff --git a/drivers/scsi/bfa/bfa_iocfc.h b/drivers/scsi/bfa/bfa_iocfc.h index ce9a830a4207..fbb4bdc9d600 100644 --- a/drivers/scsi/bfa/bfa_iocfc.h +++ b/drivers/scsi/bfa/bfa_iocfc.h | |||
@@ -54,6 +54,7 @@ struct bfa_msix_s { | |||
54 | */ | 54 | */ |
55 | struct bfa_hwif_s { | 55 | struct bfa_hwif_s { |
56 | void (*hw_reginit)(struct bfa_s *bfa); | 56 | void (*hw_reginit)(struct bfa_s *bfa); |
57 | void (*hw_reqq_ack)(struct bfa_s *bfa, int reqq); | ||
57 | void (*hw_rspq_ack)(struct bfa_s *bfa, int rspq); | 58 | void (*hw_rspq_ack)(struct bfa_s *bfa, int rspq); |
58 | void (*hw_msix_init)(struct bfa_s *bfa, int nvecs); | 59 | void (*hw_msix_init)(struct bfa_s *bfa, int nvecs); |
59 | void (*hw_msix_install)(struct bfa_s *bfa); | 60 | void (*hw_msix_install)(struct bfa_s *bfa); |
@@ -143,6 +144,7 @@ void bfa_msix_rspq(struct bfa_s *bfa, int vec); | |||
143 | void bfa_msix_lpu_err(struct bfa_s *bfa, int vec); | 144 | void bfa_msix_lpu_err(struct bfa_s *bfa, int vec); |
144 | 145 | ||
145 | void bfa_hwcb_reginit(struct bfa_s *bfa); | 146 | void bfa_hwcb_reginit(struct bfa_s *bfa); |
147 | void bfa_hwcb_reqq_ack(struct bfa_s *bfa, int rspq); | ||
146 | void bfa_hwcb_rspq_ack(struct bfa_s *bfa, int rspq); | 148 | void bfa_hwcb_rspq_ack(struct bfa_s *bfa, int rspq); |
147 | void bfa_hwcb_msix_init(struct bfa_s *bfa, int nvecs); | 149 | void bfa_hwcb_msix_init(struct bfa_s *bfa, int nvecs); |
148 | void bfa_hwcb_msix_install(struct bfa_s *bfa); | 150 | void bfa_hwcb_msix_install(struct bfa_s *bfa); |
@@ -151,6 +153,7 @@ void bfa_hwcb_isr_mode_set(struct bfa_s *bfa, bfa_boolean_t msix); | |||
151 | void bfa_hwcb_msix_getvecs(struct bfa_s *bfa, u32 *vecmap, | 153 | void bfa_hwcb_msix_getvecs(struct bfa_s *bfa, u32 *vecmap, |
152 | u32 *nvecs, u32 *maxvec); | 154 | u32 *nvecs, u32 *maxvec); |
153 | void bfa_hwct_reginit(struct bfa_s *bfa); | 155 | void bfa_hwct_reginit(struct bfa_s *bfa); |
156 | void bfa_hwct_reqq_ack(struct bfa_s *bfa, int rspq); | ||
154 | void bfa_hwct_rspq_ack(struct bfa_s *bfa, int rspq); | 157 | void bfa_hwct_rspq_ack(struct bfa_s *bfa, int rspq); |
155 | void bfa_hwct_msix_init(struct bfa_s *bfa, int nvecs); | 158 | void bfa_hwct_msix_init(struct bfa_s *bfa, int nvecs); |
156 | void bfa_hwct_msix_install(struct bfa_s *bfa); | 159 | void bfa_hwct_msix_install(struct bfa_s *bfa); |
diff --git a/drivers/scsi/bfa/bfa_ioim.c b/drivers/scsi/bfa/bfa_ioim.c index f81d359b7089..5b107abe46e5 100644 --- a/drivers/scsi/bfa/bfa_ioim.c +++ b/drivers/scsi/bfa/bfa_ioim.c | |||
@@ -149,7 +149,7 @@ bfa_ioim_sm_uninit(struct bfa_ioim_s *ioim, enum bfa_ioim_event event) | |||
149 | break; | 149 | break; |
150 | 150 | ||
151 | default: | 151 | default: |
152 | bfa_assert(0); | 152 | bfa_sm_fault(ioim->bfa, event); |
153 | } | 153 | } |
154 | } | 154 | } |
155 | 155 | ||
@@ -194,7 +194,7 @@ bfa_ioim_sm_sgalloc(struct bfa_ioim_s *ioim, enum bfa_ioim_event event) | |||
194 | break; | 194 | break; |
195 | 195 | ||
196 | default: | 196 | default: |
197 | bfa_assert(0); | 197 | bfa_sm_fault(ioim->bfa, event); |
198 | } | 198 | } |
199 | } | 199 | } |
200 | 200 | ||
@@ -259,7 +259,7 @@ bfa_ioim_sm_active(struct bfa_ioim_s *ioim, enum bfa_ioim_event event) | |||
259 | break; | 259 | break; |
260 | 260 | ||
261 | default: | 261 | default: |
262 | bfa_assert(0); | 262 | bfa_sm_fault(ioim->bfa, event); |
263 | } | 263 | } |
264 | } | 264 | } |
265 | 265 | ||
@@ -317,7 +317,7 @@ bfa_ioim_sm_abort(struct bfa_ioim_s *ioim, enum bfa_ioim_event event) | |||
317 | break; | 317 | break; |
318 | 318 | ||
319 | default: | 319 | default: |
320 | bfa_assert(0); | 320 | bfa_sm_fault(ioim->bfa, event); |
321 | } | 321 | } |
322 | } | 322 | } |
323 | 323 | ||
@@ -377,7 +377,7 @@ bfa_ioim_sm_cleanup(struct bfa_ioim_s *ioim, enum bfa_ioim_event event) | |||
377 | break; | 377 | break; |
378 | 378 | ||
379 | default: | 379 | default: |
380 | bfa_assert(0); | 380 | bfa_sm_fault(ioim->bfa, event); |
381 | } | 381 | } |
382 | } | 382 | } |
383 | 383 | ||
@@ -419,7 +419,7 @@ bfa_ioim_sm_qfull(struct bfa_ioim_s *ioim, enum bfa_ioim_event event) | |||
419 | break; | 419 | break; |
420 | 420 | ||
421 | default: | 421 | default: |
422 | bfa_assert(0); | 422 | bfa_sm_fault(ioim->bfa, event); |
423 | } | 423 | } |
424 | } | 424 | } |
425 | 425 | ||
@@ -467,7 +467,7 @@ bfa_ioim_sm_abort_qfull(struct bfa_ioim_s *ioim, enum bfa_ioim_event event) | |||
467 | break; | 467 | break; |
468 | 468 | ||
469 | default: | 469 | default: |
470 | bfa_assert(0); | 470 | bfa_sm_fault(ioim->bfa, event); |
471 | } | 471 | } |
472 | } | 472 | } |
473 | 473 | ||
@@ -516,7 +516,7 @@ bfa_ioim_sm_cleanup_qfull(struct bfa_ioim_s *ioim, enum bfa_ioim_event event) | |||
516 | break; | 516 | break; |
517 | 517 | ||
518 | default: | 518 | default: |
519 | bfa_assert(0); | 519 | bfa_sm_fault(ioim->bfa, event); |
520 | } | 520 | } |
521 | } | 521 | } |
522 | 522 | ||
@@ -544,7 +544,7 @@ bfa_ioim_sm_hcb(struct bfa_ioim_s *ioim, enum bfa_ioim_event event) | |||
544 | break; | 544 | break; |
545 | 545 | ||
546 | default: | 546 | default: |
547 | bfa_assert(0); | 547 | bfa_sm_fault(ioim->bfa, event); |
548 | } | 548 | } |
549 | } | 549 | } |
550 | 550 | ||
@@ -577,7 +577,7 @@ bfa_ioim_sm_hcb_free(struct bfa_ioim_s *ioim, enum bfa_ioim_event event) | |||
577 | break; | 577 | break; |
578 | 578 | ||
579 | default: | 579 | default: |
580 | bfa_assert(0); | 580 | bfa_sm_fault(ioim->bfa, event); |
581 | } | 581 | } |
582 | } | 582 | } |
583 | 583 | ||
@@ -605,7 +605,7 @@ bfa_ioim_sm_resfree(struct bfa_ioim_s *ioim, enum bfa_ioim_event event) | |||
605 | break; | 605 | break; |
606 | 606 | ||
607 | default: | 607 | default: |
608 | bfa_assert(0); | 608 | bfa_sm_fault(ioim->bfa, event); |
609 | } | 609 | } |
610 | } | 610 | } |
611 | 611 | ||
diff --git a/drivers/scsi/bfa/bfa_itnim.c b/drivers/scsi/bfa/bfa_itnim.c index eabf7d38bd09..a914ff255135 100644 --- a/drivers/scsi/bfa/bfa_itnim.c +++ b/drivers/scsi/bfa/bfa_itnim.c | |||
@@ -144,7 +144,7 @@ bfa_itnim_sm_uninit(struct bfa_itnim_s *itnim, enum bfa_itnim_event event) | |||
144 | break; | 144 | break; |
145 | 145 | ||
146 | default: | 146 | default: |
147 | bfa_assert(0); | 147 | bfa_sm_fault(itnim->bfa, event); |
148 | } | 148 | } |
149 | } | 149 | } |
150 | 150 | ||
@@ -175,7 +175,7 @@ bfa_itnim_sm_created(struct bfa_itnim_s *itnim, enum bfa_itnim_event event) | |||
175 | break; | 175 | break; |
176 | 176 | ||
177 | default: | 177 | default: |
178 | bfa_assert(0); | 178 | bfa_sm_fault(itnim->bfa, event); |
179 | } | 179 | } |
180 | } | 180 | } |
181 | 181 | ||
@@ -212,7 +212,7 @@ bfa_itnim_sm_fwcreate(struct bfa_itnim_s *itnim, enum bfa_itnim_event event) | |||
212 | break; | 212 | break; |
213 | 213 | ||
214 | default: | 214 | default: |
215 | bfa_assert(0); | 215 | bfa_sm_fault(itnim->bfa, event); |
216 | } | 216 | } |
217 | } | 217 | } |
218 | 218 | ||
@@ -247,7 +247,7 @@ bfa_itnim_sm_fwcreate_qfull(struct bfa_itnim_s *itnim, | |||
247 | break; | 247 | break; |
248 | 248 | ||
249 | default: | 249 | default: |
250 | bfa_assert(0); | 250 | bfa_sm_fault(itnim->bfa, event); |
251 | } | 251 | } |
252 | } | 252 | } |
253 | 253 | ||
@@ -275,7 +275,7 @@ bfa_itnim_sm_delete_pending(struct bfa_itnim_s *itnim, | |||
275 | break; | 275 | break; |
276 | 276 | ||
277 | default: | 277 | default: |
278 | bfa_assert(0); | 278 | bfa_sm_fault(itnim->bfa, event); |
279 | } | 279 | } |
280 | } | 280 | } |
281 | 281 | ||
@@ -317,7 +317,7 @@ bfa_itnim_sm_online(struct bfa_itnim_s *itnim, enum bfa_itnim_event event) | |||
317 | break; | 317 | break; |
318 | 318 | ||
319 | default: | 319 | default: |
320 | bfa_assert(0); | 320 | bfa_sm_fault(itnim->bfa, event); |
321 | } | 321 | } |
322 | } | 322 | } |
323 | 323 | ||
@@ -348,7 +348,7 @@ bfa_itnim_sm_sler(struct bfa_itnim_s *itnim, enum bfa_itnim_event event) | |||
348 | break; | 348 | break; |
349 | 349 | ||
350 | default: | 350 | default: |
351 | bfa_assert(0); | 351 | bfa_sm_fault(itnim->bfa, event); |
352 | } | 352 | } |
353 | } | 353 | } |
354 | 354 | ||
@@ -385,7 +385,7 @@ bfa_itnim_sm_cleanup_offline(struct bfa_itnim_s *itnim, | |||
385 | break; | 385 | break; |
386 | 386 | ||
387 | default: | 387 | default: |
388 | bfa_assert(0); | 388 | bfa_sm_fault(itnim->bfa, event); |
389 | } | 389 | } |
390 | } | 390 | } |
391 | 391 | ||
@@ -413,7 +413,7 @@ bfa_itnim_sm_cleanup_delete(struct bfa_itnim_s *itnim, | |||
413 | break; | 413 | break; |
414 | 414 | ||
415 | default: | 415 | default: |
416 | bfa_assert(0); | 416 | bfa_sm_fault(itnim->bfa, event); |
417 | } | 417 | } |
418 | } | 418 | } |
419 | 419 | ||
@@ -442,7 +442,7 @@ bfa_itnim_sm_fwdelete(struct bfa_itnim_s *itnim, enum bfa_itnim_event event) | |||
442 | break; | 442 | break; |
443 | 443 | ||
444 | default: | 444 | default: |
445 | bfa_assert(0); | 445 | bfa_sm_fault(itnim->bfa, event); |
446 | } | 446 | } |
447 | } | 447 | } |
448 | 448 | ||
@@ -470,7 +470,7 @@ bfa_itnim_sm_fwdelete_qfull(struct bfa_itnim_s *itnim, | |||
470 | break; | 470 | break; |
471 | 471 | ||
472 | default: | 472 | default: |
473 | bfa_assert(0); | 473 | bfa_sm_fault(itnim->bfa, event); |
474 | } | 474 | } |
475 | } | 475 | } |
476 | 476 | ||
@@ -502,7 +502,7 @@ bfa_itnim_sm_offline(struct bfa_itnim_s *itnim, enum bfa_itnim_event event) | |||
502 | break; | 502 | break; |
503 | 503 | ||
504 | default: | 504 | default: |
505 | bfa_assert(0); | 505 | bfa_sm_fault(itnim->bfa, event); |
506 | } | 506 | } |
507 | } | 507 | } |
508 | 508 | ||
@@ -538,7 +538,7 @@ bfa_itnim_sm_iocdisable(struct bfa_itnim_s *itnim, | |||
538 | break; | 538 | break; |
539 | 539 | ||
540 | default: | 540 | default: |
541 | bfa_assert(0); | 541 | bfa_sm_fault(itnim->bfa, event); |
542 | } | 542 | } |
543 | } | 543 | } |
544 | 544 | ||
@@ -559,7 +559,7 @@ bfa_itnim_sm_deleting(struct bfa_itnim_s *itnim, enum bfa_itnim_event event) | |||
559 | break; | 559 | break; |
560 | 560 | ||
561 | default: | 561 | default: |
562 | bfa_assert(0); | 562 | bfa_sm_fault(itnim->bfa, event); |
563 | } | 563 | } |
564 | } | 564 | } |
565 | 565 | ||
@@ -583,7 +583,7 @@ bfa_itnim_sm_deleting_qfull(struct bfa_itnim_s *itnim, | |||
583 | break; | 583 | break; |
584 | 584 | ||
585 | default: | 585 | default: |
586 | bfa_assert(0); | 586 | bfa_sm_fault(itnim->bfa, event); |
587 | } | 587 | } |
588 | } | 588 | } |
589 | 589 | ||
diff --git a/drivers/scsi/bfa/bfa_lps.c b/drivers/scsi/bfa/bfa_lps.c index 9844b45412b6..ad06f6189092 100644 --- a/drivers/scsi/bfa/bfa_lps.c +++ b/drivers/scsi/bfa/bfa_lps.c | |||
@@ -18,6 +18,7 @@ | |||
18 | #include <bfa.h> | 18 | #include <bfa.h> |
19 | #include <bfi/bfi_lps.h> | 19 | #include <bfi/bfi_lps.h> |
20 | #include <cs/bfa_debug.h> | 20 | #include <cs/bfa_debug.h> |
21 | #include <defs/bfa_defs_pci.h> | ||
21 | 22 | ||
22 | BFA_TRC_FILE(HAL, LPS); | 23 | BFA_TRC_FILE(HAL, LPS); |
23 | BFA_MODULE(lps); | 24 | BFA_MODULE(lps); |
@@ -25,6 +26,12 @@ BFA_MODULE(lps); | |||
25 | #define BFA_LPS_MIN_LPORTS (1) | 26 | #define BFA_LPS_MIN_LPORTS (1) |
26 | #define BFA_LPS_MAX_LPORTS (256) | 27 | #define BFA_LPS_MAX_LPORTS (256) |
27 | 28 | ||
29 | /* | ||
30 | * Maximum Vports supported per physical port or vf. | ||
31 | */ | ||
32 | #define BFA_LPS_MAX_VPORTS_SUPP_CB 255 | ||
33 | #define BFA_LPS_MAX_VPORTS_SUPP_CT 190 | ||
34 | |||
28 | /** | 35 | /** |
29 | * forward declarations | 36 | * forward declarations |
30 | */ | 37 | */ |
@@ -49,7 +56,7 @@ static void bfa_lps_send_login(struct bfa_lps_s *lps); | |||
49 | static void bfa_lps_send_logout(struct bfa_lps_s *lps); | 56 | static void bfa_lps_send_logout(struct bfa_lps_s *lps); |
50 | static void bfa_lps_login_comp(struct bfa_lps_s *lps); | 57 | static void bfa_lps_login_comp(struct bfa_lps_s *lps); |
51 | static void bfa_lps_logout_comp(struct bfa_lps_s *lps); | 58 | static void bfa_lps_logout_comp(struct bfa_lps_s *lps); |
52 | 59 | static void bfa_lps_cvl_event(struct bfa_lps_s *lps); | |
53 | 60 | ||
54 | /** | 61 | /** |
55 | * lps_pvt BFA LPS private functions | 62 | * lps_pvt BFA LPS private functions |
@@ -62,6 +69,7 @@ enum bfa_lps_event { | |||
62 | BFA_LPS_SM_RESUME = 4, /* space present in reqq queue */ | 69 | BFA_LPS_SM_RESUME = 4, /* space present in reqq queue */ |
63 | BFA_LPS_SM_DELETE = 5, /* lps delete from user */ | 70 | BFA_LPS_SM_DELETE = 5, /* lps delete from user */ |
64 | BFA_LPS_SM_OFFLINE = 6, /* Link is offline */ | 71 | BFA_LPS_SM_OFFLINE = 6, /* Link is offline */ |
72 | BFA_LPS_SM_RX_CVL = 7, /* Rx clear virtual link */ | ||
65 | }; | 73 | }; |
66 | 74 | ||
67 | static void bfa_lps_sm_init(struct bfa_lps_s *lps, enum bfa_lps_event event); | 75 | static void bfa_lps_sm_init(struct bfa_lps_s *lps, enum bfa_lps_event event); |
@@ -91,6 +99,12 @@ bfa_lps_sm_init(struct bfa_lps_s *lps, enum bfa_lps_event event) | |||
91 | bfa_sm_set_state(lps, bfa_lps_sm_login); | 99 | bfa_sm_set_state(lps, bfa_lps_sm_login); |
92 | bfa_lps_send_login(lps); | 100 | bfa_lps_send_login(lps); |
93 | } | 101 | } |
102 | if (lps->fdisc) | ||
103 | bfa_plog_str(lps->bfa->plog, BFA_PL_MID_LPS, | ||
104 | BFA_PL_EID_LOGIN, 0, "FDISC Request"); | ||
105 | else | ||
106 | bfa_plog_str(lps->bfa->plog, BFA_PL_MID_LPS, | ||
107 | BFA_PL_EID_LOGIN, 0, "FLOGI Request"); | ||
94 | break; | 108 | break; |
95 | 109 | ||
96 | case BFA_LPS_SM_LOGOUT: | 110 | case BFA_LPS_SM_LOGOUT: |
@@ -101,6 +115,7 @@ bfa_lps_sm_init(struct bfa_lps_s *lps, enum bfa_lps_event event) | |||
101 | bfa_lps_free(lps); | 115 | bfa_lps_free(lps); |
102 | break; | 116 | break; |
103 | 117 | ||
118 | case BFA_LPS_SM_RX_CVL: | ||
104 | case BFA_LPS_SM_OFFLINE: | 119 | case BFA_LPS_SM_OFFLINE: |
105 | break; | 120 | break; |
106 | 121 | ||
@@ -112,7 +127,7 @@ bfa_lps_sm_init(struct bfa_lps_s *lps, enum bfa_lps_event event) | |||
112 | break; | 127 | break; |
113 | 128 | ||
114 | default: | 129 | default: |
115 | bfa_assert(0); | 130 | bfa_sm_fault(lps->bfa, event); |
116 | } | 131 | } |
117 | } | 132 | } |
118 | 133 | ||
@@ -127,10 +142,25 @@ bfa_lps_sm_login(struct bfa_lps_s *lps, enum bfa_lps_event event) | |||
127 | 142 | ||
128 | switch (event) { | 143 | switch (event) { |
129 | case BFA_LPS_SM_FWRSP: | 144 | case BFA_LPS_SM_FWRSP: |
130 | if (lps->status == BFA_STATUS_OK) | 145 | if (lps->status == BFA_STATUS_OK) { |
131 | bfa_sm_set_state(lps, bfa_lps_sm_online); | 146 | bfa_sm_set_state(lps, bfa_lps_sm_online); |
132 | else | 147 | if (lps->fdisc) |
148 | bfa_plog_str(lps->bfa->plog, BFA_PL_MID_LPS, | ||
149 | BFA_PL_EID_LOGIN, 0, "FDISC Accept"); | ||
150 | else | ||
151 | bfa_plog_str(lps->bfa->plog, BFA_PL_MID_LPS, | ||
152 | BFA_PL_EID_LOGIN, 0, "FLOGI Accept"); | ||
153 | } else { | ||
133 | bfa_sm_set_state(lps, bfa_lps_sm_init); | 154 | bfa_sm_set_state(lps, bfa_lps_sm_init); |
155 | if (lps->fdisc) | ||
156 | bfa_plog_str(lps->bfa->plog, BFA_PL_MID_LPS, | ||
157 | BFA_PL_EID_LOGIN, 0, | ||
158 | "FDISC Fail (RJT or timeout)"); | ||
159 | else | ||
160 | bfa_plog_str(lps->bfa->plog, BFA_PL_MID_LPS, | ||
161 | BFA_PL_EID_LOGIN, 0, | ||
162 | "FLOGI Fail (RJT or timeout)"); | ||
163 | } | ||
134 | bfa_lps_login_comp(lps); | 164 | bfa_lps_login_comp(lps); |
135 | break; | 165 | break; |
136 | 166 | ||
@@ -139,7 +169,7 @@ bfa_lps_sm_login(struct bfa_lps_s *lps, enum bfa_lps_event event) | |||
139 | break; | 169 | break; |
140 | 170 | ||
141 | default: | 171 | default: |
142 | bfa_assert(0); | 172 | bfa_sm_fault(lps->bfa, event); |
143 | } | 173 | } |
144 | } | 174 | } |
145 | 175 | ||
@@ -162,8 +192,16 @@ bfa_lps_sm_loginwait(struct bfa_lps_s *lps, enum bfa_lps_event event) | |||
162 | bfa_reqq_wcancel(&lps->wqe); | 192 | bfa_reqq_wcancel(&lps->wqe); |
163 | break; | 193 | break; |
164 | 194 | ||
195 | case BFA_LPS_SM_RX_CVL: | ||
196 | /* | ||
197 | * Login was not even sent out; so when getting out | ||
198 | * of this state, it will appear like a login retry | ||
199 | * after Clear virtual link | ||
200 | */ | ||
201 | break; | ||
202 | |||
165 | default: | 203 | default: |
166 | bfa_assert(0); | 204 | bfa_sm_fault(lps->bfa, event); |
167 | } | 205 | } |
168 | } | 206 | } |
169 | 207 | ||
@@ -185,6 +223,17 @@ bfa_lps_sm_online(struct bfa_lps_s *lps, enum bfa_lps_event event) | |||
185 | bfa_sm_set_state(lps, bfa_lps_sm_logout); | 223 | bfa_sm_set_state(lps, bfa_lps_sm_logout); |
186 | bfa_lps_send_logout(lps); | 224 | bfa_lps_send_logout(lps); |
187 | } | 225 | } |
226 | bfa_plog_str(lps->bfa->plog, BFA_PL_MID_LPS, | ||
227 | BFA_PL_EID_LOGO, 0, "Logout"); | ||
228 | break; | ||
229 | |||
230 | case BFA_LPS_SM_RX_CVL: | ||
231 | bfa_sm_set_state(lps, bfa_lps_sm_init); | ||
232 | |||
233 | /* Let the vport module know about this event */ | ||
234 | bfa_lps_cvl_event(lps); | ||
235 | bfa_plog_str(lps->bfa->plog, BFA_PL_MID_LPS, | ||
236 | BFA_PL_EID_FIP_FCF_CVL, 0, "FCF Clear Virt. Link Rx"); | ||
188 | break; | 237 | break; |
189 | 238 | ||
190 | case BFA_LPS_SM_OFFLINE: | 239 | case BFA_LPS_SM_OFFLINE: |
@@ -193,7 +242,7 @@ bfa_lps_sm_online(struct bfa_lps_s *lps, enum bfa_lps_event event) | |||
193 | break; | 242 | break; |
194 | 243 | ||
195 | default: | 244 | default: |
196 | bfa_assert(0); | 245 | bfa_sm_fault(lps->bfa, event); |
197 | } | 246 | } |
198 | } | 247 | } |
199 | 248 | ||
@@ -217,7 +266,7 @@ bfa_lps_sm_logout(struct bfa_lps_s *lps, enum bfa_lps_event event) | |||
217 | break; | 266 | break; |
218 | 267 | ||
219 | default: | 268 | default: |
220 | bfa_assert(0); | 269 | bfa_sm_fault(lps->bfa, event); |
221 | } | 270 | } |
222 | } | 271 | } |
223 | 272 | ||
@@ -242,7 +291,7 @@ bfa_lps_sm_logowait(struct bfa_lps_s *lps, enum bfa_lps_event event) | |||
242 | break; | 291 | break; |
243 | 292 | ||
244 | default: | 293 | default: |
245 | bfa_assert(0); | 294 | bfa_sm_fault(lps->bfa, event); |
246 | } | 295 | } |
247 | } | 296 | } |
248 | 297 | ||
@@ -396,6 +445,20 @@ bfa_lps_logout_rsp(struct bfa_s *bfa, struct bfi_lps_logout_rsp_s *rsp) | |||
396 | } | 445 | } |
397 | 446 | ||
398 | /** | 447 | /** |
448 | * Firmware received a Clear virtual link request (for FCoE) | ||
449 | */ | ||
450 | static void | ||
451 | bfa_lps_rx_cvl_event(struct bfa_s *bfa, struct bfi_lps_cvl_event_s *cvl) | ||
452 | { | ||
453 | struct bfa_lps_mod_s *mod = BFA_LPS_MOD(bfa); | ||
454 | struct bfa_lps_s *lps; | ||
455 | |||
456 | lps = BFA_LPS_FROM_TAG(mod, cvl->lp_tag); | ||
457 | |||
458 | bfa_sm_send_event(lps, BFA_LPS_SM_RX_CVL); | ||
459 | } | ||
460 | |||
461 | /** | ||
399 | * Space is available in request queue, resume queueing request to firmware. | 462 | * Space is available in request queue, resume queueing request to firmware. |
400 | */ | 463 | */ |
401 | static void | 464 | static void |
@@ -531,7 +594,48 @@ bfa_lps_logout_comp(struct bfa_lps_s *lps) | |||
531 | bfa_cb_lps_flogo_comp(lps->bfa->bfad, lps->uarg); | 594 | bfa_cb_lps_flogo_comp(lps->bfa->bfad, lps->uarg); |
532 | } | 595 | } |
533 | 596 | ||
597 | /** | ||
598 | * Clear virtual link completion handler for non-fcs | ||
599 | */ | ||
600 | static void | ||
601 | bfa_lps_cvl_event_cb(void *arg, bfa_boolean_t complete) | ||
602 | { | ||
603 | struct bfa_lps_s *lps = arg; | ||
604 | |||
605 | if (!complete) | ||
606 | return; | ||
607 | |||
608 | /* Clear virtual link to base port will result in link down */ | ||
609 | if (lps->fdisc) | ||
610 | bfa_cb_lps_cvl_event(lps->bfa->bfad, lps->uarg); | ||
611 | } | ||
612 | |||
613 | /** | ||
614 | * Received Clear virtual link event --direct call for fcs, | ||
615 | * queue for others | ||
616 | */ | ||
617 | static void | ||
618 | bfa_lps_cvl_event(struct bfa_lps_s *lps) | ||
619 | { | ||
620 | if (!lps->bfa->fcs) { | ||
621 | bfa_cb_queue(lps->bfa, &lps->hcb_qe, bfa_lps_cvl_event_cb, | ||
622 | lps); | ||
623 | return; | ||
624 | } | ||
625 | |||
626 | /* Clear virtual link to base port will result in link down */ | ||
627 | if (lps->fdisc) | ||
628 | bfa_cb_lps_cvl_event(lps->bfa->bfad, lps->uarg); | ||
629 | } | ||
534 | 630 | ||
631 | u32 | ||
632 | bfa_lps_get_max_vport(struct bfa_s *bfa) | ||
633 | { | ||
634 | if (bfa_ioc_devid(&bfa->ioc) == BFA_PCI_DEVICE_ID_CT) | ||
635 | return BFA_LPS_MAX_VPORTS_SUPP_CT; | ||
636 | else | ||
637 | return BFA_LPS_MAX_VPORTS_SUPP_CB; | ||
638 | } | ||
535 | 639 | ||
536 | /** | 640 | /** |
537 | * lps_public BFA LPS public functions | 641 | * lps_public BFA LPS public functions |
@@ -752,6 +856,14 @@ bfa_lps_get_lsrjt_expl(struct bfa_lps_s *lps) | |||
752 | return lps->lsrjt_expl; | 856 | return lps->lsrjt_expl; |
753 | } | 857 | } |
754 | 858 | ||
859 | /** | ||
860 | * Return fpma/spma MAC for lport | ||
861 | */ | ||
862 | struct mac_s | ||
863 | bfa_lps_get_lp_mac(struct bfa_lps_s *lps) | ||
864 | { | ||
865 | return lps->lp_mac; | ||
866 | } | ||
755 | 867 | ||
756 | /** | 868 | /** |
757 | * LPS firmware message class handler. | 869 | * LPS firmware message class handler. |
@@ -773,6 +885,10 @@ bfa_lps_isr(struct bfa_s *bfa, struct bfi_msg_s *m) | |||
773 | bfa_lps_logout_rsp(bfa, msg.logout_rsp); | 885 | bfa_lps_logout_rsp(bfa, msg.logout_rsp); |
774 | break; | 886 | break; |
775 | 887 | ||
888 | case BFI_LPS_H2I_CVL_EVENT: | ||
889 | bfa_lps_rx_cvl_event(bfa, msg.cvl_event); | ||
890 | break; | ||
891 | |||
776 | default: | 892 | default: |
777 | bfa_trc(bfa, m->mhdr.msg_id); | 893 | bfa_trc(bfa, m->mhdr.msg_id); |
778 | bfa_assert(0); | 894 | bfa_assert(0); |
diff --git a/drivers/scsi/bfa/bfa_module.c b/drivers/scsi/bfa/bfa_module.c index 32eda8e1ec65..a7fcc80c177e 100644 --- a/drivers/scsi/bfa/bfa_module.c +++ b/drivers/scsi/bfa/bfa_module.c | |||
@@ -24,7 +24,7 @@ | |||
24 | */ | 24 | */ |
25 | struct bfa_module_s *hal_mods[] = { | 25 | struct bfa_module_s *hal_mods[] = { |
26 | &hal_mod_sgpg, | 26 | &hal_mod_sgpg, |
27 | &hal_mod_pport, | 27 | &hal_mod_fcport, |
28 | &hal_mod_fcxp, | 28 | &hal_mod_fcxp, |
29 | &hal_mod_lps, | 29 | &hal_mod_lps, |
30 | &hal_mod_uf, | 30 | &hal_mod_uf, |
@@ -45,7 +45,7 @@ bfa_isr_func_t bfa_isrs[BFI_MC_MAX] = { | |||
45 | bfa_isr_unhandled, /* BFI_MC_DIAG */ | 45 | bfa_isr_unhandled, /* BFI_MC_DIAG */ |
46 | bfa_isr_unhandled, /* BFI_MC_FLASH */ | 46 | bfa_isr_unhandled, /* BFI_MC_FLASH */ |
47 | bfa_isr_unhandled, /* BFI_MC_CEE */ | 47 | bfa_isr_unhandled, /* BFI_MC_CEE */ |
48 | bfa_pport_isr, /* BFI_MC_PORT */ | 48 | bfa_fcport_isr, /* BFI_MC_FCPORT */ |
49 | bfa_isr_unhandled, /* BFI_MC_IOCFC */ | 49 | bfa_isr_unhandled, /* BFI_MC_IOCFC */ |
50 | bfa_isr_unhandled, /* BFI_MC_LL */ | 50 | bfa_isr_unhandled, /* BFI_MC_LL */ |
51 | bfa_uf_isr, /* BFI_MC_UF */ | 51 | bfa_uf_isr, /* BFI_MC_UF */ |
diff --git a/drivers/scsi/bfa/bfa_modules_priv.h b/drivers/scsi/bfa/bfa_modules_priv.h index 96f70534593c..f554c2fad6a9 100644 --- a/drivers/scsi/bfa/bfa_modules_priv.h +++ b/drivers/scsi/bfa/bfa_modules_priv.h | |||
@@ -29,7 +29,7 @@ | |||
29 | 29 | ||
30 | 30 | ||
31 | struct bfa_modules_s { | 31 | struct bfa_modules_s { |
32 | struct bfa_pport_s pport; /* physical port module */ | 32 | struct bfa_fcport_s fcport; /* fc port module */ |
33 | struct bfa_fcxp_mod_s fcxp_mod; /* fcxp module */ | 33 | struct bfa_fcxp_mod_s fcxp_mod; /* fcxp module */ |
34 | struct bfa_lps_mod_s lps_mod; /* fcxp module */ | 34 | struct bfa_lps_mod_s lps_mod; /* fcxp module */ |
35 | struct bfa_uf_mod_s uf_mod; /* unsolicited frame module */ | 35 | struct bfa_uf_mod_s uf_mod; /* unsolicited frame module */ |
diff --git a/drivers/scsi/bfa/bfa_port_priv.h b/drivers/scsi/bfa/bfa_port_priv.h index 51f698a06b6d..40e256ec67ff 100644 --- a/drivers/scsi/bfa/bfa_port_priv.h +++ b/drivers/scsi/bfa/bfa_port_priv.h | |||
@@ -23,9 +23,19 @@ | |||
23 | #include "bfa_intr_priv.h" | 23 | #include "bfa_intr_priv.h" |
24 | 24 | ||
25 | /** | 25 | /** |
26 | * BFA physical port data structure | 26 | * Link notification data structure |
27 | */ | 27 | */ |
28 | struct bfa_pport_s { | 28 | struct bfa_fcport_ln_s { |
29 | struct bfa_fcport_s *fcport; | ||
30 | bfa_sm_t sm; | ||
31 | struct bfa_cb_qe_s ln_qe; /* BFA callback queue elem for ln */ | ||
32 | enum bfa_pport_linkstate ln_event; /* ln event for callback */ | ||
33 | }; | ||
34 | |||
35 | /** | ||
36 | * BFA FC port data structure | ||
37 | */ | ||
38 | struct bfa_fcport_s { | ||
29 | struct bfa_s *bfa; /* parent BFA instance */ | 39 | struct bfa_s *bfa; /* parent BFA instance */ |
30 | bfa_sm_t sm; /* port state machine */ | 40 | bfa_sm_t sm; /* port state machine */ |
31 | wwn_t nwwn; /* node wwn of physical port */ | 41 | wwn_t nwwn; /* node wwn of physical port */ |
@@ -36,6 +46,8 @@ struct bfa_pport_s { | |||
36 | enum bfa_pport_topology topology; /* current topology */ | 46 | enum bfa_pport_topology topology; /* current topology */ |
37 | u8 myalpa; /* my ALPA in LOOP topology */ | 47 | u8 myalpa; /* my ALPA in LOOP topology */ |
38 | u8 rsvd[3]; | 48 | u8 rsvd[3]; |
49 | u32 mypid:24; | ||
50 | u32 rsvd_b:8; | ||
39 | struct bfa_pport_cfg_s cfg; /* current port configuration */ | 51 | struct bfa_pport_cfg_s cfg; /* current port configuration */ |
40 | struct bfa_qos_attr_s qos_attr; /* QoS Attributes */ | 52 | struct bfa_qos_attr_s qos_attr; /* QoS Attributes */ |
41 | struct bfa_qos_vc_attr_s qos_vc_attr; /* VC info from ELP */ | 53 | struct bfa_qos_vc_attr_s qos_vc_attr; /* VC info from ELP */ |
@@ -49,42 +61,31 @@ struct bfa_pport_s { | |||
49 | void (*event_cbfn) (void *cbarg, | 61 | void (*event_cbfn) (void *cbarg, |
50 | bfa_pport_event_t event); | 62 | bfa_pport_event_t event); |
51 | union { | 63 | union { |
52 | union bfi_pport_i2h_msg_u i2hmsg; | 64 | union bfi_fcport_i2h_msg_u i2hmsg; |
53 | } event_arg; | 65 | } event_arg; |
54 | void *bfad; /* BFA driver handle */ | 66 | void *bfad; /* BFA driver handle */ |
67 | struct bfa_fcport_ln_s ln; /* Link Notification */ | ||
55 | struct bfa_cb_qe_s hcb_qe; /* BFA callback queue elem */ | 68 | struct bfa_cb_qe_s hcb_qe; /* BFA callback queue elem */ |
56 | enum bfa_pport_linkstate hcb_event; | 69 | struct bfa_timer_s timer; /* timer */ |
57 | /* link event for callback */ | ||
58 | u32 msgtag; /* fimrware msg tag for reply */ | 70 | u32 msgtag; /* fimrware msg tag for reply */ |
59 | u8 *stats_kva; | 71 | u8 *stats_kva; |
60 | u64 stats_pa; | 72 | u64 stats_pa; |
61 | union bfa_pport_stats_u *stats; /* pport stats */ | 73 | union bfa_fcport_stats_u *stats; |
62 | u32 mypid:24; | 74 | union bfa_fcport_stats_u *stats_ret; /* driver stats location */ |
63 | u32 rsvd_b:8; | 75 | bfa_status_t stats_status; /* stats/statsclr status */ |
64 | struct bfa_timer_s timer; /* timer */ | 76 | bfa_boolean_t stats_busy; /* outstanding stats/statsclr */ |
65 | union bfa_pport_stats_u *stats_ret; | 77 | bfa_boolean_t stats_qfull; |
66 | /* driver stats location */ | 78 | bfa_cb_pport_t stats_cbfn; /* driver callback function */ |
67 | bfa_status_t stats_status; | 79 | void *stats_cbarg; /* *!< user callback arg */ |
68 | /* stats/statsclr status */ | 80 | bfa_boolean_t diag_busy; /* diag busy status */ |
69 | bfa_boolean_t stats_busy; | 81 | bfa_boolean_t beacon; /* port beacon status */ |
70 | /* outstanding stats/statsclr */ | 82 | bfa_boolean_t link_e2e_beacon; /* link beacon status */ |
71 | bfa_boolean_t stats_qfull; | ||
72 | bfa_boolean_t diag_busy; | ||
73 | /* diag busy status */ | ||
74 | bfa_boolean_t beacon; | ||
75 | /* port beacon status */ | ||
76 | bfa_boolean_t link_e2e_beacon; | ||
77 | /* link beacon status */ | ||
78 | bfa_cb_pport_t stats_cbfn; | ||
79 | /* driver callback function */ | ||
80 | void *stats_cbarg; | ||
81 | /* *!< user callback arg */ | ||
82 | }; | 83 | }; |
83 | 84 | ||
84 | #define BFA_PORT_MOD(__bfa) (&(__bfa)->modules.pport) | 85 | #define BFA_FCPORT_MOD(__bfa) (&(__bfa)->modules.fcport) |
85 | 86 | ||
86 | /* | 87 | /* |
87 | * public functions | 88 | * public functions |
88 | */ | 89 | */ |
89 | void bfa_pport_isr(struct bfa_s *bfa, struct bfi_msg_s *msg); | 90 | void bfa_fcport_isr(struct bfa_s *bfa, struct bfi_msg_s *msg); |
90 | #endif /* __BFA_PORT_PRIV_H__ */ | 91 | #endif /* __BFA_PORT_PRIV_H__ */ |
diff --git a/drivers/scsi/bfa/bfa_priv.h b/drivers/scsi/bfa/bfa_priv.h index 0747a6b26f7b..be80fc7e1b0e 100644 --- a/drivers/scsi/bfa/bfa_priv.h +++ b/drivers/scsi/bfa/bfa_priv.h | |||
@@ -101,7 +101,7 @@ extern bfa_boolean_t bfa_auto_recover; | |||
101 | extern struct bfa_module_s hal_mod_flash; | 101 | extern struct bfa_module_s hal_mod_flash; |
102 | extern struct bfa_module_s hal_mod_fcdiag; | 102 | extern struct bfa_module_s hal_mod_fcdiag; |
103 | extern struct bfa_module_s hal_mod_sgpg; | 103 | extern struct bfa_module_s hal_mod_sgpg; |
104 | extern struct bfa_module_s hal_mod_pport; | 104 | extern struct bfa_module_s hal_mod_fcport; |
105 | extern struct bfa_module_s hal_mod_fcxp; | 105 | extern struct bfa_module_s hal_mod_fcxp; |
106 | extern struct bfa_module_s hal_mod_lps; | 106 | extern struct bfa_module_s hal_mod_lps; |
107 | extern struct bfa_module_s hal_mod_uf; | 107 | extern struct bfa_module_s hal_mod_uf; |
diff --git a/drivers/scsi/bfa/bfa_rport.c b/drivers/scsi/bfa/bfa_rport.c index 3e1990a74258..7c509fa244e4 100644 --- a/drivers/scsi/bfa/bfa_rport.c +++ b/drivers/scsi/bfa/bfa_rport.c | |||
@@ -114,7 +114,7 @@ bfa_rport_sm_uninit(struct bfa_rport_s *rp, enum bfa_rport_event event) | |||
114 | 114 | ||
115 | default: | 115 | default: |
116 | bfa_stats(rp, sm_un_unexp); | 116 | bfa_stats(rp, sm_un_unexp); |
117 | bfa_assert(0); | 117 | bfa_sm_fault(rp->bfa, event); |
118 | } | 118 | } |
119 | } | 119 | } |
120 | 120 | ||
@@ -146,7 +146,7 @@ bfa_rport_sm_created(struct bfa_rport_s *rp, enum bfa_rport_event event) | |||
146 | 146 | ||
147 | default: | 147 | default: |
148 | bfa_stats(rp, sm_cr_unexp); | 148 | bfa_stats(rp, sm_cr_unexp); |
149 | bfa_assert(0); | 149 | bfa_sm_fault(rp->bfa, event); |
150 | } | 150 | } |
151 | } | 151 | } |
152 | 152 | ||
@@ -183,7 +183,7 @@ bfa_rport_sm_fwcreate(struct bfa_rport_s *rp, enum bfa_rport_event event) | |||
183 | 183 | ||
184 | default: | 184 | default: |
185 | bfa_stats(rp, sm_fwc_unexp); | 185 | bfa_stats(rp, sm_fwc_unexp); |
186 | bfa_assert(0); | 186 | bfa_sm_fault(rp->bfa, event); |
187 | } | 187 | } |
188 | } | 188 | } |
189 | 189 | ||
@@ -224,7 +224,7 @@ bfa_rport_sm_fwcreate_qfull(struct bfa_rport_s *rp, enum bfa_rport_event event) | |||
224 | 224 | ||
225 | default: | 225 | default: |
226 | bfa_stats(rp, sm_fwc_unexp); | 226 | bfa_stats(rp, sm_fwc_unexp); |
227 | bfa_assert(0); | 227 | bfa_sm_fault(rp->bfa, event); |
228 | } | 228 | } |
229 | } | 229 | } |
230 | 230 | ||
@@ -296,7 +296,7 @@ bfa_rport_sm_online(struct bfa_rport_s *rp, enum bfa_rport_event event) | |||
296 | 296 | ||
297 | default: | 297 | default: |
298 | bfa_stats(rp, sm_on_unexp); | 298 | bfa_stats(rp, sm_on_unexp); |
299 | bfa_assert(0); | 299 | bfa_sm_fault(rp->bfa, event); |
300 | } | 300 | } |
301 | } | 301 | } |
302 | 302 | ||
@@ -329,7 +329,7 @@ bfa_rport_sm_fwdelete(struct bfa_rport_s *rp, enum bfa_rport_event event) | |||
329 | 329 | ||
330 | default: | 330 | default: |
331 | bfa_stats(rp, sm_fwd_unexp); | 331 | bfa_stats(rp, sm_fwd_unexp); |
332 | bfa_assert(0); | 332 | bfa_sm_fault(rp->bfa, event); |
333 | } | 333 | } |
334 | } | 334 | } |
335 | 335 | ||
@@ -359,7 +359,7 @@ bfa_rport_sm_fwdelete_qfull(struct bfa_rport_s *rp, enum bfa_rport_event event) | |||
359 | 359 | ||
360 | default: | 360 | default: |
361 | bfa_stats(rp, sm_fwd_unexp); | 361 | bfa_stats(rp, sm_fwd_unexp); |
362 | bfa_assert(0); | 362 | bfa_sm_fault(rp->bfa, event); |
363 | } | 363 | } |
364 | } | 364 | } |
365 | 365 | ||
@@ -394,7 +394,7 @@ bfa_rport_sm_offline(struct bfa_rport_s *rp, enum bfa_rport_event event) | |||
394 | 394 | ||
395 | default: | 395 | default: |
396 | bfa_stats(rp, sm_off_unexp); | 396 | bfa_stats(rp, sm_off_unexp); |
397 | bfa_assert(0); | 397 | bfa_sm_fault(rp->bfa, event); |
398 | } | 398 | } |
399 | } | 399 | } |
400 | 400 | ||
@@ -421,7 +421,7 @@ bfa_rport_sm_deleting(struct bfa_rport_s *rp, enum bfa_rport_event event) | |||
421 | break; | 421 | break; |
422 | 422 | ||
423 | default: | 423 | default: |
424 | bfa_assert(0); | 424 | bfa_sm_fault(rp->bfa, event); |
425 | } | 425 | } |
426 | } | 426 | } |
427 | 427 | ||
@@ -446,7 +446,7 @@ bfa_rport_sm_deleting_qfull(struct bfa_rport_s *rp, enum bfa_rport_event event) | |||
446 | break; | 446 | break; |
447 | 447 | ||
448 | default: | 448 | default: |
449 | bfa_assert(0); | 449 | bfa_sm_fault(rp->bfa, event); |
450 | } | 450 | } |
451 | } | 451 | } |
452 | 452 | ||
@@ -477,7 +477,7 @@ bfa_rport_sm_delete_pending(struct bfa_rport_s *rp, | |||
477 | 477 | ||
478 | default: | 478 | default: |
479 | bfa_stats(rp, sm_delp_unexp); | 479 | bfa_stats(rp, sm_delp_unexp); |
480 | bfa_assert(0); | 480 | bfa_sm_fault(rp->bfa, event); |
481 | } | 481 | } |
482 | } | 482 | } |
483 | 483 | ||
@@ -512,7 +512,7 @@ bfa_rport_sm_offline_pending(struct bfa_rport_s *rp, | |||
512 | 512 | ||
513 | default: | 513 | default: |
514 | bfa_stats(rp, sm_offp_unexp); | 514 | bfa_stats(rp, sm_offp_unexp); |
515 | bfa_assert(0); | 515 | bfa_sm_fault(rp->bfa, event); |
516 | } | 516 | } |
517 | } | 517 | } |
518 | 518 | ||
@@ -550,7 +550,7 @@ bfa_rport_sm_iocdisable(struct bfa_rport_s *rp, enum bfa_rport_event event) | |||
550 | 550 | ||
551 | default: | 551 | default: |
552 | bfa_stats(rp, sm_iocd_unexp); | 552 | bfa_stats(rp, sm_iocd_unexp); |
553 | bfa_assert(0); | 553 | bfa_sm_fault(rp->bfa, event); |
554 | } | 554 | } |
555 | } | 555 | } |
556 | 556 | ||
diff --git a/drivers/scsi/bfa/bfa_trcmod_priv.h b/drivers/scsi/bfa/bfa_trcmod_priv.h index b3562dce7e9f..a7a82610db85 100644 --- a/drivers/scsi/bfa/bfa_trcmod_priv.h +++ b/drivers/scsi/bfa/bfa_trcmod_priv.h | |||
@@ -29,38 +29,36 @@ | |||
29 | * !!! needed between trace utility and driver version | 29 | * !!! needed between trace utility and driver version |
30 | */ | 30 | */ |
31 | enum { | 31 | enum { |
32 | BFA_TRC_HAL_IOC = 1, | 32 | BFA_TRC_HAL_INTR = 1, |
33 | BFA_TRC_HAL_INTR = 2, | 33 | BFA_TRC_HAL_FCXP = 2, |
34 | BFA_TRC_HAL_FCXP = 3, | 34 | BFA_TRC_HAL_UF = 3, |
35 | BFA_TRC_HAL_UF = 4, | 35 | BFA_TRC_HAL_RPORT = 4, |
36 | BFA_TRC_HAL_DIAG = 5, | 36 | BFA_TRC_HAL_FCPIM = 5, |
37 | BFA_TRC_HAL_RPORT = 6, | 37 | BFA_TRC_HAL_IOIM = 6, |
38 | BFA_TRC_HAL_FCPIM = 7, | 38 | BFA_TRC_HAL_TSKIM = 7, |
39 | BFA_TRC_HAL_IOIM = 8, | 39 | BFA_TRC_HAL_ITNIM = 8, |
40 | BFA_TRC_HAL_TSKIM = 9, | 40 | BFA_TRC_HAL_FCPORT = 9, |
41 | BFA_TRC_HAL_ITNIM = 10, | 41 | BFA_TRC_HAL_SGPG = 10, |
42 | BFA_TRC_HAL_PPORT = 11, | 42 | BFA_TRC_HAL_FLASH = 11, |
43 | BFA_TRC_HAL_SGPG = 12, | 43 | BFA_TRC_HAL_DEBUG = 12, |
44 | BFA_TRC_HAL_FLASH = 13, | 44 | BFA_TRC_HAL_WWN = 13, |
45 | BFA_TRC_HAL_DEBUG = 14, | 45 | BFA_TRC_HAL_FLASH_RAW = 14, |
46 | BFA_TRC_HAL_WWN = 15, | 46 | BFA_TRC_HAL_SBOOT = 15, |
47 | BFA_TRC_HAL_FLASH_RAW = 16, | 47 | BFA_TRC_HAL_SBOOT_IO = 16, |
48 | BFA_TRC_HAL_SBOOT = 17, | 48 | BFA_TRC_HAL_SBOOT_INTR = 17, |
49 | BFA_TRC_HAL_SBOOT_IO = 18, | 49 | BFA_TRC_HAL_SBTEST = 18, |
50 | BFA_TRC_HAL_SBOOT_INTR = 19, | 50 | BFA_TRC_HAL_IPFC = 19, |
51 | BFA_TRC_HAL_SBTEST = 20, | 51 | BFA_TRC_HAL_IOCFC = 20, |
52 | BFA_TRC_HAL_IPFC = 21, | 52 | BFA_TRC_HAL_FCPTM = 21, |
53 | BFA_TRC_HAL_IOCFC = 22, | 53 | BFA_TRC_HAL_IOTM = 22, |
54 | BFA_TRC_HAL_FCPTM = 23, | 54 | BFA_TRC_HAL_TSKTM = 23, |
55 | BFA_TRC_HAL_IOTM = 24, | 55 | BFA_TRC_HAL_TIN = 24, |
56 | BFA_TRC_HAL_TSKTM = 25, | 56 | BFA_TRC_HAL_LPS = 25, |
57 | BFA_TRC_HAL_TIN = 26, | 57 | BFA_TRC_HAL_FCDIAG = 26, |
58 | BFA_TRC_HAL_LPS = 27, | 58 | BFA_TRC_HAL_PBIND = 27, |
59 | BFA_TRC_HAL_FCDIAG = 28, | 59 | BFA_TRC_HAL_IOCFC_CT = 28, |
60 | BFA_TRC_HAL_PBIND = 29, | 60 | BFA_TRC_HAL_IOCFC_CB = 29, |
61 | BFA_TRC_HAL_IOCFC_CT = 30, | 61 | BFA_TRC_HAL_IOCFC_Q = 30, |
62 | BFA_TRC_HAL_IOCFC_CB = 31, | ||
63 | BFA_TRC_HAL_IOCFC_Q = 32, | ||
64 | }; | 62 | }; |
65 | 63 | ||
66 | #endif /* __BFA_TRCMOD_PRIV_H__ */ | 64 | #endif /* __BFA_TRCMOD_PRIV_H__ */ |
diff --git a/drivers/scsi/bfa/bfa_tskim.c b/drivers/scsi/bfa/bfa_tskim.c index ff7a4dc0bf3c..ad9aaaedd3f1 100644 --- a/drivers/scsi/bfa/bfa_tskim.c +++ b/drivers/scsi/bfa/bfa_tskim.c | |||
@@ -110,7 +110,7 @@ bfa_tskim_sm_uninit(struct bfa_tskim_s *tskim, enum bfa_tskim_event event) | |||
110 | break; | 110 | break; |
111 | 111 | ||
112 | default: | 112 | default: |
113 | bfa_assert(0); | 113 | bfa_sm_fault(tskim->bfa, event); |
114 | } | 114 | } |
115 | } | 115 | } |
116 | 116 | ||
@@ -146,7 +146,7 @@ bfa_tskim_sm_active(struct bfa_tskim_s *tskim, enum bfa_tskim_event event) | |||
146 | break; | 146 | break; |
147 | 147 | ||
148 | default: | 148 | default: |
149 | bfa_assert(0); | 149 | bfa_sm_fault(tskim->bfa, event); |
150 | } | 150 | } |
151 | } | 151 | } |
152 | 152 | ||
@@ -178,7 +178,7 @@ bfa_tskim_sm_cleanup(struct bfa_tskim_s *tskim, enum bfa_tskim_event event) | |||
178 | break; | 178 | break; |
179 | 179 | ||
180 | default: | 180 | default: |
181 | bfa_assert(0); | 181 | bfa_sm_fault(tskim->bfa, event); |
182 | } | 182 | } |
183 | } | 183 | } |
184 | 184 | ||
@@ -207,7 +207,7 @@ bfa_tskim_sm_iocleanup(struct bfa_tskim_s *tskim, enum bfa_tskim_event event) | |||
207 | break; | 207 | break; |
208 | 208 | ||
209 | default: | 209 | default: |
210 | bfa_assert(0); | 210 | bfa_sm_fault(tskim->bfa, event); |
211 | } | 211 | } |
212 | } | 212 | } |
213 | 213 | ||
@@ -242,7 +242,7 @@ bfa_tskim_sm_qfull(struct bfa_tskim_s *tskim, enum bfa_tskim_event event) | |||
242 | break; | 242 | break; |
243 | 243 | ||
244 | default: | 244 | default: |
245 | bfa_assert(0); | 245 | bfa_sm_fault(tskim->bfa, event); |
246 | } | 246 | } |
247 | } | 247 | } |
248 | 248 | ||
@@ -277,7 +277,7 @@ bfa_tskim_sm_cleanup_qfull(struct bfa_tskim_s *tskim, | |||
277 | break; | 277 | break; |
278 | 278 | ||
279 | default: | 279 | default: |
280 | bfa_assert(0); | 280 | bfa_sm_fault(tskim->bfa, event); |
281 | } | 281 | } |
282 | } | 282 | } |
283 | 283 | ||
@@ -303,7 +303,7 @@ bfa_tskim_sm_hcb(struct bfa_tskim_s *tskim, enum bfa_tskim_event event) | |||
303 | break; | 303 | break; |
304 | 304 | ||
305 | default: | 305 | default: |
306 | bfa_assert(0); | 306 | bfa_sm_fault(tskim->bfa, event); |
307 | } | 307 | } |
308 | } | 308 | } |
309 | 309 | ||
diff --git a/drivers/scsi/bfa/bfad.c b/drivers/scsi/bfa/bfad.c index b52b773d49d9..6bff08ea4029 100644 --- a/drivers/scsi/bfa/bfad.c +++ b/drivers/scsi/bfa/bfad.c | |||
@@ -20,6 +20,7 @@ | |||
20 | */ | 20 | */ |
21 | 21 | ||
22 | #include <linux/module.h> | 22 | #include <linux/module.h> |
23 | #include <linux/kthread.h> | ||
23 | #include "bfad_drv.h" | 24 | #include "bfad_drv.h" |
24 | #include "bfad_im.h" | 25 | #include "bfad_im.h" |
25 | #include "bfad_tm.h" | 26 | #include "bfad_tm.h" |
@@ -53,6 +54,7 @@ static int log_level = BFA_LOG_WARNING; | |||
53 | static int ioc_auto_recover = BFA_TRUE; | 54 | static int ioc_auto_recover = BFA_TRUE; |
54 | static int ipfc_enable = BFA_FALSE; | 55 | static int ipfc_enable = BFA_FALSE; |
55 | static int ipfc_mtu = -1; | 56 | static int ipfc_mtu = -1; |
57 | static int fdmi_enable = BFA_TRUE; | ||
56 | int bfa_lun_queue_depth = BFAD_LUN_QUEUE_DEPTH; | 58 | int bfa_lun_queue_depth = BFAD_LUN_QUEUE_DEPTH; |
57 | int bfa_linkup_delay = -1; | 59 | int bfa_linkup_delay = -1; |
58 | 60 | ||
@@ -74,6 +76,7 @@ module_param(log_level, int, S_IRUGO | S_IWUSR); | |||
74 | module_param(ioc_auto_recover, int, S_IRUGO | S_IWUSR); | 76 | module_param(ioc_auto_recover, int, S_IRUGO | S_IWUSR); |
75 | module_param(ipfc_enable, int, S_IRUGO | S_IWUSR); | 77 | module_param(ipfc_enable, int, S_IRUGO | S_IWUSR); |
76 | module_param(ipfc_mtu, int, S_IRUGO | S_IWUSR); | 78 | module_param(ipfc_mtu, int, S_IRUGO | S_IWUSR); |
79 | module_param(fdmi_enable, int, S_IRUGO | S_IWUSR); | ||
77 | module_param(bfa_linkup_delay, int, S_IRUGO | S_IWUSR); | 80 | module_param(bfa_linkup_delay, int, S_IRUGO | S_IWUSR); |
78 | 81 | ||
79 | /* | 82 | /* |
@@ -95,6 +98,8 @@ bfad_fc4_probe(struct bfad_s *bfad) | |||
95 | 98 | ||
96 | if (ipfc_enable) | 99 | if (ipfc_enable) |
97 | bfad_ipfc_probe(bfad); | 100 | bfad_ipfc_probe(bfad); |
101 | |||
102 | bfad->bfad_flags |= BFAD_FC4_PROBE_DONE; | ||
98 | ext: | 103 | ext: |
99 | return rc; | 104 | return rc; |
100 | } | 105 | } |
@@ -106,6 +111,7 @@ bfad_fc4_probe_undo(struct bfad_s *bfad) | |||
106 | bfad_tm_probe_undo(bfad); | 111 | bfad_tm_probe_undo(bfad); |
107 | if (ipfc_enable) | 112 | if (ipfc_enable) |
108 | bfad_ipfc_probe_undo(bfad); | 113 | bfad_ipfc_probe_undo(bfad); |
114 | bfad->bfad_flags &= ~BFAD_FC4_PROBE_DONE; | ||
109 | } | 115 | } |
110 | 116 | ||
111 | static void | 117 | static void |
@@ -173,9 +179,19 @@ bfa_cb_init(void *drv, bfa_status_t init_status) | |||
173 | { | 179 | { |
174 | struct bfad_s *bfad = drv; | 180 | struct bfad_s *bfad = drv; |
175 | 181 | ||
176 | if (init_status == BFA_STATUS_OK) | 182 | if (init_status == BFA_STATUS_OK) { |
177 | bfad->bfad_flags |= BFAD_HAL_INIT_DONE; | 183 | bfad->bfad_flags |= BFAD_HAL_INIT_DONE; |
178 | 184 | ||
185 | /* If BFAD_HAL_INIT_FAIL flag is set: | ||
186 | * Wake up the kernel thread to start | ||
187 | * the bfad operations after HAL init done | ||
188 | */ | ||
189 | if ((bfad->bfad_flags & BFAD_HAL_INIT_FAIL)) { | ||
190 | bfad->bfad_flags &= ~BFAD_HAL_INIT_FAIL; | ||
191 | wake_up_process(bfad->bfad_tsk); | ||
192 | } | ||
193 | } | ||
194 | |||
179 | complete(&bfad->comp); | 195 | complete(&bfad->comp); |
180 | } | 196 | } |
181 | 197 | ||
@@ -648,7 +664,7 @@ bfad_fcs_port_cfg(struct bfad_s *bfad) | |||
648 | 664 | ||
649 | sprintf(symname, "%s-%d", BFAD_DRIVER_NAME, bfad->inst_no); | 665 | sprintf(symname, "%s-%d", BFAD_DRIVER_NAME, bfad->inst_no); |
650 | memcpy(port_cfg.sym_name.symname, symname, strlen(symname)); | 666 | memcpy(port_cfg.sym_name.symname, symname, strlen(symname)); |
651 | bfa_pport_get_attr(&bfad->bfa, &attr); | 667 | bfa_fcport_get_attr(&bfad->bfa, &attr); |
652 | port_cfg.nwwn = attr.nwwn; | 668 | port_cfg.nwwn = attr.nwwn; |
653 | port_cfg.pwwn = attr.pwwn; | 669 | port_cfg.pwwn = attr.pwwn; |
654 | 670 | ||
@@ -661,7 +677,6 @@ bfad_drv_init(struct bfad_s *bfad) | |||
661 | bfa_status_t rc; | 677 | bfa_status_t rc; |
662 | unsigned long flags; | 678 | unsigned long flags; |
663 | struct bfa_fcs_driver_info_s driver_info; | 679 | struct bfa_fcs_driver_info_s driver_info; |
664 | int i; | ||
665 | 680 | ||
666 | bfad->cfg_data.rport_del_timeout = rport_del_timeout; | 681 | bfad->cfg_data.rport_del_timeout = rport_del_timeout; |
667 | bfad->cfg_data.lun_queue_depth = bfa_lun_queue_depth; | 682 | bfad->cfg_data.lun_queue_depth = bfa_lun_queue_depth; |
@@ -681,12 +696,7 @@ bfad_drv_init(struct bfad_s *bfad) | |||
681 | bfa_init_log(&bfad->bfa, bfad->logmod); | 696 | bfa_init_log(&bfad->bfa, bfad->logmod); |
682 | bfa_init_trc(&bfad->bfa, bfad->trcmod); | 697 | bfa_init_trc(&bfad->bfa, bfad->trcmod); |
683 | bfa_init_aen(&bfad->bfa, bfad->aen); | 698 | bfa_init_aen(&bfad->bfa, bfad->aen); |
684 | INIT_LIST_HEAD(&bfad->file_q); | 699 | memset(bfad->file_map, 0, sizeof(bfad->file_map)); |
685 | INIT_LIST_HEAD(&bfad->file_free_q); | ||
686 | for (i = 0; i < BFAD_AEN_MAX_APPS; i++) { | ||
687 | bfa_q_qe_init(&bfad->file_buf[i].qe); | ||
688 | list_add_tail(&bfad->file_buf[i].qe, &bfad->file_free_q); | ||
689 | } | ||
690 | bfa_init_plog(&bfad->bfa, &bfad->plog_buf); | 700 | bfa_init_plog(&bfad->bfa, &bfad->plog_buf); |
691 | bfa_plog_init(&bfad->plog_buf); | 701 | bfa_plog_init(&bfad->plog_buf); |
692 | bfa_plog_str(&bfad->plog_buf, BFA_PL_MID_DRVR, BFA_PL_EID_DRIVER_START, | 702 | bfa_plog_str(&bfad->plog_buf, BFA_PL_MID_DRVR, BFA_PL_EID_DRIVER_START, |
@@ -746,8 +756,16 @@ bfad_drv_init(struct bfad_s *bfad) | |||
746 | bfa_fcs_log_init(&bfad->bfa_fcs, bfad->logmod); | 756 | bfa_fcs_log_init(&bfad->bfa_fcs, bfad->logmod); |
747 | bfa_fcs_trc_init(&bfad->bfa_fcs, bfad->trcmod); | 757 | bfa_fcs_trc_init(&bfad->bfa_fcs, bfad->trcmod); |
748 | bfa_fcs_aen_init(&bfad->bfa_fcs, bfad->aen); | 758 | bfa_fcs_aen_init(&bfad->bfa_fcs, bfad->aen); |
749 | bfa_fcs_init(&bfad->bfa_fcs, &bfad->bfa, bfad, BFA_FALSE); | 759 | bfa_fcs_attach(&bfad->bfa_fcs, &bfad->bfa, bfad, BFA_FALSE); |
760 | |||
761 | /* Do FCS init only when HAL init is done */ | ||
762 | if ((bfad->bfad_flags & BFAD_HAL_INIT_DONE)) { | ||
763 | bfa_fcs_init(&bfad->bfa_fcs); | ||
764 | bfad->bfad_flags |= BFAD_FCS_INIT_DONE; | ||
765 | } | ||
766 | |||
750 | bfa_fcs_driver_info_init(&bfad->bfa_fcs, &driver_info); | 767 | bfa_fcs_driver_info_init(&bfad->bfa_fcs, &driver_info); |
768 | bfa_fcs_set_fdmi_param(&bfad->bfa_fcs, fdmi_enable); | ||
751 | spin_unlock_irqrestore(&bfad->bfad_lock, flags); | 769 | spin_unlock_irqrestore(&bfad->bfad_lock, flags); |
752 | 770 | ||
753 | bfad->bfad_flags |= BFAD_DRV_INIT_DONE; | 771 | bfad->bfad_flags |= BFAD_DRV_INIT_DONE; |
@@ -763,12 +781,21 @@ out_hal_mem_alloc_failure: | |||
763 | void | 781 | void |
764 | bfad_drv_uninit(struct bfad_s *bfad) | 782 | bfad_drv_uninit(struct bfad_s *bfad) |
765 | { | 783 | { |
784 | unsigned long flags; | ||
785 | |||
786 | spin_lock_irqsave(&bfad->bfad_lock, flags); | ||
787 | init_completion(&bfad->comp); | ||
788 | bfa_stop(&bfad->bfa); | ||
789 | spin_unlock_irqrestore(&bfad->bfad_lock, flags); | ||
790 | wait_for_completion(&bfad->comp); | ||
791 | |||
766 | del_timer_sync(&bfad->hal_tmo); | 792 | del_timer_sync(&bfad->hal_tmo); |
767 | bfa_isr_disable(&bfad->bfa); | 793 | bfa_isr_disable(&bfad->bfa); |
768 | bfa_detach(&bfad->bfa); | 794 | bfa_detach(&bfad->bfa); |
769 | bfad_remove_intr(bfad); | 795 | bfad_remove_intr(bfad); |
770 | bfa_assert(list_empty(&bfad->file_q)); | ||
771 | bfad_hal_mem_release(bfad); | 796 | bfad_hal_mem_release(bfad); |
797 | |||
798 | bfad->bfad_flags &= ~BFAD_DRV_INIT_DONE; | ||
772 | } | 799 | } |
773 | 800 | ||
774 | void | 801 | void |
@@ -859,6 +886,86 @@ bfad_drv_log_level_set(struct bfad_s *bfad) | |||
859 | bfa_log_set_level_all(&bfad->log_data, log_level); | 886 | bfa_log_set_level_all(&bfad->log_data, log_level); |
860 | } | 887 | } |
861 | 888 | ||
889 | bfa_status_t | ||
890 | bfad_start_ops(struct bfad_s *bfad) | ||
891 | { | ||
892 | int retval; | ||
893 | |||
894 | /* PPORT FCS config */ | ||
895 | bfad_fcs_port_cfg(bfad); | ||
896 | |||
897 | retval = bfad_cfg_pport(bfad, BFA_PORT_ROLE_FCP_IM); | ||
898 | if (retval != BFA_STATUS_OK) | ||
899 | goto out_cfg_pport_failure; | ||
900 | |||
901 | /* BFAD level FC4 (IM/TM/IPFC) specific resource allocation */ | ||
902 | retval = bfad_fc4_probe(bfad); | ||
903 | if (retval != BFA_STATUS_OK) { | ||
904 | printk(KERN_WARNING "bfad_fc4_probe failed\n"); | ||
905 | goto out_fc4_probe_failure; | ||
906 | } | ||
907 | |||
908 | bfad_drv_start(bfad); | ||
909 | |||
910 | /* | ||
911 | * If bfa_linkup_delay is set to -1 default; try to retrive the | ||
912 | * value using the bfad_os_get_linkup_delay(); else use the | ||
913 | * passed in module param value as the bfa_linkup_delay. | ||
914 | */ | ||
915 | if (bfa_linkup_delay < 0) { | ||
916 | |||
917 | bfa_linkup_delay = bfad_os_get_linkup_delay(bfad); | ||
918 | bfad_os_rport_online_wait(bfad); | ||
919 | bfa_linkup_delay = -1; | ||
920 | |||
921 | } else { | ||
922 | bfad_os_rport_online_wait(bfad); | ||
923 | } | ||
924 | |||
925 | bfa_log(bfad->logmod, BFA_LOG_LINUX_DEVICE_CLAIMED, bfad->pci_name); | ||
926 | |||
927 | return BFA_STATUS_OK; | ||
928 | |||
929 | out_fc4_probe_failure: | ||
930 | bfad_fc4_probe_undo(bfad); | ||
931 | bfad_uncfg_pport(bfad); | ||
932 | out_cfg_pport_failure: | ||
933 | return BFA_STATUS_FAILED; | ||
934 | } | ||
935 | |||
936 | int | ||
937 | bfad_worker (void *ptr) | ||
938 | { | ||
939 | struct bfad_s *bfad; | ||
940 | unsigned long flags; | ||
941 | |||
942 | bfad = (struct bfad_s *)ptr; | ||
943 | |||
944 | while (!kthread_should_stop()) { | ||
945 | |||
946 | /* Check if the FCS init is done from bfad_drv_init; | ||
947 | * if not done do FCS init and set the flag. | ||
948 | */ | ||
949 | if (!(bfad->bfad_flags & BFAD_FCS_INIT_DONE)) { | ||
950 | spin_lock_irqsave(&bfad->bfad_lock, flags); | ||
951 | bfa_fcs_init(&bfad->bfa_fcs); | ||
952 | bfad->bfad_flags |= BFAD_FCS_INIT_DONE; | ||
953 | spin_unlock_irqrestore(&bfad->bfad_lock, flags); | ||
954 | } | ||
955 | |||
956 | /* Start the bfad operations after HAL init done */ | ||
957 | bfad_start_ops(bfad); | ||
958 | |||
959 | spin_lock_irqsave(&bfad->bfad_lock, flags); | ||
960 | bfad->bfad_tsk = NULL; | ||
961 | spin_unlock_irqrestore(&bfad->bfad_lock, flags); | ||
962 | |||
963 | break; | ||
964 | } | ||
965 | |||
966 | return 0; | ||
967 | } | ||
968 | |||
862 | /* | 969 | /* |
863 | * PCI_entry PCI driver entries * { | 970 | * PCI_entry PCI driver entries * { |
864 | */ | 971 | */ |
@@ -871,7 +978,6 @@ bfad_pci_probe(struct pci_dev *pdev, const struct pci_device_id *pid) | |||
871 | { | 978 | { |
872 | struct bfad_s *bfad; | 979 | struct bfad_s *bfad; |
873 | int error = -ENODEV, retval; | 980 | int error = -ENODEV, retval; |
874 | char buf[16]; | ||
875 | 981 | ||
876 | /* | 982 | /* |
877 | * For single port cards - only claim function 0 | 983 | * For single port cards - only claim function 0 |
@@ -902,8 +1008,7 @@ bfad_pci_probe(struct pci_dev *pdev, const struct pci_device_id *pid) | |||
902 | bfa_trc(bfad, bfad_inst); | 1008 | bfa_trc(bfad, bfad_inst); |
903 | 1009 | ||
904 | bfad->logmod = &bfad->log_data; | 1010 | bfad->logmod = &bfad->log_data; |
905 | sprintf(buf, "%d", bfad_inst); | 1011 | bfa_log_init(bfad->logmod, (char *)pci_name(pdev), bfa_os_printf); |
906 | bfa_log_init(bfad->logmod, buf, bfa_os_printf); | ||
907 | 1012 | ||
908 | bfad_drv_log_level_set(bfad); | 1013 | bfad_drv_log_level_set(bfad); |
909 | 1014 | ||
@@ -933,57 +1038,39 @@ bfad_pci_probe(struct pci_dev *pdev, const struct pci_device_id *pid) | |||
933 | bfad->ref_count = 0; | 1038 | bfad->ref_count = 0; |
934 | bfad->pport.bfad = bfad; | 1039 | bfad->pport.bfad = bfad; |
935 | 1040 | ||
1041 | bfad->bfad_tsk = kthread_create(bfad_worker, (void *) bfad, "%s", | ||
1042 | "bfad_worker"); | ||
1043 | if (IS_ERR(bfad->bfad_tsk)) { | ||
1044 | printk(KERN_INFO "bfad[%d]: Kernel thread" | ||
1045 | " creation failed!\n", | ||
1046 | bfad->inst_no); | ||
1047 | goto out_kthread_create_failure; | ||
1048 | } | ||
1049 | |||
936 | retval = bfad_drv_init(bfad); | 1050 | retval = bfad_drv_init(bfad); |
937 | if (retval != BFA_STATUS_OK) | 1051 | if (retval != BFA_STATUS_OK) |
938 | goto out_drv_init_failure; | 1052 | goto out_drv_init_failure; |
939 | if (!(bfad->bfad_flags & BFAD_HAL_INIT_DONE)) { | 1053 | if (!(bfad->bfad_flags & BFAD_HAL_INIT_DONE)) { |
1054 | bfad->bfad_flags |= BFAD_HAL_INIT_FAIL; | ||
940 | printk(KERN_WARNING "bfad%d: hal init failed\n", bfad->inst_no); | 1055 | printk(KERN_WARNING "bfad%d: hal init failed\n", bfad->inst_no); |
941 | goto ok; | 1056 | goto ok; |
942 | } | 1057 | } |
943 | 1058 | ||
944 | /* | 1059 | retval = bfad_start_ops(bfad); |
945 | * PPORT FCS config | ||
946 | */ | ||
947 | bfad_fcs_port_cfg(bfad); | ||
948 | |||
949 | retval = bfad_cfg_pport(bfad, BFA_PORT_ROLE_FCP_IM); | ||
950 | if (retval != BFA_STATUS_OK) | 1060 | if (retval != BFA_STATUS_OK) |
951 | goto out_cfg_pport_failure; | 1061 | goto out_start_ops_failure; |
952 | |||
953 | /* | ||
954 | * BFAD level FC4 (IM/TM/IPFC) specific resource allocation | ||
955 | */ | ||
956 | retval = bfad_fc4_probe(bfad); | ||
957 | if (retval != BFA_STATUS_OK) { | ||
958 | printk(KERN_WARNING "bfad_fc4_probe failed\n"); | ||
959 | goto out_fc4_probe_failure; | ||
960 | } | ||
961 | 1062 | ||
962 | bfad_drv_start(bfad); | 1063 | kthread_stop(bfad->bfad_tsk); |
963 | 1064 | bfad->bfad_tsk = NULL; | |
964 | /* | ||
965 | * If bfa_linkup_delay is set to -1 default; try to retrive the | ||
966 | * value using the bfad_os_get_linkup_delay(); else use the | ||
967 | * passed in module param value as the bfa_linkup_delay. | ||
968 | */ | ||
969 | if (bfa_linkup_delay < 0) { | ||
970 | bfa_linkup_delay = bfad_os_get_linkup_delay(bfad); | ||
971 | bfad_os_rport_online_wait(bfad); | ||
972 | bfa_linkup_delay = -1; | ||
973 | } else { | ||
974 | bfad_os_rport_online_wait(bfad); | ||
975 | } | ||
976 | 1065 | ||
977 | bfa_log(bfad->logmod, BFA_LOG_LINUX_DEVICE_CLAIMED, bfad->pci_name); | ||
978 | ok: | 1066 | ok: |
979 | return 0; | 1067 | return 0; |
980 | 1068 | ||
981 | out_fc4_probe_failure: | 1069 | out_start_ops_failure: |
982 | bfad_fc4_probe_undo(bfad); | ||
983 | bfad_uncfg_pport(bfad); | ||
984 | out_cfg_pport_failure: | ||
985 | bfad_drv_uninit(bfad); | 1070 | bfad_drv_uninit(bfad); |
986 | out_drv_init_failure: | 1071 | out_drv_init_failure: |
1072 | kthread_stop(bfad->bfad_tsk); | ||
1073 | out_kthread_create_failure: | ||
987 | mutex_lock(&bfad_mutex); | 1074 | mutex_lock(&bfad_mutex); |
988 | bfad_inst--; | 1075 | bfad_inst--; |
989 | list_del(&bfad->list_entry); | 1076 | list_del(&bfad->list_entry); |
@@ -1008,6 +1095,11 @@ bfad_pci_remove(struct pci_dev *pdev) | |||
1008 | 1095 | ||
1009 | bfa_trc(bfad, bfad->inst_no); | 1096 | bfa_trc(bfad, bfad->inst_no); |
1010 | 1097 | ||
1098 | spin_lock_irqsave(&bfad->bfad_lock, flags); | ||
1099 | if (bfad->bfad_tsk != NULL) | ||
1100 | kthread_stop(bfad->bfad_tsk); | ||
1101 | spin_unlock_irqrestore(&bfad->bfad_lock, flags); | ||
1102 | |||
1011 | if ((bfad->bfad_flags & BFAD_DRV_INIT_DONE) | 1103 | if ((bfad->bfad_flags & BFAD_DRV_INIT_DONE) |
1012 | && !(bfad->bfad_flags & BFAD_HAL_INIT_DONE)) { | 1104 | && !(bfad->bfad_flags & BFAD_HAL_INIT_DONE)) { |
1013 | 1105 | ||
@@ -1024,13 +1116,25 @@ bfad_pci_remove(struct pci_dev *pdev) | |||
1024 | goto remove_sysfs; | 1116 | goto remove_sysfs; |
1025 | } | 1117 | } |
1026 | 1118 | ||
1027 | if (bfad->bfad_flags & BFAD_HAL_START_DONE) | 1119 | if (bfad->bfad_flags & BFAD_HAL_START_DONE) { |
1028 | bfad_drv_stop(bfad); | 1120 | bfad_drv_stop(bfad); |
1121 | } else if (bfad->bfad_flags & BFAD_DRV_INIT_DONE) { | ||
1122 | /* Invoking bfa_stop() before bfa_detach | ||
1123 | * when HAL and DRV init are success | ||
1124 | * but HAL start did not occur. | ||
1125 | */ | ||
1126 | spin_lock_irqsave(&bfad->bfad_lock, flags); | ||
1127 | init_completion(&bfad->comp); | ||
1128 | bfa_stop(&bfad->bfa); | ||
1129 | spin_unlock_irqrestore(&bfad->bfad_lock, flags); | ||
1130 | wait_for_completion(&bfad->comp); | ||
1131 | } | ||
1029 | 1132 | ||
1030 | bfad_remove_intr(bfad); | 1133 | bfad_remove_intr(bfad); |
1031 | |||
1032 | del_timer_sync(&bfad->hal_tmo); | 1134 | del_timer_sync(&bfad->hal_tmo); |
1033 | bfad_fc4_probe_undo(bfad); | 1135 | |
1136 | if (bfad->bfad_flags & BFAD_FC4_PROBE_DONE) | ||
1137 | bfad_fc4_probe_undo(bfad); | ||
1034 | 1138 | ||
1035 | if (bfad->bfad_flags & BFAD_CFG_PPORT_DONE) | 1139 | if (bfad->bfad_flags & BFAD_CFG_PPORT_DONE) |
1036 | bfad_uncfg_pport(bfad); | 1140 | bfad_uncfg_pport(bfad); |
diff --git a/drivers/scsi/bfa/bfad_attr.c b/drivers/scsi/bfa/bfad_attr.c index 9129ae3040ff..d97f69191838 100644 --- a/drivers/scsi/bfa/bfad_attr.c +++ b/drivers/scsi/bfa/bfad_attr.c | |||
@@ -141,7 +141,7 @@ bfad_im_get_host_port_type(struct Scsi_Host *shost) | |||
141 | struct bfad_s *bfad = im_port->bfad; | 141 | struct bfad_s *bfad = im_port->bfad; |
142 | struct bfa_pport_attr_s attr; | 142 | struct bfa_pport_attr_s attr; |
143 | 143 | ||
144 | bfa_pport_get_attr(&bfad->bfa, &attr); | 144 | bfa_fcport_get_attr(&bfad->bfa, &attr); |
145 | 145 | ||
146 | switch (attr.port_type) { | 146 | switch (attr.port_type) { |
147 | case BFA_PPORT_TYPE_NPORT: | 147 | case BFA_PPORT_TYPE_NPORT: |
@@ -173,7 +173,7 @@ bfad_im_get_host_port_state(struct Scsi_Host *shost) | |||
173 | struct bfad_s *bfad = im_port->bfad; | 173 | struct bfad_s *bfad = im_port->bfad; |
174 | struct bfa_pport_attr_s attr; | 174 | struct bfa_pport_attr_s attr; |
175 | 175 | ||
176 | bfa_pport_get_attr(&bfad->bfa, &attr); | 176 | bfa_fcport_get_attr(&bfad->bfa, &attr); |
177 | 177 | ||
178 | switch (attr.port_state) { | 178 | switch (attr.port_state) { |
179 | case BFA_PPORT_ST_LINKDOWN: | 179 | case BFA_PPORT_ST_LINKDOWN: |
@@ -229,8 +229,10 @@ bfad_im_get_host_speed(struct Scsi_Host *shost) | |||
229 | (struct bfad_im_port_s *) shost->hostdata[0]; | 229 | (struct bfad_im_port_s *) shost->hostdata[0]; |
230 | struct bfad_s *bfad = im_port->bfad; | 230 | struct bfad_s *bfad = im_port->bfad; |
231 | struct bfa_pport_attr_s attr; | 231 | struct bfa_pport_attr_s attr; |
232 | unsigned long flags; | ||
232 | 233 | ||
233 | bfa_pport_get_attr(&bfad->bfa, &attr); | 234 | spin_lock_irqsave(shost->host_lock, flags); |
235 | bfa_fcport_get_attr(&bfad->bfa, &attr); | ||
234 | switch (attr.speed) { | 236 | switch (attr.speed) { |
235 | case BFA_PPORT_SPEED_8GBPS: | 237 | case BFA_PPORT_SPEED_8GBPS: |
236 | fc_host_speed(shost) = FC_PORTSPEED_8GBIT; | 238 | fc_host_speed(shost) = FC_PORTSPEED_8GBIT; |
@@ -248,6 +250,7 @@ bfad_im_get_host_speed(struct Scsi_Host *shost) | |||
248 | fc_host_speed(shost) = FC_PORTSPEED_UNKNOWN; | 250 | fc_host_speed(shost) = FC_PORTSPEED_UNKNOWN; |
249 | break; | 251 | break; |
250 | } | 252 | } |
253 | spin_unlock_irqrestore(shost->host_lock, flags); | ||
251 | } | 254 | } |
252 | 255 | ||
253 | /** | 256 | /** |
@@ -285,7 +288,7 @@ bfad_im_get_stats(struct Scsi_Host *shost) | |||
285 | init_completion(&fcomp.comp); | 288 | init_completion(&fcomp.comp); |
286 | spin_lock_irqsave(&bfad->bfad_lock, flags); | 289 | spin_lock_irqsave(&bfad->bfad_lock, flags); |
287 | memset(hstats, 0, sizeof(struct fc_host_statistics)); | 290 | memset(hstats, 0, sizeof(struct fc_host_statistics)); |
288 | rc = bfa_pport_get_stats(&bfad->bfa, | 291 | rc = bfa_port_get_stats(BFA_FCPORT(&bfad->bfa), |
289 | (union bfa_pport_stats_u *) hstats, | 292 | (union bfa_pport_stats_u *) hstats, |
290 | bfad_hcb_comp, &fcomp); | 293 | bfad_hcb_comp, &fcomp); |
291 | spin_unlock_irqrestore(&bfad->bfad_lock, flags); | 294 | spin_unlock_irqrestore(&bfad->bfad_lock, flags); |
@@ -312,7 +315,8 @@ bfad_im_reset_stats(struct Scsi_Host *shost) | |||
312 | 315 | ||
313 | init_completion(&fcomp.comp); | 316 | init_completion(&fcomp.comp); |
314 | spin_lock_irqsave(&bfad->bfad_lock, flags); | 317 | spin_lock_irqsave(&bfad->bfad_lock, flags); |
315 | rc = bfa_pport_clear_stats(&bfad->bfa, bfad_hcb_comp, &fcomp); | 318 | rc = bfa_port_clear_stats(BFA_FCPORT(&bfad->bfa), bfad_hcb_comp, |
319 | &fcomp); | ||
316 | spin_unlock_irqrestore(&bfad->bfad_lock, flags); | 320 | spin_unlock_irqrestore(&bfad->bfad_lock, flags); |
317 | 321 | ||
318 | if (rc != BFA_STATUS_OK) | 322 | if (rc != BFA_STATUS_OK) |
@@ -421,12 +425,10 @@ bfad_im_serial_num_show(struct device *dev, struct device_attribute *attr, | |||
421 | struct bfad_im_port_s *im_port = | 425 | struct bfad_im_port_s *im_port = |
422 | (struct bfad_im_port_s *) shost->hostdata[0]; | 426 | (struct bfad_im_port_s *) shost->hostdata[0]; |
423 | struct bfad_s *bfad = im_port->bfad; | 427 | struct bfad_s *bfad = im_port->bfad; |
424 | struct bfa_ioc_attr_s ioc_attr; | 428 | char serial_num[BFA_ADAPTER_SERIAL_NUM_LEN]; |
425 | 429 | ||
426 | memset(&ioc_attr, 0, sizeof(ioc_attr)); | 430 | bfa_get_adapter_serial_num(&bfad->bfa, serial_num); |
427 | bfa_get_attr(&bfad->bfa, &ioc_attr); | 431 | return snprintf(buf, PAGE_SIZE, "%s\n", serial_num); |
428 | return snprintf(buf, PAGE_SIZE, "%s\n", | ||
429 | ioc_attr.adapter_attr.serial_num); | ||
430 | } | 432 | } |
431 | 433 | ||
432 | static ssize_t | 434 | static ssize_t |
@@ -437,11 +439,10 @@ bfad_im_model_show(struct device *dev, struct device_attribute *attr, | |||
437 | struct bfad_im_port_s *im_port = | 439 | struct bfad_im_port_s *im_port = |
438 | (struct bfad_im_port_s *) shost->hostdata[0]; | 440 | (struct bfad_im_port_s *) shost->hostdata[0]; |
439 | struct bfad_s *bfad = im_port->bfad; | 441 | struct bfad_s *bfad = im_port->bfad; |
440 | struct bfa_ioc_attr_s ioc_attr; | 442 | char model[BFA_ADAPTER_MODEL_NAME_LEN]; |
441 | 443 | ||
442 | memset(&ioc_attr, 0, sizeof(ioc_attr)); | 444 | bfa_get_adapter_model(&bfad->bfa, model); |
443 | bfa_get_attr(&bfad->bfa, &ioc_attr); | 445 | return snprintf(buf, PAGE_SIZE, "%s\n", model); |
444 | return snprintf(buf, PAGE_SIZE, "%s\n", ioc_attr.adapter_attr.model); | ||
445 | } | 446 | } |
446 | 447 | ||
447 | static ssize_t | 448 | static ssize_t |
@@ -452,12 +453,10 @@ bfad_im_model_desc_show(struct device *dev, struct device_attribute *attr, | |||
452 | struct bfad_im_port_s *im_port = | 453 | struct bfad_im_port_s *im_port = |
453 | (struct bfad_im_port_s *) shost->hostdata[0]; | 454 | (struct bfad_im_port_s *) shost->hostdata[0]; |
454 | struct bfad_s *bfad = im_port->bfad; | 455 | struct bfad_s *bfad = im_port->bfad; |
455 | struct bfa_ioc_attr_s ioc_attr; | 456 | char model_descr[BFA_ADAPTER_MODEL_DESCR_LEN]; |
456 | 457 | ||
457 | memset(&ioc_attr, 0, sizeof(ioc_attr)); | 458 | bfa_get_adapter_model(&bfad->bfa, model_descr); |
458 | bfa_get_attr(&bfad->bfa, &ioc_attr); | 459 | return snprintf(buf, PAGE_SIZE, "%s\n", model_descr); |
459 | return snprintf(buf, PAGE_SIZE, "%s\n", | ||
460 | ioc_attr.adapter_attr.model_descr); | ||
461 | } | 460 | } |
462 | 461 | ||
463 | static ssize_t | 462 | static ssize_t |
@@ -482,14 +481,13 @@ bfad_im_symbolic_name_show(struct device *dev, struct device_attribute *attr, | |||
482 | struct bfad_im_port_s *im_port = | 481 | struct bfad_im_port_s *im_port = |
483 | (struct bfad_im_port_s *) shost->hostdata[0]; | 482 | (struct bfad_im_port_s *) shost->hostdata[0]; |
484 | struct bfad_s *bfad = im_port->bfad; | 483 | struct bfad_s *bfad = im_port->bfad; |
485 | struct bfa_ioc_attr_s ioc_attr; | 484 | char model[BFA_ADAPTER_MODEL_NAME_LEN]; |
486 | 485 | char fw_ver[BFA_VERSION_LEN]; | |
487 | memset(&ioc_attr, 0, sizeof(ioc_attr)); | ||
488 | bfa_get_attr(&bfad->bfa, &ioc_attr); | ||
489 | 486 | ||
487 | bfa_get_adapter_model(&bfad->bfa, model); | ||
488 | bfa_get_adapter_fw_ver(&bfad->bfa, fw_ver); | ||
490 | return snprintf(buf, PAGE_SIZE, "Brocade %s FV%s DV%s\n", | 489 | return snprintf(buf, PAGE_SIZE, "Brocade %s FV%s DV%s\n", |
491 | ioc_attr.adapter_attr.model, | 490 | model, fw_ver, BFAD_DRIVER_VERSION); |
492 | ioc_attr.adapter_attr.fw_ver, BFAD_DRIVER_VERSION); | ||
493 | } | 491 | } |
494 | 492 | ||
495 | static ssize_t | 493 | static ssize_t |
@@ -500,11 +498,10 @@ bfad_im_hw_version_show(struct device *dev, struct device_attribute *attr, | |||
500 | struct bfad_im_port_s *im_port = | 498 | struct bfad_im_port_s *im_port = |
501 | (struct bfad_im_port_s *) shost->hostdata[0]; | 499 | (struct bfad_im_port_s *) shost->hostdata[0]; |
502 | struct bfad_s *bfad = im_port->bfad; | 500 | struct bfad_s *bfad = im_port->bfad; |
503 | struct bfa_ioc_attr_s ioc_attr; | 501 | char hw_ver[BFA_VERSION_LEN]; |
504 | 502 | ||
505 | memset(&ioc_attr, 0, sizeof(ioc_attr)); | 503 | bfa_get_pci_chip_rev(&bfad->bfa, hw_ver); |
506 | bfa_get_attr(&bfad->bfa, &ioc_attr); | 504 | return snprintf(buf, PAGE_SIZE, "%s\n", hw_ver); |
507 | return snprintf(buf, PAGE_SIZE, "%s\n", ioc_attr.adapter_attr.hw_ver); | ||
508 | } | 505 | } |
509 | 506 | ||
510 | static ssize_t | 507 | static ssize_t |
@@ -522,12 +519,10 @@ bfad_im_optionrom_version_show(struct device *dev, | |||
522 | struct bfad_im_port_s *im_port = | 519 | struct bfad_im_port_s *im_port = |
523 | (struct bfad_im_port_s *) shost->hostdata[0]; | 520 | (struct bfad_im_port_s *) shost->hostdata[0]; |
524 | struct bfad_s *bfad = im_port->bfad; | 521 | struct bfad_s *bfad = im_port->bfad; |
525 | struct bfa_ioc_attr_s ioc_attr; | 522 | char optrom_ver[BFA_VERSION_LEN]; |
526 | 523 | ||
527 | memset(&ioc_attr, 0, sizeof(ioc_attr)); | 524 | bfa_get_adapter_optrom_ver(&bfad->bfa, optrom_ver); |
528 | bfa_get_attr(&bfad->bfa, &ioc_attr); | 525 | return snprintf(buf, PAGE_SIZE, "%s\n", optrom_ver); |
529 | return snprintf(buf, PAGE_SIZE, "%s\n", | ||
530 | ioc_attr.adapter_attr.optrom_ver); | ||
531 | } | 526 | } |
532 | 527 | ||
533 | static ssize_t | 528 | static ssize_t |
@@ -538,11 +533,10 @@ bfad_im_fw_version_show(struct device *dev, struct device_attribute *attr, | |||
538 | struct bfad_im_port_s *im_port = | 533 | struct bfad_im_port_s *im_port = |
539 | (struct bfad_im_port_s *) shost->hostdata[0]; | 534 | (struct bfad_im_port_s *) shost->hostdata[0]; |
540 | struct bfad_s *bfad = im_port->bfad; | 535 | struct bfad_s *bfad = im_port->bfad; |
541 | struct bfa_ioc_attr_s ioc_attr; | 536 | char fw_ver[BFA_VERSION_LEN]; |
542 | 537 | ||
543 | memset(&ioc_attr, 0, sizeof(ioc_attr)); | 538 | bfa_get_adapter_fw_ver(&bfad->bfa, fw_ver); |
544 | bfa_get_attr(&bfad->bfa, &ioc_attr); | 539 | return snprintf(buf, PAGE_SIZE, "%s\n", fw_ver); |
545 | return snprintf(buf, PAGE_SIZE, "%s\n", ioc_attr.adapter_attr.fw_ver); | ||
546 | } | 540 | } |
547 | 541 | ||
548 | static ssize_t | 542 | static ssize_t |
@@ -553,11 +547,9 @@ bfad_im_num_of_ports_show(struct device *dev, struct device_attribute *attr, | |||
553 | struct bfad_im_port_s *im_port = | 547 | struct bfad_im_port_s *im_port = |
554 | (struct bfad_im_port_s *) shost->hostdata[0]; | 548 | (struct bfad_im_port_s *) shost->hostdata[0]; |
555 | struct bfad_s *bfad = im_port->bfad; | 549 | struct bfad_s *bfad = im_port->bfad; |
556 | struct bfa_ioc_attr_s ioc_attr; | ||
557 | 550 | ||
558 | memset(&ioc_attr, 0, sizeof(ioc_attr)); | 551 | return snprintf(buf, PAGE_SIZE, "%d\n", |
559 | bfa_get_attr(&bfad->bfa, &ioc_attr); | 552 | bfa_get_nports(&bfad->bfa)); |
560 | return snprintf(buf, PAGE_SIZE, "%d\n", ioc_attr.adapter_attr.nports); | ||
561 | } | 553 | } |
562 | 554 | ||
563 | static ssize_t | 555 | static ssize_t |
diff --git a/drivers/scsi/bfa/bfad_attr.h b/drivers/scsi/bfa/bfad_attr.h index 4d3312da6a81..bf0102076508 100644 --- a/drivers/scsi/bfa/bfad_attr.h +++ b/drivers/scsi/bfa/bfad_attr.h | |||
@@ -17,9 +17,6 @@ | |||
17 | 17 | ||
18 | #ifndef __BFAD_ATTR_H__ | 18 | #ifndef __BFAD_ATTR_H__ |
19 | #define __BFAD_ATTR_H__ | 19 | #define __BFAD_ATTR_H__ |
20 | /** | ||
21 | * bfad_attr.h VMware driver configuration interface module. | ||
22 | */ | ||
23 | 20 | ||
24 | /** | 21 | /** |
25 | * FC_transport_template FC transport template | 22 | * FC_transport_template FC transport template |
@@ -52,12 +49,6 @@ bfad_im_get_starget_port_name(struct scsi_target *starget); | |||
52 | void | 49 | void |
53 | bfad_im_get_host_port_id(struct Scsi_Host *shost); | 50 | bfad_im_get_host_port_id(struct Scsi_Host *shost); |
54 | 51 | ||
55 | /** | ||
56 | * FC transport template entry, issue a LIP. | ||
57 | */ | ||
58 | int | ||
59 | bfad_im_issue_fc_host_lip(struct Scsi_Host *shost); | ||
60 | |||
61 | struct Scsi_Host* | 52 | struct Scsi_Host* |
62 | bfad_os_starget_to_shost(struct scsi_target *starget); | 53 | bfad_os_starget_to_shost(struct scsi_target *starget); |
63 | 54 | ||
diff --git a/drivers/scsi/bfa/bfad_drv.h b/drivers/scsi/bfa/bfad_drv.h index 172c81e25c1c..107848cd3b6d 100644 --- a/drivers/scsi/bfa/bfad_drv.h +++ b/drivers/scsi/bfa/bfad_drv.h | |||
@@ -46,7 +46,7 @@ | |||
46 | #ifdef BFA_DRIVER_VERSION | 46 | #ifdef BFA_DRIVER_VERSION |
47 | #define BFAD_DRIVER_VERSION BFA_DRIVER_VERSION | 47 | #define BFAD_DRIVER_VERSION BFA_DRIVER_VERSION |
48 | #else | 48 | #else |
49 | #define BFAD_DRIVER_VERSION "2.0.0.0" | 49 | #define BFAD_DRIVER_VERSION "2.1.2.1" |
50 | #endif | 50 | #endif |
51 | 51 | ||
52 | 52 | ||
@@ -62,7 +62,9 @@ | |||
62 | #define BFAD_HAL_START_DONE 0x00000010 | 62 | #define BFAD_HAL_START_DONE 0x00000010 |
63 | #define BFAD_PORT_ONLINE 0x00000020 | 63 | #define BFAD_PORT_ONLINE 0x00000020 |
64 | #define BFAD_RPORT_ONLINE 0x00000040 | 64 | #define BFAD_RPORT_ONLINE 0x00000040 |
65 | 65 | #define BFAD_FCS_INIT_DONE 0x00000080 | |
66 | #define BFAD_HAL_INIT_FAIL 0x00000100 | ||
67 | #define BFAD_FC4_PROBE_DONE 0x00000200 | ||
66 | #define BFAD_PORT_DELETE 0x00000001 | 68 | #define BFAD_PORT_DELETE 0x00000001 |
67 | 69 | ||
68 | /* | 70 | /* |
@@ -137,12 +139,16 @@ struct bfad_cfg_param_s { | |||
137 | u32 binding_method; | 139 | u32 binding_method; |
138 | }; | 140 | }; |
139 | 141 | ||
140 | #define BFAD_AEN_MAX_APPS 8 | 142 | union bfad_tmp_buf { |
141 | struct bfad_aen_file_s { | 143 | /* From struct bfa_adapter_attr_s */ |
142 | struct list_head qe; | 144 | char manufacturer[BFA_ADAPTER_MFG_NAME_LEN]; |
143 | struct bfad_s *bfad; | 145 | char serial_num[BFA_ADAPTER_SERIAL_NUM_LEN]; |
144 | s32 ri; | 146 | char model[BFA_ADAPTER_MODEL_NAME_LEN]; |
145 | s32 app_id; | 147 | char fw_ver[BFA_VERSION_LEN]; |
148 | char optrom_ver[BFA_VERSION_LEN]; | ||
149 | |||
150 | /* From struct bfa_ioc_pci_attr_s */ | ||
151 | u8 chip_rev[BFA_IOC_CHIP_REV_LEN]; /* chip revision */ | ||
146 | }; | 152 | }; |
147 | 153 | ||
148 | /* | 154 | /* |
@@ -168,6 +174,7 @@ struct bfad_s { | |||
168 | u32 inst_no; /* BFAD instance number */ | 174 | u32 inst_no; /* BFAD instance number */ |
169 | u32 bfad_flags; | 175 | u32 bfad_flags; |
170 | spinlock_t bfad_lock; | 176 | spinlock_t bfad_lock; |
177 | struct task_struct *bfad_tsk; | ||
171 | struct bfad_cfg_param_s cfg_data; | 178 | struct bfad_cfg_param_s cfg_data; |
172 | struct bfad_msix_s msix_tab[MAX_MSIX_ENTRY]; | 179 | struct bfad_msix_s msix_tab[MAX_MSIX_ENTRY]; |
173 | int nvec; | 180 | int nvec; |
@@ -183,18 +190,12 @@ struct bfad_s { | |||
183 | struct bfa_log_mod_s *logmod; | 190 | struct bfa_log_mod_s *logmod; |
184 | struct bfa_aen_s *aen; | 191 | struct bfa_aen_s *aen; |
185 | struct bfa_aen_s aen_buf; | 192 | struct bfa_aen_s aen_buf; |
186 | struct bfad_aen_file_s file_buf[BFAD_AEN_MAX_APPS]; | 193 | void *file_map[BFA_AEN_MAX_APP]; |
187 | struct list_head file_q; | ||
188 | struct list_head file_free_q; | ||
189 | struct bfa_plog_s plog_buf; | 194 | struct bfa_plog_s plog_buf; |
190 | int ref_count; | 195 | int ref_count; |
191 | bfa_boolean_t ipfc_enabled; | 196 | bfa_boolean_t ipfc_enabled; |
197 | union bfad_tmp_buf tmp_buf; | ||
192 | struct fc_host_statistics link_stats; | 198 | struct fc_host_statistics link_stats; |
193 | |||
194 | struct kobject *bfa_kobj; | ||
195 | struct kobject *ioc_kobj; | ||
196 | struct kobject *pport_kobj; | ||
197 | struct kobject *lport_kobj; | ||
198 | }; | 199 | }; |
199 | 200 | ||
200 | /* | 201 | /* |
@@ -258,6 +259,7 @@ bfa_status_t bfad_vf_create(struct bfad_s *bfad, u16 vf_id, | |||
258 | struct bfa_port_cfg_s *port_cfg); | 259 | struct bfa_port_cfg_s *port_cfg); |
259 | bfa_status_t bfad_cfg_pport(struct bfad_s *bfad, enum bfa_port_role role); | 260 | bfa_status_t bfad_cfg_pport(struct bfad_s *bfad, enum bfa_port_role role); |
260 | bfa_status_t bfad_drv_init(struct bfad_s *bfad); | 261 | bfa_status_t bfad_drv_init(struct bfad_s *bfad); |
262 | bfa_status_t bfad_start_ops(struct bfad_s *bfad); | ||
261 | void bfad_drv_start(struct bfad_s *bfad); | 263 | void bfad_drv_start(struct bfad_s *bfad); |
262 | void bfad_uncfg_pport(struct bfad_s *bfad); | 264 | void bfad_uncfg_pport(struct bfad_s *bfad); |
263 | void bfad_drv_stop(struct bfad_s *bfad); | 265 | void bfad_drv_stop(struct bfad_s *bfad); |
@@ -279,6 +281,7 @@ void bfad_drv_uninit(struct bfad_s *bfad); | |||
279 | void bfad_drv_log_level_set(struct bfad_s *bfad); | 281 | void bfad_drv_log_level_set(struct bfad_s *bfad); |
280 | bfa_status_t bfad_fc4_module_init(void); | 282 | bfa_status_t bfad_fc4_module_init(void); |
281 | void bfad_fc4_module_exit(void); | 283 | void bfad_fc4_module_exit(void); |
284 | int bfad_worker (void *ptr); | ||
282 | 285 | ||
283 | void bfad_pci_remove(struct pci_dev *pdev); | 286 | void bfad_pci_remove(struct pci_dev *pdev); |
284 | int bfad_pci_probe(struct pci_dev *pdev, const struct pci_device_id *pid); | 287 | int bfad_pci_probe(struct pci_dev *pdev, const struct pci_device_id *pid); |
diff --git a/drivers/scsi/bfa/bfad_im.c b/drivers/scsi/bfa/bfad_im.c index f788c2a0ab07..f9fc67a25bf2 100644 --- a/drivers/scsi/bfa/bfad_im.c +++ b/drivers/scsi/bfa/bfad_im.c | |||
@@ -43,11 +43,11 @@ bfa_cb_ioim_done(void *drv, struct bfad_ioim_s *dio, | |||
43 | struct bfad_s *bfad = drv; | 43 | struct bfad_s *bfad = drv; |
44 | struct bfad_itnim_data_s *itnim_data; | 44 | struct bfad_itnim_data_s *itnim_data; |
45 | struct bfad_itnim_s *itnim; | 45 | struct bfad_itnim_s *itnim; |
46 | u8 host_status = DID_OK; | ||
46 | 47 | ||
47 | switch (io_status) { | 48 | switch (io_status) { |
48 | case BFI_IOIM_STS_OK: | 49 | case BFI_IOIM_STS_OK: |
49 | bfa_trc(bfad, scsi_status); | 50 | bfa_trc(bfad, scsi_status); |
50 | cmnd->result = ScsiResult(DID_OK, scsi_status); | ||
51 | scsi_set_resid(cmnd, 0); | 51 | scsi_set_resid(cmnd, 0); |
52 | 52 | ||
53 | if (sns_len > 0) { | 53 | if (sns_len > 0) { |
@@ -56,8 +56,18 @@ bfa_cb_ioim_done(void *drv, struct bfad_ioim_s *dio, | |||
56 | sns_len = SCSI_SENSE_BUFFERSIZE; | 56 | sns_len = SCSI_SENSE_BUFFERSIZE; |
57 | memcpy(cmnd->sense_buffer, sns_info, sns_len); | 57 | memcpy(cmnd->sense_buffer, sns_info, sns_len); |
58 | } | 58 | } |
59 | if (residue > 0) | 59 | if (residue > 0) { |
60 | bfa_trc(bfad, residue); | ||
60 | scsi_set_resid(cmnd, residue); | 61 | scsi_set_resid(cmnd, residue); |
62 | if (!sns_len && (scsi_status == SAM_STAT_GOOD) && | ||
63 | (scsi_bufflen(cmnd) - residue) < | ||
64 | cmnd->underflow) { | ||
65 | bfa_trc(bfad, 0); | ||
66 | host_status = DID_ERROR; | ||
67 | } | ||
68 | } | ||
69 | cmnd->result = ScsiResult(host_status, scsi_status); | ||
70 | |||
61 | break; | 71 | break; |
62 | 72 | ||
63 | case BFI_IOIM_STS_ABORTED: | 73 | case BFI_IOIM_STS_ABORTED: |
@@ -167,17 +177,15 @@ bfad_im_info(struct Scsi_Host *shost) | |||
167 | static char bfa_buf[256]; | 177 | static char bfa_buf[256]; |
168 | struct bfad_im_port_s *im_port = | 178 | struct bfad_im_port_s *im_port = |
169 | (struct bfad_im_port_s *) shost->hostdata[0]; | 179 | (struct bfad_im_port_s *) shost->hostdata[0]; |
170 | struct bfa_ioc_attr_s ioc_attr; | ||
171 | struct bfad_s *bfad = im_port->bfad; | 180 | struct bfad_s *bfad = im_port->bfad; |
181 | char model[BFA_ADAPTER_MODEL_NAME_LEN]; | ||
172 | 182 | ||
173 | memset(&ioc_attr, 0, sizeof(ioc_attr)); | 183 | bfa_get_adapter_model(&bfad->bfa, model); |
174 | bfa_get_attr(&bfad->bfa, &ioc_attr); | ||
175 | 184 | ||
176 | memset(bfa_buf, 0, sizeof(bfa_buf)); | 185 | memset(bfa_buf, 0, sizeof(bfa_buf)); |
177 | snprintf(bfa_buf, sizeof(bfa_buf), | 186 | snprintf(bfa_buf, sizeof(bfa_buf), |
178 | "Brocade FC/FCOE Adapter, " "model: %s hwpath: %s driver: %s", | 187 | "Brocade FC/FCOE Adapter, " "model: %s hwpath: %s driver: %s", |
179 | ioc_attr.adapter_attr.model, bfad->pci_name, | 188 | model, bfad->pci_name, BFAD_DRIVER_VERSION); |
180 | BFAD_DRIVER_VERSION); | ||
181 | return bfa_buf; | 189 | return bfa_buf; |
182 | } | 190 | } |
183 | 191 | ||
@@ -501,16 +509,6 @@ void bfa_fcb_itnim_tov(struct bfad_itnim_s *itnim) | |||
501 | } | 509 | } |
502 | 510 | ||
503 | /** | 511 | /** |
504 | * Path TOV processing begin notification -- dummy for linux | ||
505 | */ | ||
506 | void | ||
507 | bfa_fcb_itnim_tov_begin(struct bfad_itnim_s *itnim) | ||
508 | { | ||
509 | } | ||
510 | |||
511 | |||
512 | |||
513 | /** | ||
514 | * Allocate a Scsi_Host for a port. | 512 | * Allocate a Scsi_Host for a port. |
515 | */ | 513 | */ |
516 | int | 514 | int |
@@ -931,10 +929,9 @@ bfad_os_fc_host_init(struct bfad_im_port_s *im_port) | |||
931 | struct Scsi_Host *host = im_port->shost; | 929 | struct Scsi_Host *host = im_port->shost; |
932 | struct bfad_s *bfad = im_port->bfad; | 930 | struct bfad_s *bfad = im_port->bfad; |
933 | struct bfad_port_s *port = im_port->port; | 931 | struct bfad_port_s *port = im_port->port; |
934 | union attr { | 932 | struct bfa_pport_attr_s pattr; |
935 | struct bfa_pport_attr_s pattr; | 933 | char model[BFA_ADAPTER_MODEL_NAME_LEN]; |
936 | struct bfa_ioc_attr_s ioc_attr; | 934 | char fw_ver[BFA_VERSION_LEN]; |
937 | } attr; | ||
938 | 935 | ||
939 | fc_host_node_name(host) = | 936 | fc_host_node_name(host) = |
940 | bfa_os_htonll((bfa_fcs_port_get_nwwn(port->fcs_port))); | 937 | bfa_os_htonll((bfa_fcs_port_get_nwwn(port->fcs_port))); |
@@ -954,20 +951,18 @@ bfad_os_fc_host_init(struct bfad_im_port_s *im_port) | |||
954 | /* For fibre channel services type 0x20 */ | 951 | /* For fibre channel services type 0x20 */ |
955 | fc_host_supported_fc4s(host)[7] = 1; | 952 | fc_host_supported_fc4s(host)[7] = 1; |
956 | 953 | ||
957 | memset(&attr.ioc_attr, 0, sizeof(attr.ioc_attr)); | 954 | bfa_get_adapter_model(&bfad->bfa, model); |
958 | bfa_get_attr(&bfad->bfa, &attr.ioc_attr); | 955 | bfa_get_adapter_fw_ver(&bfad->bfa, fw_ver); |
959 | sprintf(fc_host_symbolic_name(host), "Brocade %s FV%s DV%s", | 956 | sprintf(fc_host_symbolic_name(host), "Brocade %s FV%s DV%s", |
960 | attr.ioc_attr.adapter_attr.model, | 957 | model, fw_ver, BFAD_DRIVER_VERSION); |
961 | attr.ioc_attr.adapter_attr.fw_ver, BFAD_DRIVER_VERSION); | ||
962 | 958 | ||
963 | fc_host_supported_speeds(host) = 0; | 959 | fc_host_supported_speeds(host) = 0; |
964 | fc_host_supported_speeds(host) |= | 960 | fc_host_supported_speeds(host) |= |
965 | FC_PORTSPEED_8GBIT | FC_PORTSPEED_4GBIT | FC_PORTSPEED_2GBIT | | 961 | FC_PORTSPEED_8GBIT | FC_PORTSPEED_4GBIT | FC_PORTSPEED_2GBIT | |
966 | FC_PORTSPEED_1GBIT; | 962 | FC_PORTSPEED_1GBIT; |
967 | 963 | ||
968 | memset(&attr.pattr, 0, sizeof(attr.pattr)); | 964 | bfa_fcport_get_attr(&bfad->bfa, &pattr); |
969 | bfa_pport_get_attr(&bfad->bfa, &attr.pattr); | 965 | fc_host_maxframe_size(host) = pattr.pport_cfg.maxfrsize; |
970 | fc_host_maxframe_size(host) = attr.pattr.pport_cfg.maxfrsize; | ||
971 | } | 966 | } |
972 | 967 | ||
973 | static void | 968 | static void |
diff --git a/drivers/scsi/bfa/bfad_im.h b/drivers/scsi/bfa/bfad_im.h index 189a5b29e21a..85ab2da21321 100644 --- a/drivers/scsi/bfa/bfad_im.h +++ b/drivers/scsi/bfa/bfad_im.h | |||
@@ -23,7 +23,6 @@ | |||
23 | 23 | ||
24 | #define FCPI_NAME " fcpim" | 24 | #define FCPI_NAME " fcpim" |
25 | 25 | ||
26 | void bfad_flags_set(struct bfad_s *bfad, u32 flags); | ||
27 | bfa_status_t bfad_im_module_init(void); | 26 | bfa_status_t bfad_im_module_init(void); |
28 | void bfad_im_module_exit(void); | 27 | void bfad_im_module_exit(void); |
29 | bfa_status_t bfad_im_probe(struct bfad_s *bfad); | 28 | bfa_status_t bfad_im_probe(struct bfad_s *bfad); |
@@ -126,7 +125,6 @@ bfa_status_t bfad_os_thread_workq(struct bfad_s *bfad); | |||
126 | void bfad_os_destroy_workq(struct bfad_im_s *im); | 125 | void bfad_os_destroy_workq(struct bfad_im_s *im); |
127 | void bfad_os_itnim_process(struct bfad_itnim_s *itnim_drv); | 126 | void bfad_os_itnim_process(struct bfad_itnim_s *itnim_drv); |
128 | void bfad_os_fc_host_init(struct bfad_im_port_s *im_port); | 127 | void bfad_os_fc_host_init(struct bfad_im_port_s *im_port); |
129 | void bfad_os_init_work(struct bfad_im_port_s *im_port); | ||
130 | void bfad_os_scsi_host_free(struct bfad_s *bfad, | 128 | void bfad_os_scsi_host_free(struct bfad_s *bfad, |
131 | struct bfad_im_port_s *im_port); | 129 | struct bfad_im_port_s *im_port); |
132 | void bfad_os_ramp_up_qdepth(struct bfad_itnim_s *itnim, | 130 | void bfad_os_ramp_up_qdepth(struct bfad_itnim_s *itnim, |
@@ -136,9 +134,6 @@ struct bfad_itnim_s *bfad_os_get_itnim(struct bfad_im_port_s *im_port, int id); | |||
136 | int bfad_os_scsi_add_host(struct Scsi_Host *shost, | 134 | int bfad_os_scsi_add_host(struct Scsi_Host *shost, |
137 | struct bfad_im_port_s *im_port, struct bfad_s *bfad); | 135 | struct bfad_im_port_s *im_port, struct bfad_s *bfad); |
138 | 136 | ||
139 | /* | ||
140 | * scsi_host_template entries | ||
141 | */ | ||
142 | void bfad_im_itnim_unmap(struct bfad_im_port_s *im_port, | 137 | void bfad_im_itnim_unmap(struct bfad_im_port_s *im_port, |
143 | struct bfad_itnim_s *itnim); | 138 | struct bfad_itnim_s *itnim); |
144 | 139 | ||
diff --git a/drivers/scsi/bfa/bfad_intr.c b/drivers/scsi/bfa/bfad_intr.c index 7de8832f6fee..2b7dbecbebca 100644 --- a/drivers/scsi/bfa/bfad_intr.c +++ b/drivers/scsi/bfa/bfad_intr.c | |||
@@ -23,8 +23,10 @@ BFA_TRC_FILE(LDRV, INTR); | |||
23 | /** | 23 | /** |
24 | * bfa_isr BFA driver interrupt functions | 24 | * bfa_isr BFA driver interrupt functions |
25 | */ | 25 | */ |
26 | static int msix_disable; | 26 | static int msix_disable_cb; |
27 | module_param(msix_disable, int, S_IRUGO | S_IWUSR); | 27 | static int msix_disable_ct; |
28 | module_param(msix_disable_cb, int, S_IRUGO | S_IWUSR); | ||
29 | module_param(msix_disable_ct, int, S_IRUGO | S_IWUSR); | ||
28 | /** | 30 | /** |
29 | * Line based interrupt handler. | 31 | * Line based interrupt handler. |
30 | */ | 32 | */ |
@@ -141,6 +143,7 @@ bfad_setup_intr(struct bfad_s *bfad) | |||
141 | int error = 0; | 143 | int error = 0; |
142 | u32 mask = 0, i, num_bit = 0, max_bit = 0; | 144 | u32 mask = 0, i, num_bit = 0, max_bit = 0; |
143 | struct msix_entry msix_entries[MAX_MSIX_ENTRY]; | 145 | struct msix_entry msix_entries[MAX_MSIX_ENTRY]; |
146 | struct pci_dev *pdev = bfad->pcidev; | ||
144 | 147 | ||
145 | /* Call BFA to get the msix map for this PCI function. */ | 148 | /* Call BFA to get the msix map for this PCI function. */ |
146 | bfa_msix_getvecs(&bfad->bfa, &mask, &num_bit, &max_bit); | 149 | bfa_msix_getvecs(&bfad->bfa, &mask, &num_bit, &max_bit); |
@@ -148,7 +151,9 @@ bfad_setup_intr(struct bfad_s *bfad) | |||
148 | /* Set up the msix entry table */ | 151 | /* Set up the msix entry table */ |
149 | bfad_init_msix_entry(bfad, msix_entries, mask, max_bit); | 152 | bfad_init_msix_entry(bfad, msix_entries, mask, max_bit); |
150 | 153 | ||
151 | if (!msix_disable) { | 154 | if ((pdev->device == BFA_PCI_DEVICE_ID_CT && !msix_disable_ct) || |
155 | (pdev->device != BFA_PCI_DEVICE_ID_CT && !msix_disable_cb)) { | ||
156 | |||
152 | error = pci_enable_msix(bfad->pcidev, msix_entries, bfad->nvec); | 157 | error = pci_enable_msix(bfad->pcidev, msix_entries, bfad->nvec); |
153 | if (error) { | 158 | if (error) { |
154 | /* | 159 | /* |
diff --git a/drivers/scsi/bfa/fabric.c b/drivers/scsi/bfa/fabric.c index a4b5dd449573..8166e9745ec0 100644 --- a/drivers/scsi/bfa/fabric.c +++ b/drivers/scsi/bfa/fabric.c | |||
@@ -37,7 +37,7 @@ BFA_TRC_FILE(FCS, FABRIC); | |||
37 | #define BFA_FCS_FABRIC_CLEANUP_DELAY (10000) /* Milliseconds */ | 37 | #define BFA_FCS_FABRIC_CLEANUP_DELAY (10000) /* Milliseconds */ |
38 | 38 | ||
39 | #define bfa_fcs_fabric_set_opertype(__fabric) do { \ | 39 | #define bfa_fcs_fabric_set_opertype(__fabric) do { \ |
40 | if (bfa_pport_get_topology((__fabric)->fcs->bfa) \ | 40 | if (bfa_fcport_get_topology((__fabric)->fcs->bfa) \ |
41 | == BFA_PPORT_TOPOLOGY_P2P) \ | 41 | == BFA_PPORT_TOPOLOGY_P2P) \ |
42 | (__fabric)->oper_type = BFA_PPORT_TYPE_NPORT; \ | 42 | (__fabric)->oper_type = BFA_PPORT_TYPE_NPORT; \ |
43 | else \ | 43 | else \ |
@@ -136,8 +136,7 @@ bfa_fcs_fabric_sm_uninit(struct bfa_fcs_fabric_s *fabric, | |||
136 | case BFA_FCS_FABRIC_SM_CREATE: | 136 | case BFA_FCS_FABRIC_SM_CREATE: |
137 | bfa_sm_set_state(fabric, bfa_fcs_fabric_sm_created); | 137 | bfa_sm_set_state(fabric, bfa_fcs_fabric_sm_created); |
138 | bfa_fcs_fabric_init(fabric); | 138 | bfa_fcs_fabric_init(fabric); |
139 | bfa_fcs_lport_init(&fabric->bport, fabric->fcs, FC_VF_ID_NULL, | 139 | bfa_fcs_lport_init(&fabric->bport, &fabric->bport.port_cfg); |
140 | &fabric->bport.port_cfg, NULL); | ||
141 | break; | 140 | break; |
142 | 141 | ||
143 | case BFA_FCS_FABRIC_SM_LINK_UP: | 142 | case BFA_FCS_FABRIC_SM_LINK_UP: |
@@ -161,7 +160,7 @@ bfa_fcs_fabric_sm_created(struct bfa_fcs_fabric_s *fabric, | |||
161 | 160 | ||
162 | switch (event) { | 161 | switch (event) { |
163 | case BFA_FCS_FABRIC_SM_START: | 162 | case BFA_FCS_FABRIC_SM_START: |
164 | if (bfa_pport_is_linkup(fabric->fcs->bfa)) { | 163 | if (bfa_fcport_is_linkup(fabric->fcs->bfa)) { |
165 | bfa_sm_set_state(fabric, bfa_fcs_fabric_sm_flogi); | 164 | bfa_sm_set_state(fabric, bfa_fcs_fabric_sm_flogi); |
166 | bfa_fcs_fabric_login(fabric); | 165 | bfa_fcs_fabric_login(fabric); |
167 | } else | 166 | } else |
@@ -225,7 +224,7 @@ bfa_fcs_fabric_sm_flogi(struct bfa_fcs_fabric_s *fabric, | |||
225 | switch (event) { | 224 | switch (event) { |
226 | case BFA_FCS_FABRIC_SM_CONT_OP: | 225 | case BFA_FCS_FABRIC_SM_CONT_OP: |
227 | 226 | ||
228 | bfa_pport_set_tx_bbcredit(fabric->fcs->bfa, fabric->bb_credit); | 227 | bfa_fcport_set_tx_bbcredit(fabric->fcs->bfa, fabric->bb_credit); |
229 | fabric->fab_type = BFA_FCS_FABRIC_SWITCHED; | 228 | fabric->fab_type = BFA_FCS_FABRIC_SWITCHED; |
230 | 229 | ||
231 | if (fabric->auth_reqd && fabric->is_auth) { | 230 | if (fabric->auth_reqd && fabric->is_auth) { |
@@ -252,7 +251,7 @@ bfa_fcs_fabric_sm_flogi(struct bfa_fcs_fabric_s *fabric, | |||
252 | 251 | ||
253 | case BFA_FCS_FABRIC_SM_NO_FABRIC: | 252 | case BFA_FCS_FABRIC_SM_NO_FABRIC: |
254 | fabric->fab_type = BFA_FCS_FABRIC_N2N; | 253 | fabric->fab_type = BFA_FCS_FABRIC_N2N; |
255 | bfa_pport_set_tx_bbcredit(fabric->fcs->bfa, fabric->bb_credit); | 254 | bfa_fcport_set_tx_bbcredit(fabric->fcs->bfa, fabric->bb_credit); |
256 | bfa_fcs_fabric_notify_online(fabric); | 255 | bfa_fcs_fabric_notify_online(fabric); |
257 | bfa_sm_set_state(fabric, bfa_fcs_fabric_sm_nofabric); | 256 | bfa_sm_set_state(fabric, bfa_fcs_fabric_sm_nofabric); |
258 | break; | 257 | break; |
@@ -419,7 +418,7 @@ bfa_fcs_fabric_sm_nofabric(struct bfa_fcs_fabric_s *fabric, | |||
419 | 418 | ||
420 | case BFA_FCS_FABRIC_SM_NO_FABRIC: | 419 | case BFA_FCS_FABRIC_SM_NO_FABRIC: |
421 | bfa_trc(fabric->fcs, fabric->bb_credit); | 420 | bfa_trc(fabric->fcs, fabric->bb_credit); |
422 | bfa_pport_set_tx_bbcredit(fabric->fcs->bfa, fabric->bb_credit); | 421 | bfa_fcport_set_tx_bbcredit(fabric->fcs->bfa, fabric->bb_credit); |
423 | break; | 422 | break; |
424 | 423 | ||
425 | default: | 424 | default: |
@@ -563,17 +562,15 @@ void | |||
563 | bfa_fcs_fabric_psymb_init(struct bfa_fcs_fabric_s *fabric) | 562 | bfa_fcs_fabric_psymb_init(struct bfa_fcs_fabric_s *fabric) |
564 | { | 563 | { |
565 | struct bfa_port_cfg_s *port_cfg = &fabric->bport.port_cfg; | 564 | struct bfa_port_cfg_s *port_cfg = &fabric->bport.port_cfg; |
566 | struct bfa_adapter_attr_s adapter_attr; | 565 | char model[BFA_ADAPTER_MODEL_NAME_LEN] = {0}; |
567 | struct bfa_fcs_driver_info_s *driver_info = &fabric->fcs->driver_info; | 566 | struct bfa_fcs_driver_info_s *driver_info = &fabric->fcs->driver_info; |
568 | 567 | ||
569 | bfa_os_memset((void *)&adapter_attr, 0, | 568 | bfa_ioc_get_adapter_model(&fabric->fcs->bfa->ioc, model); |
570 | sizeof(struct bfa_adapter_attr_s)); | ||
571 | bfa_ioc_get_adapter_attr(&fabric->fcs->bfa->ioc, &adapter_attr); | ||
572 | 569 | ||
573 | /* | 570 | /* |
574 | * Model name/number | 571 | * Model name/number |
575 | */ | 572 | */ |
576 | strncpy((char *)&port_cfg->sym_name, adapter_attr.model, | 573 | strncpy((char *)&port_cfg->sym_name, model, |
577 | BFA_FCS_PORT_SYMBNAME_MODEL_SZ); | 574 | BFA_FCS_PORT_SYMBNAME_MODEL_SZ); |
578 | strncat((char *)&port_cfg->sym_name, BFA_FCS_PORT_SYMBNAME_SEPARATOR, | 575 | strncat((char *)&port_cfg->sym_name, BFA_FCS_PORT_SYMBNAME_SEPARATOR, |
579 | sizeof(BFA_FCS_PORT_SYMBNAME_SEPARATOR)); | 576 | sizeof(BFA_FCS_PORT_SYMBNAME_SEPARATOR)); |
@@ -719,10 +716,10 @@ bfa_fcs_fabric_login(struct bfa_fcs_fabric_s *fabric) | |||
719 | struct bfa_port_cfg_s *pcfg = &fabric->bport.port_cfg; | 716 | struct bfa_port_cfg_s *pcfg = &fabric->bport.port_cfg; |
720 | u8 alpa = 0; | 717 | u8 alpa = 0; |
721 | 718 | ||
722 | if (bfa_pport_get_topology(bfa) == BFA_PPORT_TOPOLOGY_LOOP) | 719 | if (bfa_fcport_get_topology(bfa) == BFA_PPORT_TOPOLOGY_LOOP) |
723 | alpa = bfa_pport_get_myalpa(bfa); | 720 | alpa = bfa_fcport_get_myalpa(bfa); |
724 | 721 | ||
725 | bfa_lps_flogi(fabric->lps, fabric, alpa, bfa_pport_get_maxfrsize(bfa), | 722 | bfa_lps_flogi(fabric->lps, fabric, alpa, bfa_fcport_get_maxfrsize(bfa), |
726 | pcfg->pwwn, pcfg->nwwn, fabric->auth_reqd); | 723 | pcfg->pwwn, pcfg->nwwn, fabric->auth_reqd); |
727 | 724 | ||
728 | fabric->stats.flogi_sent++; | 725 | fabric->stats.flogi_sent++; |
@@ -814,10 +811,10 @@ bfa_fcs_fabric_delete_comp(void *cbarg) | |||
814 | */ | 811 | */ |
815 | 812 | ||
816 | /** | 813 | /** |
817 | * Module initialization | 814 | * Attach time initialization |
818 | */ | 815 | */ |
819 | void | 816 | void |
820 | bfa_fcs_fabric_modinit(struct bfa_fcs_s *fcs) | 817 | bfa_fcs_fabric_attach(struct bfa_fcs_s *fcs) |
821 | { | 818 | { |
822 | struct bfa_fcs_fabric_s *fabric; | 819 | struct bfa_fcs_fabric_s *fabric; |
823 | 820 | ||
@@ -841,7 +838,13 @@ bfa_fcs_fabric_modinit(struct bfa_fcs_s *fcs) | |||
841 | bfa_wc_up(&fabric->wc); /* For the base port */ | 838 | bfa_wc_up(&fabric->wc); /* For the base port */ |
842 | 839 | ||
843 | bfa_sm_set_state(fabric, bfa_fcs_fabric_sm_uninit); | 840 | bfa_sm_set_state(fabric, bfa_fcs_fabric_sm_uninit); |
844 | bfa_sm_send_event(fabric, BFA_FCS_FABRIC_SM_CREATE); | 841 | bfa_fcs_lport_attach(&fabric->bport, fabric->fcs, FC_VF_ID_NULL, NULL); |
842 | } | ||
843 | |||
844 | void | ||
845 | bfa_fcs_fabric_modinit(struct bfa_fcs_s *fcs) | ||
846 | { | ||
847 | bfa_sm_send_event(&fcs->fabric, BFA_FCS_FABRIC_SM_CREATE); | ||
845 | bfa_trc(fcs, 0); | 848 | bfa_trc(fcs, 0); |
846 | } | 849 | } |
847 | 850 | ||
@@ -890,6 +893,12 @@ bfa_fcs_fabric_is_loopback(struct bfa_fcs_fabric_s *fabric) | |||
890 | return bfa_sm_cmp_state(fabric, bfa_fcs_fabric_sm_loopback); | 893 | return bfa_sm_cmp_state(fabric, bfa_fcs_fabric_sm_loopback); |
891 | } | 894 | } |
892 | 895 | ||
896 | bfa_boolean_t | ||
897 | bfa_fcs_fabric_is_auth_failed(struct bfa_fcs_fabric_s *fabric) | ||
898 | { | ||
899 | return bfa_sm_cmp_state(fabric, bfa_fcs_fabric_sm_auth_failed); | ||
900 | } | ||
901 | |||
893 | enum bfa_pport_type | 902 | enum bfa_pport_type |
894 | bfa_fcs_fabric_port_type(struct bfa_fcs_fabric_s *fabric) | 903 | bfa_fcs_fabric_port_type(struct bfa_fcs_fabric_s *fabric) |
895 | { | 904 | { |
@@ -1165,8 +1174,8 @@ bfa_fcs_fabric_send_flogi_acc(struct bfa_fcs_fabric_s *fabric) | |||
1165 | reqlen = fc_flogi_acc_build(&fchs, bfa_fcxp_get_reqbuf(fcxp), | 1174 | reqlen = fc_flogi_acc_build(&fchs, bfa_fcxp_get_reqbuf(fcxp), |
1166 | bfa_os_hton3b(FC_FABRIC_PORT), | 1175 | bfa_os_hton3b(FC_FABRIC_PORT), |
1167 | n2n_port->reply_oxid, pcfg->pwwn, | 1176 | n2n_port->reply_oxid, pcfg->pwwn, |
1168 | pcfg->nwwn, bfa_pport_get_maxfrsize(bfa), | 1177 | pcfg->nwwn, bfa_fcport_get_maxfrsize(bfa), |
1169 | bfa_pport_get_rx_bbcredit(bfa)); | 1178 | bfa_fcport_get_rx_bbcredit(bfa)); |
1170 | 1179 | ||
1171 | bfa_fcxp_send(fcxp, NULL, fabric->vf_id, bfa_lps_get_tag(fabric->lps), | 1180 | bfa_fcxp_send(fcxp, NULL, fabric->vf_id, bfa_lps_get_tag(fabric->lps), |
1172 | BFA_FALSE, FC_CLASS_3, reqlen, &fchs, | 1181 | BFA_FALSE, FC_CLASS_3, reqlen, &fchs, |
@@ -1224,14 +1233,8 @@ bfa_fcs_fabric_aen_post(struct bfa_fcs_port_s *port, | |||
1224 | wwn2str(pwwn_ptr, pwwn); | 1233 | wwn2str(pwwn_ptr, pwwn); |
1225 | wwn2str(fwwn_ptr, fwwn); | 1234 | wwn2str(fwwn_ptr, fwwn); |
1226 | 1235 | ||
1227 | switch (event) { | 1236 | bfa_log(logmod, BFA_LOG_CREATE_ID(BFA_AEN_CAT_PORT, event), |
1228 | case BFA_PORT_AEN_FABRIC_NAME_CHANGE: | 1237 | pwwn_ptr, fwwn_ptr); |
1229 | bfa_log(logmod, BFA_AEN_PORT_FABRIC_NAME_CHANGE, pwwn_ptr, | ||
1230 | fwwn_ptr); | ||
1231 | break; | ||
1232 | default: | ||
1233 | break; | ||
1234 | } | ||
1235 | 1238 | ||
1236 | aen_data.port.pwwn = pwwn; | 1239 | aen_data.port.pwwn = pwwn; |
1237 | aen_data.port.fwwn = fwwn; | 1240 | aen_data.port.fwwn = fwwn; |
diff --git a/drivers/scsi/bfa/fcbuild.h b/drivers/scsi/bfa/fcbuild.h index 8fa7f270ef7b..981d98d542b9 100644 --- a/drivers/scsi/bfa/fcbuild.h +++ b/drivers/scsi/bfa/fcbuild.h | |||
@@ -72,6 +72,9 @@ fc_rpsc_operspeed_to_bfa_speed(enum fc_rpsc_op_speed_s speed) | |||
72 | case RPSC_OP_SPEED_8G: | 72 | case RPSC_OP_SPEED_8G: |
73 | return BFA_PPORT_SPEED_8GBPS; | 73 | return BFA_PPORT_SPEED_8GBPS; |
74 | 74 | ||
75 | case RPSC_OP_SPEED_10G: | ||
76 | return BFA_PPORT_SPEED_10GBPS; | ||
77 | |||
75 | default: | 78 | default: |
76 | return BFA_PPORT_SPEED_UNKNOWN; | 79 | return BFA_PPORT_SPEED_UNKNOWN; |
77 | } | 80 | } |
@@ -97,6 +100,9 @@ fc_bfa_speed_to_rpsc_operspeed(enum bfa_pport_speed op_speed) | |||
97 | case BFA_PPORT_SPEED_8GBPS: | 100 | case BFA_PPORT_SPEED_8GBPS: |
98 | return RPSC_OP_SPEED_8G; | 101 | return RPSC_OP_SPEED_8G; |
99 | 102 | ||
103 | case BFA_PPORT_SPEED_10GBPS: | ||
104 | return RPSC_OP_SPEED_10G; | ||
105 | |||
100 | default: | 106 | default: |
101 | return RPSC_OP_SPEED_NOT_EST; | 107 | return RPSC_OP_SPEED_NOT_EST; |
102 | } | 108 | } |
diff --git a/drivers/scsi/bfa/fcpim.c b/drivers/scsi/bfa/fcpim.c index 1f3c06efaa9e..8ae4a2cfa85b 100644 --- a/drivers/scsi/bfa/fcpim.c +++ b/drivers/scsi/bfa/fcpim.c | |||
@@ -126,7 +126,7 @@ bfa_fcs_itnim_sm_offline(struct bfa_fcs_itnim_s *itnim, | |||
126 | break; | 126 | break; |
127 | 127 | ||
128 | default: | 128 | default: |
129 | bfa_assert(0); | 129 | bfa_sm_fault(itnim->fcs, event); |
130 | } | 130 | } |
131 | 131 | ||
132 | } | 132 | } |
@@ -161,7 +161,7 @@ bfa_fcs_itnim_sm_prli_send(struct bfa_fcs_itnim_s *itnim, | |||
161 | break; | 161 | break; |
162 | 162 | ||
163 | default: | 163 | default: |
164 | bfa_assert(0); | 164 | bfa_sm_fault(itnim->fcs, event); |
165 | } | 165 | } |
166 | } | 166 | } |
167 | 167 | ||
@@ -205,7 +205,7 @@ bfa_fcs_itnim_sm_prli(struct bfa_fcs_itnim_s *itnim, | |||
205 | break; | 205 | break; |
206 | 206 | ||
207 | default: | 207 | default: |
208 | bfa_assert(0); | 208 | bfa_sm_fault(itnim->fcs, event); |
209 | } | 209 | } |
210 | } | 210 | } |
211 | 211 | ||
@@ -240,7 +240,7 @@ bfa_fcs_itnim_sm_prli_retry(struct bfa_fcs_itnim_s *itnim, | |||
240 | break; | 240 | break; |
241 | 241 | ||
242 | default: | 242 | default: |
243 | bfa_assert(0); | 243 | bfa_sm_fault(itnim->fcs, event); |
244 | } | 244 | } |
245 | } | 245 | } |
246 | 246 | ||
@@ -270,7 +270,7 @@ bfa_fcs_itnim_sm_hcb_online(struct bfa_fcs_itnim_s *itnim, | |||
270 | break; | 270 | break; |
271 | 271 | ||
272 | default: | 272 | default: |
273 | bfa_assert(0); | 273 | bfa_sm_fault(itnim->fcs, event); |
274 | } | 274 | } |
275 | } | 275 | } |
276 | 276 | ||
@@ -298,7 +298,7 @@ bfa_fcs_itnim_sm_online(struct bfa_fcs_itnim_s *itnim, | |||
298 | break; | 298 | break; |
299 | 299 | ||
300 | default: | 300 | default: |
301 | bfa_assert(0); | 301 | bfa_sm_fault(itnim->fcs, event); |
302 | } | 302 | } |
303 | } | 303 | } |
304 | 304 | ||
@@ -321,7 +321,7 @@ bfa_fcs_itnim_sm_hcb_offline(struct bfa_fcs_itnim_s *itnim, | |||
321 | break; | 321 | break; |
322 | 322 | ||
323 | default: | 323 | default: |
324 | bfa_assert(0); | 324 | bfa_sm_fault(itnim->fcs, event); |
325 | } | 325 | } |
326 | } | 326 | } |
327 | 327 | ||
@@ -354,7 +354,7 @@ bfa_fcs_itnim_sm_initiator(struct bfa_fcs_itnim_s *itnim, | |||
354 | break; | 354 | break; |
355 | 355 | ||
356 | default: | 356 | default: |
357 | bfa_assert(0); | 357 | bfa_sm_fault(itnim->fcs, event); |
358 | } | 358 | } |
359 | } | 359 | } |
360 | 360 | ||
@@ -385,19 +385,8 @@ bfa_fcs_itnim_aen_post(struct bfa_fcs_itnim_s *itnim, | |||
385 | wwn2str(lpwwn_ptr, lpwwn); | 385 | wwn2str(lpwwn_ptr, lpwwn); |
386 | wwn2str(rpwwn_ptr, rpwwn); | 386 | wwn2str(rpwwn_ptr, rpwwn); |
387 | 387 | ||
388 | switch (event) { | 388 | bfa_log(logmod, BFA_LOG_CREATE_ID(BFA_AEN_CAT_ITNIM, event), |
389 | case BFA_ITNIM_AEN_ONLINE: | 389 | rpwwn_ptr, lpwwn_ptr); |
390 | bfa_log(logmod, BFA_AEN_ITNIM_ONLINE, rpwwn_ptr, lpwwn_ptr); | ||
391 | break; | ||
392 | case BFA_ITNIM_AEN_OFFLINE: | ||
393 | bfa_log(logmod, BFA_AEN_ITNIM_OFFLINE, rpwwn_ptr, lpwwn_ptr); | ||
394 | break; | ||
395 | case BFA_ITNIM_AEN_DISCONNECT: | ||
396 | bfa_log(logmod, BFA_AEN_ITNIM_DISCONNECT, rpwwn_ptr, lpwwn_ptr); | ||
397 | break; | ||
398 | default: | ||
399 | break; | ||
400 | } | ||
401 | 390 | ||
402 | aen_data.itnim.vf_id = rport->port->fabric->vf_id; | 391 | aen_data.itnim.vf_id = rport->port->fabric->vf_id; |
403 | aen_data.itnim.ppwwn = | 392 | aen_data.itnim.ppwwn = |
@@ -689,7 +678,6 @@ bfa_cb_itnim_tov_begin(void *cb_arg) | |||
689 | struct bfa_fcs_itnim_s *itnim = (struct bfa_fcs_itnim_s *)cb_arg; | 678 | struct bfa_fcs_itnim_s *itnim = (struct bfa_fcs_itnim_s *)cb_arg; |
690 | 679 | ||
691 | bfa_trc(itnim->fcs, itnim->rport->pwwn); | 680 | bfa_trc(itnim->fcs, itnim->rport->pwwn); |
692 | bfa_fcb_itnim_tov_begin(itnim->itnim_drv); | ||
693 | } | 681 | } |
694 | 682 | ||
695 | /** | 683 | /** |
@@ -822,22 +810,3 @@ void | |||
822 | bfa_fcs_itnim_resume(struct bfa_fcs_itnim_s *itnim) | 810 | bfa_fcs_itnim_resume(struct bfa_fcs_itnim_s *itnim) |
823 | { | 811 | { |
824 | } | 812 | } |
825 | |||
826 | /** | ||
827 | * Module initialization | ||
828 | */ | ||
829 | void | ||
830 | bfa_fcs_fcpim_modinit(struct bfa_fcs_s *fcs) | ||
831 | { | ||
832 | } | ||
833 | |||
834 | /** | ||
835 | * Module cleanup | ||
836 | */ | ||
837 | void | ||
838 | bfa_fcs_fcpim_modexit(struct bfa_fcs_s *fcs) | ||
839 | { | ||
840 | bfa_fcs_modexit_comp(fcs); | ||
841 | } | ||
842 | |||
843 | |||
diff --git a/drivers/scsi/bfa/fcs_fabric.h b/drivers/scsi/bfa/fcs_fabric.h index eee960820f86..244c3f00c50c 100644 --- a/drivers/scsi/bfa/fcs_fabric.h +++ b/drivers/scsi/bfa/fcs_fabric.h | |||
@@ -29,6 +29,7 @@ | |||
29 | /* | 29 | /* |
30 | * fcs friend functions: only between fcs modules | 30 | * fcs friend functions: only between fcs modules |
31 | */ | 31 | */ |
32 | void bfa_fcs_fabric_attach(struct bfa_fcs_s *fcs); | ||
32 | void bfa_fcs_fabric_modinit(struct bfa_fcs_s *fcs); | 33 | void bfa_fcs_fabric_modinit(struct bfa_fcs_s *fcs); |
33 | void bfa_fcs_fabric_modexit(struct bfa_fcs_s *fcs); | 34 | void bfa_fcs_fabric_modexit(struct bfa_fcs_s *fcs); |
34 | void bfa_fcs_fabric_modsusp(struct bfa_fcs_s *fcs); | 35 | void bfa_fcs_fabric_modsusp(struct bfa_fcs_s *fcs); |
@@ -46,6 +47,7 @@ void bfa_fcs_fabric_uf_recv(struct bfa_fcs_fabric_s *fabric, | |||
46 | struct fchs_s *fchs, u16 len); | 47 | struct fchs_s *fchs, u16 len); |
47 | u16 bfa_fcs_fabric_vport_count(struct bfa_fcs_fabric_s *fabric); | 48 | u16 bfa_fcs_fabric_vport_count(struct bfa_fcs_fabric_s *fabric); |
48 | bfa_boolean_t bfa_fcs_fabric_is_loopback(struct bfa_fcs_fabric_s *fabric); | 49 | bfa_boolean_t bfa_fcs_fabric_is_loopback(struct bfa_fcs_fabric_s *fabric); |
50 | bfa_boolean_t bfa_fcs_fabric_is_auth_failed(struct bfa_fcs_fabric_s *fabric); | ||
49 | enum bfa_pport_type bfa_fcs_fabric_port_type(struct bfa_fcs_fabric_s *fabric); | 51 | enum bfa_pport_type bfa_fcs_fabric_port_type(struct bfa_fcs_fabric_s *fabric); |
50 | void bfa_fcs_fabric_psymb_init(struct bfa_fcs_fabric_s *fabric); | 52 | void bfa_fcs_fabric_psymb_init(struct bfa_fcs_fabric_s *fabric); |
51 | void bfa_fcs_fabric_port_delete_comp(struct bfa_fcs_fabric_s *fabric); | 53 | void bfa_fcs_fabric_port_delete_comp(struct bfa_fcs_fabric_s *fabric); |
diff --git a/drivers/scsi/bfa/fcs_fcpim.h b/drivers/scsi/bfa/fcs_fcpim.h index 61e9e2687de3..11e6e7bce9f6 100644 --- a/drivers/scsi/bfa/fcs_fcpim.h +++ b/drivers/scsi/bfa/fcs_fcpim.h | |||
@@ -34,11 +34,6 @@ void bfa_fcs_itnim_is_initiator(struct bfa_fcs_itnim_s *itnim); | |||
34 | void bfa_fcs_itnim_pause(struct bfa_fcs_itnim_s *itnim); | 34 | void bfa_fcs_itnim_pause(struct bfa_fcs_itnim_s *itnim); |
35 | void bfa_fcs_itnim_resume(struct bfa_fcs_itnim_s *itnim); | 35 | void bfa_fcs_itnim_resume(struct bfa_fcs_itnim_s *itnim); |
36 | 36 | ||
37 | /* | ||
38 | * Modudle init/cleanup routines. | ||
39 | */ | ||
40 | void bfa_fcs_fcpim_modinit(struct bfa_fcs_s *fcs); | ||
41 | void bfa_fcs_fcpim_modexit(struct bfa_fcs_s *fcs); | ||
42 | void bfa_fcs_fcpim_uf_recv(struct bfa_fcs_itnim_s *itnim, struct fchs_s *fchs, | 37 | void bfa_fcs_fcpim_uf_recv(struct bfa_fcs_itnim_s *itnim, struct fchs_s *fchs, |
43 | u16 len); | 38 | u16 len); |
44 | #endif /* __FCS_FCPIM_H__ */ | 39 | #endif /* __FCS_FCPIM_H__ */ |
diff --git a/drivers/scsi/bfa/fcs_lport.h b/drivers/scsi/bfa/fcs_lport.h index ae744ba35671..a6508c8ab184 100644 --- a/drivers/scsi/bfa/fcs_lport.h +++ b/drivers/scsi/bfa/fcs_lport.h | |||
@@ -84,9 +84,10 @@ void bfa_fcs_port_uf_recv(struct bfa_fcs_port_s *lport, struct fchs_s *fchs, | |||
84 | * Following routines will be called by Fabric to indicate port | 84 | * Following routines will be called by Fabric to indicate port |
85 | * online/offline to vport. | 85 | * online/offline to vport. |
86 | */ | 86 | */ |
87 | void bfa_fcs_lport_init(struct bfa_fcs_port_s *lport, struct bfa_fcs_s *fcs, | 87 | void bfa_fcs_lport_attach(struct bfa_fcs_port_s *lport, struct bfa_fcs_s *fcs, |
88 | u16 vf_id, struct bfa_port_cfg_s *port_cfg, | 88 | uint16_t vf_id, struct bfa_fcs_vport_s *vport); |
89 | struct bfa_fcs_vport_s *vport); | 89 | void bfa_fcs_lport_init(struct bfa_fcs_port_s *lport, |
90 | struct bfa_port_cfg_s *port_cfg); | ||
90 | void bfa_fcs_port_online(struct bfa_fcs_port_s *port); | 91 | void bfa_fcs_port_online(struct bfa_fcs_port_s *port); |
91 | void bfa_fcs_port_offline(struct bfa_fcs_port_s *port); | 92 | void bfa_fcs_port_offline(struct bfa_fcs_port_s *port); |
92 | void bfa_fcs_port_delete(struct bfa_fcs_port_s *port); | 93 | void bfa_fcs_port_delete(struct bfa_fcs_port_s *port); |
diff --git a/drivers/scsi/bfa/fcs_port.h b/drivers/scsi/bfa/fcs_port.h index abb65191dd27..408c06a7d164 100644 --- a/drivers/scsi/bfa/fcs_port.h +++ b/drivers/scsi/bfa/fcs_port.h | |||
@@ -26,7 +26,6 @@ | |||
26 | /* | 26 | /* |
27 | * fcs friend functions: only between fcs modules | 27 | * fcs friend functions: only between fcs modules |
28 | */ | 28 | */ |
29 | void bfa_fcs_pport_modinit(struct bfa_fcs_s *fcs); | 29 | void bfa_fcs_pport_attach(struct bfa_fcs_s *fcs); |
30 | void bfa_fcs_pport_modexit(struct bfa_fcs_s *fcs); | ||
31 | 30 | ||
32 | #endif /* __FCS_PPORT_H__ */ | 31 | #endif /* __FCS_PPORT_H__ */ |
diff --git a/drivers/scsi/bfa/fcs_rport.h b/drivers/scsi/bfa/fcs_rport.h index f601e9d74236..9c8d1d292380 100644 --- a/drivers/scsi/bfa/fcs_rport.h +++ b/drivers/scsi/bfa/fcs_rport.h | |||
@@ -24,9 +24,6 @@ | |||
24 | 24 | ||
25 | #include <fcs/bfa_fcs_rport.h> | 25 | #include <fcs/bfa_fcs_rport.h> |
26 | 26 | ||
27 | void bfa_fcs_rport_modinit(struct bfa_fcs_s *fcs); | ||
28 | void bfa_fcs_rport_modexit(struct bfa_fcs_s *fcs); | ||
29 | |||
30 | void bfa_fcs_rport_uf_recv(struct bfa_fcs_rport_s *rport, struct fchs_s *fchs, | 27 | void bfa_fcs_rport_uf_recv(struct bfa_fcs_rport_s *rport, struct fchs_s *fchs, |
31 | u16 len); | 28 | u16 len); |
32 | void bfa_fcs_rport_scn(struct bfa_fcs_rport_s *rport); | 29 | void bfa_fcs_rport_scn(struct bfa_fcs_rport_s *rport); |
diff --git a/drivers/scsi/bfa/fcs_uf.h b/drivers/scsi/bfa/fcs_uf.h index 96f1bdcb31ed..f591072214fe 100644 --- a/drivers/scsi/bfa/fcs_uf.h +++ b/drivers/scsi/bfa/fcs_uf.h | |||
@@ -26,7 +26,6 @@ | |||
26 | /* | 26 | /* |
27 | * fcs friend functions: only between fcs modules | 27 | * fcs friend functions: only between fcs modules |
28 | */ | 28 | */ |
29 | void bfa_fcs_uf_modinit(struct bfa_fcs_s *fcs); | 29 | void bfa_fcs_uf_attach(struct bfa_fcs_s *fcs); |
30 | void bfa_fcs_uf_modexit(struct bfa_fcs_s *fcs); | ||
31 | 30 | ||
32 | #endif /* __FCS_UF_H__ */ | 31 | #endif /* __FCS_UF_H__ */ |
diff --git a/drivers/scsi/bfa/fcs_vport.h b/drivers/scsi/bfa/fcs_vport.h index 9e80b6a97b7f..13c32ebf946c 100644 --- a/drivers/scsi/bfa/fcs_vport.h +++ b/drivers/scsi/bfa/fcs_vport.h | |||
@@ -22,18 +22,10 @@ | |||
22 | #include <fcs/bfa_fcs_vport.h> | 22 | #include <fcs/bfa_fcs_vport.h> |
23 | #include <defs/bfa_defs_pci.h> | 23 | #include <defs/bfa_defs_pci.h> |
24 | 24 | ||
25 | /* | ||
26 | * Modudle init/cleanup routines. | ||
27 | */ | ||
28 | |||
29 | void bfa_fcs_vport_modinit(struct bfa_fcs_s *fcs); | ||
30 | void bfa_fcs_vport_modexit(struct bfa_fcs_s *fcs); | ||
31 | |||
32 | void bfa_fcs_vport_cleanup(struct bfa_fcs_vport_s *vport); | 25 | void bfa_fcs_vport_cleanup(struct bfa_fcs_vport_s *vport); |
33 | void bfa_fcs_vport_online(struct bfa_fcs_vport_s *vport); | 26 | void bfa_fcs_vport_online(struct bfa_fcs_vport_s *vport); |
34 | void bfa_fcs_vport_offline(struct bfa_fcs_vport_s *vport); | 27 | void bfa_fcs_vport_offline(struct bfa_fcs_vport_s *vport); |
35 | void bfa_fcs_vport_delete_comp(struct bfa_fcs_vport_s *vport); | 28 | void bfa_fcs_vport_delete_comp(struct bfa_fcs_vport_s *vport); |
36 | u32 bfa_fcs_vport_get_max(struct bfa_fcs_s *fcs); | ||
37 | 29 | ||
38 | #endif /* __FCS_VPORT_H__ */ | 30 | #endif /* __FCS_VPORT_H__ */ |
39 | 31 | ||
diff --git a/drivers/scsi/bfa/fdmi.c b/drivers/scsi/bfa/fdmi.c index df2a1e54e16b..8f17076d1a87 100644 --- a/drivers/scsi/bfa/fdmi.c +++ b/drivers/scsi/bfa/fdmi.c | |||
@@ -116,6 +116,9 @@ static void bfa_fcs_port_fdmi_sm_rpa_retry(struct bfa_fcs_port_fdmi_s *fdmi, | |||
116 | enum port_fdmi_event event); | 116 | enum port_fdmi_event event); |
117 | static void bfa_fcs_port_fdmi_sm_online(struct bfa_fcs_port_fdmi_s *fdmi, | 117 | static void bfa_fcs_port_fdmi_sm_online(struct bfa_fcs_port_fdmi_s *fdmi, |
118 | enum port_fdmi_event event); | 118 | enum port_fdmi_event event); |
119 | static void bfa_fcs_port_fdmi_sm_disabled(struct bfa_fcs_port_fdmi_s *fdmi, | ||
120 | enum port_fdmi_event event); | ||
121 | |||
119 | /** | 122 | /** |
120 | * Start in offline state - awaiting MS to send start. | 123 | * Start in offline state - awaiting MS to send start. |
121 | */ | 124 | */ |
@@ -155,7 +158,7 @@ bfa_fcs_port_fdmi_sm_offline(struct bfa_fcs_port_fdmi_s *fdmi, | |||
155 | break; | 158 | break; |
156 | 159 | ||
157 | default: | 160 | default: |
158 | bfa_assert(0); | 161 | bfa_sm_fault(port->fcs, event); |
159 | } | 162 | } |
160 | } | 163 | } |
161 | 164 | ||
@@ -180,7 +183,7 @@ bfa_fcs_port_fdmi_sm_sending_rhba(struct bfa_fcs_port_fdmi_s *fdmi, | |||
180 | break; | 183 | break; |
181 | 184 | ||
182 | default: | 185 | default: |
183 | bfa_assert(0); | 186 | bfa_sm_fault(port->fcs, event); |
184 | } | 187 | } |
185 | } | 188 | } |
186 | 189 | ||
@@ -227,7 +230,7 @@ bfa_fcs_port_fdmi_sm_rhba(struct bfa_fcs_port_fdmi_s *fdmi, | |||
227 | break; | 230 | break; |
228 | 231 | ||
229 | default: | 232 | default: |
230 | bfa_assert(0); | 233 | bfa_sm_fault(port->fcs, event); |
231 | } | 234 | } |
232 | } | 235 | } |
233 | 236 | ||
@@ -255,7 +258,7 @@ bfa_fcs_port_fdmi_sm_rhba_retry(struct bfa_fcs_port_fdmi_s *fdmi, | |||
255 | break; | 258 | break; |
256 | 259 | ||
257 | default: | 260 | default: |
258 | bfa_assert(0); | 261 | bfa_sm_fault(port->fcs, event); |
259 | } | 262 | } |
260 | } | 263 | } |
261 | 264 | ||
@@ -283,7 +286,7 @@ bfa_fcs_port_fdmi_sm_sending_rprt(struct bfa_fcs_port_fdmi_s *fdmi, | |||
283 | break; | 286 | break; |
284 | 287 | ||
285 | default: | 288 | default: |
286 | bfa_assert(0); | 289 | bfa_sm_fault(port->fcs, event); |
287 | } | 290 | } |
288 | } | 291 | } |
289 | 292 | ||
@@ -328,7 +331,7 @@ bfa_fcs_port_fdmi_sm_rprt(struct bfa_fcs_port_fdmi_s *fdmi, | |||
328 | break; | 331 | break; |
329 | 332 | ||
330 | default: | 333 | default: |
331 | bfa_assert(0); | 334 | bfa_sm_fault(port->fcs, event); |
332 | } | 335 | } |
333 | } | 336 | } |
334 | 337 | ||
@@ -356,7 +359,7 @@ bfa_fcs_port_fdmi_sm_rprt_retry(struct bfa_fcs_port_fdmi_s *fdmi, | |||
356 | break; | 359 | break; |
357 | 360 | ||
358 | default: | 361 | default: |
359 | bfa_assert(0); | 362 | bfa_sm_fault(port->fcs, event); |
360 | } | 363 | } |
361 | } | 364 | } |
362 | 365 | ||
@@ -384,7 +387,7 @@ bfa_fcs_port_fdmi_sm_sending_rpa(struct bfa_fcs_port_fdmi_s *fdmi, | |||
384 | break; | 387 | break; |
385 | 388 | ||
386 | default: | 389 | default: |
387 | bfa_assert(0); | 390 | bfa_sm_fault(port->fcs, event); |
388 | } | 391 | } |
389 | } | 392 | } |
390 | 393 | ||
@@ -428,7 +431,7 @@ bfa_fcs_port_fdmi_sm_rpa(struct bfa_fcs_port_fdmi_s *fdmi, | |||
428 | break; | 431 | break; |
429 | 432 | ||
430 | default: | 433 | default: |
431 | bfa_assert(0); | 434 | bfa_sm_fault(port->fcs, event); |
432 | } | 435 | } |
433 | } | 436 | } |
434 | 437 | ||
@@ -456,7 +459,7 @@ bfa_fcs_port_fdmi_sm_rpa_retry(struct bfa_fcs_port_fdmi_s *fdmi, | |||
456 | break; | 459 | break; |
457 | 460 | ||
458 | default: | 461 | default: |
459 | bfa_assert(0); | 462 | bfa_sm_fault(port->fcs, event); |
460 | } | 463 | } |
461 | } | 464 | } |
462 | 465 | ||
@@ -475,10 +478,24 @@ bfa_fcs_port_fdmi_sm_online(struct bfa_fcs_port_fdmi_s *fdmi, | |||
475 | break; | 478 | break; |
476 | 479 | ||
477 | default: | 480 | default: |
478 | bfa_assert(0); | 481 | bfa_sm_fault(port->fcs, event); |
479 | } | 482 | } |
480 | } | 483 | } |
481 | 484 | ||
485 | /** | ||
486 | * FDMI is disabled state. | ||
487 | */ | ||
488 | static void | ||
489 | bfa_fcs_port_fdmi_sm_disabled(struct bfa_fcs_port_fdmi_s *fdmi, | ||
490 | enum port_fdmi_event event) | ||
491 | { | ||
492 | struct bfa_fcs_port_s *port = fdmi->ms->port; | ||
493 | |||
494 | bfa_trc(port->fcs, port->port_cfg.pwwn); | ||
495 | bfa_trc(port->fcs, event); | ||
496 | |||
497 | /* No op State. It can only be enabled at Driver Init. */ | ||
498 | } | ||
482 | 499 | ||
483 | /** | 500 | /** |
484 | * RHBA : Register HBA Attributes. | 501 | * RHBA : Register HBA Attributes. |
@@ -1097,36 +1114,23 @@ bfa_fcs_fdmi_get_hbaattr(struct bfa_fcs_port_fdmi_s *fdmi, | |||
1097 | { | 1114 | { |
1098 | struct bfa_fcs_port_s *port = fdmi->ms->port; | 1115 | struct bfa_fcs_port_s *port = fdmi->ms->port; |
1099 | struct bfa_fcs_driver_info_s *driver_info = &port->fcs->driver_info; | 1116 | struct bfa_fcs_driver_info_s *driver_info = &port->fcs->driver_info; |
1100 | struct bfa_adapter_attr_s adapter_attr; | ||
1101 | 1117 | ||
1102 | bfa_os_memset(hba_attr, 0, sizeof(struct bfa_fcs_fdmi_hba_attr_s)); | 1118 | bfa_os_memset(hba_attr, 0, sizeof(struct bfa_fcs_fdmi_hba_attr_s)); |
1103 | bfa_os_memset(&adapter_attr, 0, sizeof(struct bfa_adapter_attr_s)); | ||
1104 | |||
1105 | bfa_ioc_get_adapter_attr(&port->fcs->bfa->ioc, &adapter_attr); | ||
1106 | |||
1107 | strncpy(hba_attr->manufacturer, adapter_attr.manufacturer, | ||
1108 | sizeof(adapter_attr.manufacturer)); | ||
1109 | |||
1110 | strncpy(hba_attr->serial_num, adapter_attr.serial_num, | ||
1111 | sizeof(adapter_attr.serial_num)); | ||
1112 | 1119 | ||
1113 | strncpy(hba_attr->model, adapter_attr.model, sizeof(hba_attr->model)); | 1120 | bfa_ioc_get_adapter_manufacturer(&port->fcs->bfa->ioc, |
1114 | 1121 | hba_attr->manufacturer); | |
1115 | strncpy(hba_attr->model_desc, adapter_attr.model_descr, | 1122 | bfa_ioc_get_adapter_serial_num(&port->fcs->bfa->ioc, |
1116 | sizeof(hba_attr->model_desc)); | 1123 | hba_attr->serial_num); |
1117 | 1124 | bfa_ioc_get_adapter_model(&port->fcs->bfa->ioc, hba_attr->model); | |
1118 | strncpy(hba_attr->hw_version, adapter_attr.hw_ver, | 1125 | bfa_ioc_get_adapter_model(&port->fcs->bfa->ioc, hba_attr->model_desc); |
1119 | sizeof(hba_attr->hw_version)); | 1126 | bfa_ioc_get_pci_chip_rev(&port->fcs->bfa->ioc, hba_attr->hw_version); |
1127 | bfa_ioc_get_adapter_optrom_ver(&port->fcs->bfa->ioc, | ||
1128 | hba_attr->option_rom_ver); | ||
1129 | bfa_ioc_get_adapter_fw_ver(&port->fcs->bfa->ioc, hba_attr->fw_version); | ||
1120 | 1130 | ||
1121 | strncpy(hba_attr->driver_version, (char *)driver_info->version, | 1131 | strncpy(hba_attr->driver_version, (char *)driver_info->version, |
1122 | sizeof(hba_attr->driver_version)); | 1132 | sizeof(hba_attr->driver_version)); |
1123 | 1133 | ||
1124 | strncpy(hba_attr->option_rom_ver, adapter_attr.optrom_ver, | ||
1125 | sizeof(hba_attr->option_rom_ver)); | ||
1126 | |||
1127 | strncpy(hba_attr->fw_version, adapter_attr.fw_ver, | ||
1128 | sizeof(hba_attr->fw_version)); | ||
1129 | |||
1130 | strncpy(hba_attr->os_name, driver_info->host_os_name, | 1134 | strncpy(hba_attr->os_name, driver_info->host_os_name, |
1131 | sizeof(hba_attr->os_name)); | 1135 | sizeof(hba_attr->os_name)); |
1132 | 1136 | ||
@@ -1158,7 +1162,7 @@ bfa_fcs_fdmi_get_portattr(struct bfa_fcs_port_fdmi_s *fdmi, | |||
1158 | /* | 1162 | /* |
1159 | * get pport attributes from hal | 1163 | * get pport attributes from hal |
1160 | */ | 1164 | */ |
1161 | bfa_pport_get_attr(port->fcs->bfa, &pport_attr); | 1165 | bfa_fcport_get_attr(port->fcs->bfa, &pport_attr); |
1162 | 1166 | ||
1163 | /* | 1167 | /* |
1164 | * get FC4 type Bitmask | 1168 | * get FC4 type Bitmask |
@@ -1201,7 +1205,10 @@ bfa_fcs_port_fdmi_init(struct bfa_fcs_port_ms_s *ms) | |||
1201 | struct bfa_fcs_port_fdmi_s *fdmi = &ms->fdmi; | 1205 | struct bfa_fcs_port_fdmi_s *fdmi = &ms->fdmi; |
1202 | 1206 | ||
1203 | fdmi->ms = ms; | 1207 | fdmi->ms = ms; |
1204 | bfa_sm_set_state(fdmi, bfa_fcs_port_fdmi_sm_offline); | 1208 | if (ms->port->fcs->fdmi_enabled) |
1209 | bfa_sm_set_state(fdmi, bfa_fcs_port_fdmi_sm_offline); | ||
1210 | else | ||
1211 | bfa_sm_set_state(fdmi, bfa_fcs_port_fdmi_sm_disabled); | ||
1205 | } | 1212 | } |
1206 | 1213 | ||
1207 | void | 1214 | void |
diff --git a/drivers/scsi/bfa/include/aen/bfa_aen.h b/drivers/scsi/bfa/include/aen/bfa_aen.h index d9cbc2a783d4..6abbab005db6 100644 --- a/drivers/scsi/bfa/include/aen/bfa_aen.h +++ b/drivers/scsi/bfa/include/aen/bfa_aen.h | |||
@@ -18,21 +18,24 @@ | |||
18 | #define __BFA_AEN_H__ | 18 | #define __BFA_AEN_H__ |
19 | 19 | ||
20 | #include "defs/bfa_defs_aen.h" | 20 | #include "defs/bfa_defs_aen.h" |
21 | #include "defs/bfa_defs_status.h" | ||
22 | #include "cs/bfa_debug.h" | ||
21 | 23 | ||
22 | #define BFA_AEN_MAX_ENTRY 512 | 24 | #define BFA_AEN_MAX_ENTRY 512 |
23 | 25 | ||
24 | extern s32 bfa_aen_max_cfg_entry; | 26 | extern int bfa_aen_max_cfg_entry; |
25 | struct bfa_aen_s { | 27 | struct bfa_aen_s { |
26 | void *bfad; | 28 | void *bfad; |
27 | s32 max_entry; | 29 | int max_entry; |
28 | s32 write_index; | 30 | int write_index; |
29 | s32 read_index; | 31 | int read_index; |
30 | u32 bfad_num; | 32 | int bfad_num; |
31 | u32 seq_num; | 33 | int seq_num; |
32 | void (*aen_cb_notify)(void *bfad); | 34 | void (*aen_cb_notify)(void *bfad); |
33 | void (*gettimeofday)(struct bfa_timeval_s *tv); | 35 | void (*gettimeofday)(struct bfa_timeval_s *tv); |
34 | struct bfa_trc_mod_s *trcmod; | 36 | struct bfa_trc_mod_s *trcmod; |
35 | struct bfa_aen_entry_s list[BFA_AEN_MAX_ENTRY]; /* Must be the last */ | 37 | int app_ri[BFA_AEN_MAX_APP]; /* For multiclient support */ |
38 | struct bfa_aen_entry_s list[BFA_AEN_MAX_ENTRY]; /* Must be the last */ | ||
36 | }; | 39 | }; |
37 | 40 | ||
38 | 41 | ||
@@ -45,48 +48,49 @@ bfa_aen_set_max_cfg_entry(int max_entry) | |||
45 | bfa_aen_max_cfg_entry = max_entry; | 48 | bfa_aen_max_cfg_entry = max_entry; |
46 | } | 49 | } |
47 | 50 | ||
48 | static inline s32 | 51 | static inline int |
49 | bfa_aen_get_max_cfg_entry(void) | 52 | bfa_aen_get_max_cfg_entry(void) |
50 | { | 53 | { |
51 | return bfa_aen_max_cfg_entry; | 54 | return bfa_aen_max_cfg_entry; |
52 | } | 55 | } |
53 | 56 | ||
54 | static inline s32 | 57 | static inline int |
55 | bfa_aen_get_meminfo(void) | 58 | bfa_aen_get_meminfo(void) |
56 | { | 59 | { |
57 | return sizeof(struct bfa_aen_entry_s) * bfa_aen_get_max_cfg_entry(); | 60 | return sizeof(struct bfa_aen_entry_s) * bfa_aen_get_max_cfg_entry(); |
58 | } | 61 | } |
59 | 62 | ||
60 | static inline s32 | 63 | static inline int |
61 | bfa_aen_get_wi(struct bfa_aen_s *aen) | 64 | bfa_aen_get_wi(struct bfa_aen_s *aen) |
62 | { | 65 | { |
63 | return aen->write_index; | 66 | return aen->write_index; |
64 | } | 67 | } |
65 | 68 | ||
66 | static inline s32 | 69 | static inline int |
67 | bfa_aen_get_ri(struct bfa_aen_s *aen) | 70 | bfa_aen_get_ri(struct bfa_aen_s *aen) |
68 | { | 71 | { |
69 | return aen->read_index; | 72 | return aen->read_index; |
70 | } | 73 | } |
71 | 74 | ||
72 | static inline s32 | 75 | static inline int |
73 | bfa_aen_fetch_count(struct bfa_aen_s *aen, s32 read_index) | 76 | bfa_aen_fetch_count(struct bfa_aen_s *aen, enum bfa_aen_app app_id) |
74 | { | 77 | { |
75 | return ((aen->write_index + aen->max_entry) - read_index) | 78 | bfa_assert((app_id < BFA_AEN_MAX_APP) && (app_id >= bfa_aen_app_bcu)); |
79 | return ((aen->write_index + aen->max_entry) - aen->app_ri[app_id]) | ||
76 | % aen->max_entry; | 80 | % aen->max_entry; |
77 | } | 81 | } |
78 | 82 | ||
79 | s32 bfa_aen_init(struct bfa_aen_s *aen, struct bfa_trc_mod_s *trcmod, | 83 | int bfa_aen_init(struct bfa_aen_s *aen, struct bfa_trc_mod_s *trcmod, |
80 | void *bfad, u32 inst_id, void (*aen_cb_notify)(void *), | 84 | void *bfad, int bfad_num, void (*aen_cb_notify)(void *), |
81 | void (*gettimeofday)(struct bfa_timeval_s *)); | 85 | void (*gettimeofday)(struct bfa_timeval_s *)); |
82 | 86 | ||
83 | s32 bfa_aen_post(struct bfa_aen_s *aen, enum bfa_aen_category aen_category, | 87 | void bfa_aen_post(struct bfa_aen_s *aen, enum bfa_aen_category aen_category, |
84 | int aen_type, union bfa_aen_data_u *aen_data); | 88 | int aen_type, union bfa_aen_data_u *aen_data); |
85 | 89 | ||
86 | s32 bfa_aen_fetch(struct bfa_aen_s *aen, struct bfa_aen_entry_s *aen_entry, | 90 | bfa_status_t bfa_aen_fetch(struct bfa_aen_s *aen, |
87 | s32 entry_space, s32 rii, s32 *ri_arr, | 91 | struct bfa_aen_entry_s *aen_entry, |
88 | s32 ri_arr_cnt); | 92 | int entry_req, enum bfa_aen_app app_id, int *entry_ret); |
89 | 93 | ||
90 | s32 bfa_aen_get_inst(struct bfa_aen_s *aen); | 94 | int bfa_aen_get_inst(struct bfa_aen_s *aen); |
91 | 95 | ||
92 | #endif /* __BFA_AEN_H__ */ | 96 | #endif /* __BFA_AEN_H__ */ |
diff --git a/drivers/scsi/bfa/include/bfa.h b/drivers/scsi/bfa/include/bfa.h index d4bc0d9fa42c..1f5966cfbd16 100644 --- a/drivers/scsi/bfa/include/bfa.h +++ b/drivers/scsi/bfa/include/bfa.h | |||
@@ -106,6 +106,26 @@ struct bfa_sge_s { | |||
106 | bfa_ioc_fetch_stats(&(__bfa)->ioc, __ioc_stats) | 106 | bfa_ioc_fetch_stats(&(__bfa)->ioc, __ioc_stats) |
107 | #define bfa_ioc_clear_stats(__bfa) \ | 107 | #define bfa_ioc_clear_stats(__bfa) \ |
108 | bfa_ioc_clr_stats(&(__bfa)->ioc) | 108 | bfa_ioc_clr_stats(&(__bfa)->ioc) |
109 | #define bfa_get_nports(__bfa) \ | ||
110 | bfa_ioc_get_nports(&(__bfa)->ioc) | ||
111 | #define bfa_get_adapter_manufacturer(__bfa, __manufacturer) \ | ||
112 | bfa_ioc_get_adapter_manufacturer(&(__bfa)->ioc, __manufacturer) | ||
113 | #define bfa_get_adapter_model(__bfa, __model) \ | ||
114 | bfa_ioc_get_adapter_model(&(__bfa)->ioc, __model) | ||
115 | #define bfa_get_adapter_serial_num(__bfa, __serial_num) \ | ||
116 | bfa_ioc_get_adapter_serial_num(&(__bfa)->ioc, __serial_num) | ||
117 | #define bfa_get_adapter_fw_ver(__bfa, __fw_ver) \ | ||
118 | bfa_ioc_get_adapter_fw_ver(&(__bfa)->ioc, __fw_ver) | ||
119 | #define bfa_get_adapter_optrom_ver(__bfa, __optrom_ver) \ | ||
120 | bfa_ioc_get_adapter_optrom_ver(&(__bfa)->ioc, __optrom_ver) | ||
121 | #define bfa_get_pci_chip_rev(__bfa, __chip_rev) \ | ||
122 | bfa_ioc_get_pci_chip_rev(&(__bfa)->ioc, __chip_rev) | ||
123 | #define bfa_get_ioc_state(__bfa) \ | ||
124 | bfa_ioc_get_state(&(__bfa)->ioc) | ||
125 | #define bfa_get_type(__bfa) \ | ||
126 | bfa_ioc_get_type(&(__bfa)->ioc) | ||
127 | #define bfa_get_mac(__bfa) \ | ||
128 | bfa_ioc_get_mac(&(__bfa)->ioc) | ||
109 | 129 | ||
110 | /* | 130 | /* |
111 | * bfa API functions | 131 | * bfa API functions |
@@ -161,6 +181,7 @@ bfa_status_t bfa_iocfc_israttr_set(struct bfa_s *bfa, | |||
161 | void bfa_iocfc_enable(struct bfa_s *bfa); | 181 | void bfa_iocfc_enable(struct bfa_s *bfa); |
162 | void bfa_iocfc_disable(struct bfa_s *bfa); | 182 | void bfa_iocfc_disable(struct bfa_s *bfa); |
163 | void bfa_ioc_auto_recover(bfa_boolean_t auto_recover); | 183 | void bfa_ioc_auto_recover(bfa_boolean_t auto_recover); |
184 | void bfa_chip_reset(struct bfa_s *bfa); | ||
164 | void bfa_cb_ioc_disable(void *bfad); | 185 | void bfa_cb_ioc_disable(void *bfad); |
165 | void bfa_timer_tick(struct bfa_s *bfa); | 186 | void bfa_timer_tick(struct bfa_s *bfa); |
166 | #define bfa_timer_start(_bfa, _timer, _timercb, _arg, _timeout) \ | 187 | #define bfa_timer_start(_bfa, _timer, _timercb, _arg, _timeout) \ |
@@ -171,6 +192,7 @@ void bfa_timer_tick(struct bfa_s *bfa); | |||
171 | */ | 192 | */ |
172 | bfa_status_t bfa_debug_fwtrc(struct bfa_s *bfa, void *trcdata, int *trclen); | 193 | bfa_status_t bfa_debug_fwtrc(struct bfa_s *bfa, void *trcdata, int *trclen); |
173 | bfa_status_t bfa_debug_fwsave(struct bfa_s *bfa, void *trcdata, int *trclen); | 194 | bfa_status_t bfa_debug_fwsave(struct bfa_s *bfa, void *trcdata, int *trclen); |
195 | void bfa_debug_fwsave_clear(struct bfa_s *bfa); | ||
174 | 196 | ||
175 | #include "bfa_priv.h" | 197 | #include "bfa_priv.h" |
176 | 198 | ||
diff --git a/drivers/scsi/bfa/include/bfa_svc.h b/drivers/scsi/bfa/include/bfa_svc.h index 268d956bad89..1349b99a3c6d 100644 --- a/drivers/scsi/bfa/include/bfa_svc.h +++ b/drivers/scsi/bfa/include/bfa_svc.h | |||
@@ -26,6 +26,7 @@ struct bfa_fcxp_s; | |||
26 | #include <defs/bfa_defs_pport.h> | 26 | #include <defs/bfa_defs_pport.h> |
27 | #include <defs/bfa_defs_rport.h> | 27 | #include <defs/bfa_defs_rport.h> |
28 | #include <defs/bfa_defs_qos.h> | 28 | #include <defs/bfa_defs_qos.h> |
29 | #include <defs/bfa_defs_fcport.h> | ||
29 | #include <cs/bfa_sm.h> | 30 | #include <cs/bfa_sm.h> |
30 | #include <bfa.h> | 31 | #include <bfa.h> |
31 | 32 | ||
@@ -35,7 +36,7 @@ struct bfa_fcxp_s; | |||
35 | struct bfa_rport_info_s { | 36 | struct bfa_rport_info_s { |
36 | u16 max_frmsz; /* max rcv pdu size */ | 37 | u16 max_frmsz; /* max rcv pdu size */ |
37 | u32 pid:24, /* remote port ID */ | 38 | u32 pid:24, /* remote port ID */ |
38 | lp_tag:8; | 39 | lp_tag:8; /* tag */ |
39 | u32 local_pid:24, /* local port ID */ | 40 | u32 local_pid:24, /* local port ID */ |
40 | cisc:8; /* CIRO supported */ | 41 | cisc:8; /* CIRO supported */ |
41 | u8 fc_class; /* supported FC classes. enum fc_cos */ | 42 | u8 fc_class; /* supported FC classes. enum fc_cos */ |
@@ -54,7 +55,7 @@ struct bfa_rport_s { | |||
54 | void *rport_drv; /* fcs/driver rport object */ | 55 | void *rport_drv; /* fcs/driver rport object */ |
55 | u16 fw_handle; /* firmware rport handle */ | 56 | u16 fw_handle; /* firmware rport handle */ |
56 | u16 rport_tag; /* BFA rport tag */ | 57 | u16 rport_tag; /* BFA rport tag */ |
57 | struct bfa_rport_info_s rport_info; /* rport info from *fcs/driver */ | 58 | struct bfa_rport_info_s rport_info; /* rport info from fcs/driver */ |
58 | struct bfa_reqq_wait_s reqq_wait; /* to wait for room in reqq */ | 59 | struct bfa_reqq_wait_s reqq_wait; /* to wait for room in reqq */ |
59 | struct bfa_cb_qe_s hcb_qe; /* BFA callback qelem */ | 60 | struct bfa_cb_qe_s hcb_qe; /* BFA callback qelem */ |
60 | struct bfa_rport_hal_stats_s stats; /* BFA rport statistics */ | 61 | struct bfa_rport_hal_stats_s stats; /* BFA rport statistics */ |
@@ -101,7 +102,7 @@ struct bfa_uf_buf_s { | |||
101 | struct bfa_uf_s { | 102 | struct bfa_uf_s { |
102 | struct list_head qe; /* queue element */ | 103 | struct list_head qe; /* queue element */ |
103 | struct bfa_s *bfa; /* bfa instance */ | 104 | struct bfa_s *bfa; /* bfa instance */ |
104 | u16 uf_tag; /* identifying tag f/w messages */ | 105 | u16 uf_tag; /* identifying tag fw msgs */ |
105 | u16 vf_id; | 106 | u16 vf_id; |
106 | u16 src_rport_handle; | 107 | u16 src_rport_handle; |
107 | u16 rsvd; | 108 | u16 rsvd; |
@@ -127,7 +128,7 @@ struct bfa_lps_s { | |||
127 | u8 reqq; /* lport request queue */ | 128 | u8 reqq; /* lport request queue */ |
128 | u8 alpa; /* ALPA for loop topologies */ | 129 | u8 alpa; /* ALPA for loop topologies */ |
129 | u32 lp_pid; /* lport port ID */ | 130 | u32 lp_pid; /* lport port ID */ |
130 | bfa_boolean_t fdisc; /* send FDISC instead of FLOGI*/ | 131 | bfa_boolean_t fdisc; /* send FDISC instead of FLOGI */ |
131 | bfa_boolean_t auth_en; /* enable authentication */ | 132 | bfa_boolean_t auth_en; /* enable authentication */ |
132 | bfa_boolean_t auth_req; /* authentication required */ | 133 | bfa_boolean_t auth_req; /* authentication required */ |
133 | bfa_boolean_t npiv_en; /* NPIV is allowed by peer */ | 134 | bfa_boolean_t npiv_en; /* NPIV is allowed by peer */ |
@@ -151,60 +152,69 @@ struct bfa_lps_s { | |||
151 | bfa_eproto_status_t ext_status; | 152 | bfa_eproto_status_t ext_status; |
152 | }; | 153 | }; |
153 | 154 | ||
155 | #define BFA_FCPORT(_bfa) (&((_bfa)->modules.port)) | ||
156 | |||
154 | /* | 157 | /* |
155 | * bfa pport API functions | 158 | * bfa pport API functions |
156 | */ | 159 | */ |
157 | bfa_status_t bfa_pport_enable(struct bfa_s *bfa); | 160 | bfa_status_t bfa_fcport_enable(struct bfa_s *bfa); |
158 | bfa_status_t bfa_pport_disable(struct bfa_s *bfa); | 161 | bfa_status_t bfa_fcport_disable(struct bfa_s *bfa); |
159 | bfa_status_t bfa_pport_cfg_speed(struct bfa_s *bfa, | 162 | bfa_status_t bfa_fcport_cfg_speed(struct bfa_s *bfa, |
160 | enum bfa_pport_speed speed); | 163 | enum bfa_pport_speed speed); |
161 | enum bfa_pport_speed bfa_pport_get_speed(struct bfa_s *bfa); | 164 | enum bfa_pport_speed bfa_fcport_get_speed(struct bfa_s *bfa); |
162 | bfa_status_t bfa_pport_cfg_topology(struct bfa_s *bfa, | 165 | bfa_status_t bfa_fcport_cfg_topology(struct bfa_s *bfa, |
163 | enum bfa_pport_topology topo); | 166 | enum bfa_pport_topology topo); |
164 | enum bfa_pport_topology bfa_pport_get_topology(struct bfa_s *bfa); | 167 | enum bfa_pport_topology bfa_fcport_get_topology(struct bfa_s *bfa); |
165 | bfa_status_t bfa_pport_cfg_hardalpa(struct bfa_s *bfa, u8 alpa); | 168 | bfa_status_t bfa_fcport_cfg_hardalpa(struct bfa_s *bfa, u8 alpa); |
166 | bfa_boolean_t bfa_pport_get_hardalpa(struct bfa_s *bfa, u8 *alpa); | 169 | bfa_boolean_t bfa_fcport_get_hardalpa(struct bfa_s *bfa, u8 *alpa); |
167 | u8 bfa_pport_get_myalpa(struct bfa_s *bfa); | 170 | u8 bfa_fcport_get_myalpa(struct bfa_s *bfa); |
168 | bfa_status_t bfa_pport_clr_hardalpa(struct bfa_s *bfa); | 171 | bfa_status_t bfa_fcport_clr_hardalpa(struct bfa_s *bfa); |
169 | bfa_status_t bfa_pport_cfg_maxfrsize(struct bfa_s *bfa, u16 maxsize); | 172 | bfa_status_t bfa_fcport_cfg_maxfrsize(struct bfa_s *bfa, u16 maxsize); |
170 | u16 bfa_pport_get_maxfrsize(struct bfa_s *bfa); | 173 | u16 bfa_fcport_get_maxfrsize(struct bfa_s *bfa); |
171 | u32 bfa_pport_mypid(struct bfa_s *bfa); | 174 | u32 bfa_fcport_mypid(struct bfa_s *bfa); |
172 | u8 bfa_pport_get_rx_bbcredit(struct bfa_s *bfa); | 175 | u8 bfa_fcport_get_rx_bbcredit(struct bfa_s *bfa); |
173 | bfa_status_t bfa_pport_trunk_enable(struct bfa_s *bfa, u8 bitmap); | 176 | bfa_status_t bfa_fcport_trunk_enable(struct bfa_s *bfa, u8 bitmap); |
174 | bfa_status_t bfa_pport_trunk_disable(struct bfa_s *bfa); | 177 | bfa_status_t bfa_fcport_trunk_disable(struct bfa_s *bfa); |
175 | bfa_boolean_t bfa_pport_trunk_query(struct bfa_s *bfa, u32 *bitmap); | 178 | bfa_boolean_t bfa_fcport_trunk_query(struct bfa_s *bfa, u32 *bitmap); |
176 | void bfa_pport_get_attr(struct bfa_s *bfa, struct bfa_pport_attr_s *attr); | 179 | void bfa_fcport_get_attr(struct bfa_s *bfa, struct bfa_pport_attr_s *attr); |
177 | wwn_t bfa_pport_get_wwn(struct bfa_s *bfa, bfa_boolean_t node); | 180 | wwn_t bfa_fcport_get_wwn(struct bfa_s *bfa, bfa_boolean_t node); |
178 | bfa_status_t bfa_pport_get_stats(struct bfa_s *bfa, | 181 | void bfa_fcport_event_register(struct bfa_s *bfa, |
179 | union bfa_pport_stats_u *stats, | ||
180 | bfa_cb_pport_t cbfn, void *cbarg); | ||
181 | bfa_status_t bfa_pport_clear_stats(struct bfa_s *bfa, bfa_cb_pport_t cbfn, | ||
182 | void *cbarg); | ||
183 | void bfa_pport_event_register(struct bfa_s *bfa, | ||
184 | void (*event_cbfn) (void *cbarg, | 182 | void (*event_cbfn) (void *cbarg, |
185 | bfa_pport_event_t event), void *event_cbarg); | 183 | bfa_pport_event_t event), void *event_cbarg); |
186 | bfa_boolean_t bfa_pport_is_disabled(struct bfa_s *bfa); | 184 | bfa_boolean_t bfa_fcport_is_disabled(struct bfa_s *bfa); |
187 | void bfa_pport_cfg_qos(struct bfa_s *bfa, bfa_boolean_t on_off); | 185 | void bfa_fcport_cfg_qos(struct bfa_s *bfa, bfa_boolean_t on_off); |
188 | void bfa_pport_cfg_ratelim(struct bfa_s *bfa, bfa_boolean_t on_off); | 186 | void bfa_fcport_cfg_ratelim(struct bfa_s *bfa, bfa_boolean_t on_off); |
189 | bfa_status_t bfa_pport_cfg_ratelim_speed(struct bfa_s *bfa, | 187 | bfa_status_t bfa_fcport_cfg_ratelim_speed(struct bfa_s *bfa, |
190 | enum bfa_pport_speed speed); | 188 | enum bfa_pport_speed speed); |
191 | enum bfa_pport_speed bfa_pport_get_ratelim_speed(struct bfa_s *bfa); | 189 | enum bfa_pport_speed bfa_fcport_get_ratelim_speed(struct bfa_s *bfa); |
192 | 190 | ||
193 | void bfa_pport_set_tx_bbcredit(struct bfa_s *bfa, u16 tx_bbcredit); | 191 | void bfa_fcport_set_tx_bbcredit(struct bfa_s *bfa, u16 tx_bbcredit); |
194 | void bfa_pport_busy(struct bfa_s *bfa, bfa_boolean_t status); | 192 | void bfa_fcport_busy(struct bfa_s *bfa, bfa_boolean_t status); |
195 | void bfa_pport_beacon(struct bfa_s *bfa, bfa_boolean_t beacon, | 193 | void bfa_fcport_beacon(struct bfa_s *bfa, bfa_boolean_t beacon, |
196 | bfa_boolean_t link_e2e_beacon); | 194 | bfa_boolean_t link_e2e_beacon); |
197 | void bfa_cb_pport_event(void *cbarg, bfa_pport_event_t event); | 195 | void bfa_cb_pport_event(void *cbarg, bfa_pport_event_t event); |
198 | void bfa_pport_qos_get_attr(struct bfa_s *bfa, struct bfa_qos_attr_s *qos_attr); | 196 | void bfa_fcport_qos_get_attr(struct bfa_s *bfa, |
199 | void bfa_pport_qos_get_vc_attr(struct bfa_s *bfa, | 197 | struct bfa_qos_attr_s *qos_attr); |
198 | void bfa_fcport_qos_get_vc_attr(struct bfa_s *bfa, | ||
200 | struct bfa_qos_vc_attr_s *qos_vc_attr); | 199 | struct bfa_qos_vc_attr_s *qos_vc_attr); |
201 | bfa_status_t bfa_pport_get_qos_stats(struct bfa_s *bfa, | 200 | bfa_status_t bfa_fcport_get_qos_stats(struct bfa_s *bfa, |
202 | union bfa_pport_stats_u *stats, | 201 | union bfa_fcport_stats_u *stats, |
203 | bfa_cb_pport_t cbfn, void *cbarg); | 202 | bfa_cb_pport_t cbfn, void *cbarg); |
204 | bfa_status_t bfa_pport_clear_qos_stats(struct bfa_s *bfa, bfa_cb_pport_t cbfn, | 203 | bfa_status_t bfa_fcport_clear_qos_stats(struct bfa_s *bfa, bfa_cb_pport_t cbfn, |
205 | void *cbarg); | 204 | void *cbarg); |
206 | bfa_boolean_t bfa_pport_is_ratelim(struct bfa_s *bfa); | 205 | bfa_status_t bfa_fcport_get_fcoe_stats(struct bfa_s *bfa, |
207 | bfa_boolean_t bfa_pport_is_linkup(struct bfa_s *bfa); | 206 | union bfa_fcport_stats_u *stats, |
207 | bfa_cb_pport_t cbfn, void *cbarg); | ||
208 | bfa_status_t bfa_fcport_clear_fcoe_stats(struct bfa_s *bfa, bfa_cb_pport_t cbfn, | ||
209 | void *cbarg); | ||
210 | |||
211 | bfa_boolean_t bfa_fcport_is_ratelim(struct bfa_s *bfa); | ||
212 | bfa_boolean_t bfa_fcport_is_linkup(struct bfa_s *bfa); | ||
213 | bfa_status_t bfa_fcport_get_stats(struct bfa_s *bfa, | ||
214 | union bfa_fcport_stats_u *stats, | ||
215 | bfa_cb_pport_t cbfn, void *cbarg); | ||
216 | bfa_status_t bfa_fcport_clear_stats(struct bfa_s *bfa, bfa_cb_pport_t cbfn, | ||
217 | void *cbarg); | ||
208 | 218 | ||
209 | /* | 219 | /* |
210 | * bfa rport API functions | 220 | * bfa rport API functions |
@@ -293,6 +303,7 @@ void bfa_uf_free(struct bfa_uf_s *uf); | |||
293 | * bfa lport service api | 303 | * bfa lport service api |
294 | */ | 304 | */ |
295 | 305 | ||
306 | u32 bfa_lps_get_max_vport(struct bfa_s *bfa); | ||
296 | struct bfa_lps_s *bfa_lps_alloc(struct bfa_s *bfa); | 307 | struct bfa_lps_s *bfa_lps_alloc(struct bfa_s *bfa); |
297 | void bfa_lps_delete(struct bfa_lps_s *lps); | 308 | void bfa_lps_delete(struct bfa_lps_s *lps); |
298 | void bfa_lps_discard(struct bfa_lps_s *lps); | 309 | void bfa_lps_discard(struct bfa_lps_s *lps); |
@@ -315,10 +326,12 @@ wwn_t bfa_lps_get_peer_pwwn(struct bfa_lps_s *lps); | |||
315 | wwn_t bfa_lps_get_peer_nwwn(struct bfa_lps_s *lps); | 326 | wwn_t bfa_lps_get_peer_nwwn(struct bfa_lps_s *lps); |
316 | u8 bfa_lps_get_lsrjt_rsn(struct bfa_lps_s *lps); | 327 | u8 bfa_lps_get_lsrjt_rsn(struct bfa_lps_s *lps); |
317 | u8 bfa_lps_get_lsrjt_expl(struct bfa_lps_s *lps); | 328 | u8 bfa_lps_get_lsrjt_expl(struct bfa_lps_s *lps); |
329 | mac_t bfa_lps_get_lp_mac(struct bfa_lps_s *lps); | ||
318 | void bfa_cb_lps_flogi_comp(void *bfad, void *uarg, bfa_status_t status); | 330 | void bfa_cb_lps_flogi_comp(void *bfad, void *uarg, bfa_status_t status); |
319 | void bfa_cb_lps_flogo_comp(void *bfad, void *uarg); | 331 | void bfa_cb_lps_flogo_comp(void *bfad, void *uarg); |
320 | void bfa_cb_lps_fdisc_comp(void *bfad, void *uarg, bfa_status_t status); | 332 | void bfa_cb_lps_fdisc_comp(void *bfad, void *uarg, bfa_status_t status); |
321 | void bfa_cb_lps_fdisclogo_comp(void *bfad, void *uarg); | 333 | void bfa_cb_lps_fdisclogo_comp(void *bfad, void *uarg); |
334 | void bfa_cb_lps_cvl_event(void *bfad, void *uarg); | ||
322 | 335 | ||
323 | #endif /* __BFA_SVC_H__ */ | 336 | #endif /* __BFA_SVC_H__ */ |
324 | 337 | ||
diff --git a/drivers/scsi/bfa/include/bfa_timer.h b/drivers/scsi/bfa/include/bfa_timer.h index e407103fa565..f71087448222 100644 --- a/drivers/scsi/bfa/include/bfa_timer.h +++ b/drivers/scsi/bfa/include/bfa_timer.h | |||
@@ -41,7 +41,7 @@ struct bfa_timer_mod_s { | |||
41 | struct list_head timer_q; | 41 | struct list_head timer_q; |
42 | }; | 42 | }; |
43 | 43 | ||
44 | #define BFA_TIMER_FREQ 500 /**< specified in millisecs */ | 44 | #define BFA_TIMER_FREQ 200 /**< specified in millisecs */ |
45 | 45 | ||
46 | void bfa_timer_beat(struct bfa_timer_mod_s *mod); | 46 | void bfa_timer_beat(struct bfa_timer_mod_s *mod); |
47 | void bfa_timer_init(struct bfa_timer_mod_s *mod); | 47 | void bfa_timer_init(struct bfa_timer_mod_s *mod); |
diff --git a/drivers/scsi/bfa/include/bfi/bfi.h b/drivers/scsi/bfa/include/bfi/bfi.h index 7042c18e542d..a550e80cabd2 100644 --- a/drivers/scsi/bfa/include/bfi/bfi.h +++ b/drivers/scsi/bfa/include/bfi/bfi.h | |||
@@ -143,8 +143,8 @@ enum bfi_mclass { | |||
143 | BFI_MC_IOC = 1, /* IO Controller (IOC) */ | 143 | BFI_MC_IOC = 1, /* IO Controller (IOC) */ |
144 | BFI_MC_DIAG = 2, /* Diagnostic Msgs */ | 144 | BFI_MC_DIAG = 2, /* Diagnostic Msgs */ |
145 | BFI_MC_FLASH = 3, /* Flash message class */ | 145 | BFI_MC_FLASH = 3, /* Flash message class */ |
146 | BFI_MC_CEE = 4, | 146 | BFI_MC_CEE = 4, /* CEE */ |
147 | BFI_MC_FC_PORT = 5, /* FC port */ | 147 | BFI_MC_FCPORT = 5, /* FC port */ |
148 | BFI_MC_IOCFC = 6, /* FC - IO Controller (IOC) */ | 148 | BFI_MC_IOCFC = 6, /* FC - IO Controller (IOC) */ |
149 | BFI_MC_LL = 7, /* Link Layer */ | 149 | BFI_MC_LL = 7, /* Link Layer */ |
150 | BFI_MC_UF = 8, /* Unsolicited frame receive */ | 150 | BFI_MC_UF = 8, /* Unsolicited frame receive */ |
diff --git a/drivers/scsi/bfa/include/bfi/bfi_cbreg.h b/drivers/scsi/bfa/include/bfi/bfi_cbreg.h index b3bb52b565b1..a51ee61ddb19 100644 --- a/drivers/scsi/bfa/include/bfi/bfi_cbreg.h +++ b/drivers/scsi/bfa/include/bfi/bfi_cbreg.h | |||
@@ -177,7 +177,21 @@ | |||
177 | #define __PSS_LMEM_INIT_EN 0x00000100 | 177 | #define __PSS_LMEM_INIT_EN 0x00000100 |
178 | #define __PSS_LPU1_RESET 0x00000002 | 178 | #define __PSS_LPU1_RESET 0x00000002 |
179 | #define __PSS_LPU0_RESET 0x00000001 | 179 | #define __PSS_LPU0_RESET 0x00000001 |
180 | 180 | #define PSS_ERR_STATUS_REG 0x00018810 | |
181 | #define __PSS_LMEM1_CORR_ERR 0x00000800 | ||
182 | #define __PSS_LMEM0_CORR_ERR 0x00000400 | ||
183 | #define __PSS_LMEM1_UNCORR_ERR 0x00000200 | ||
184 | #define __PSS_LMEM0_UNCORR_ERR 0x00000100 | ||
185 | #define __PSS_BAL_PERR 0x00000080 | ||
186 | #define __PSS_DIP_IF_ERR 0x00000040 | ||
187 | #define __PSS_IOH_IF_ERR 0x00000020 | ||
188 | #define __PSS_TDS_IF_ERR 0x00000010 | ||
189 | #define __PSS_RDS_IF_ERR 0x00000008 | ||
190 | #define __PSS_SGM_IF_ERR 0x00000004 | ||
191 | #define __PSS_LPU1_RAM_ERR 0x00000002 | ||
192 | #define __PSS_LPU0_RAM_ERR 0x00000001 | ||
193 | #define ERR_SET_REG 0x00018818 | ||
194 | #define __PSS_ERR_STATUS_SET 0x00000fff | ||
181 | 195 | ||
182 | /* | 196 | /* |
183 | * These definitions are either in error/missing in spec. Its auto-generated | 197 | * These definitions are either in error/missing in spec. Its auto-generated |
diff --git a/drivers/scsi/bfa/include/bfi/bfi_ctreg.h b/drivers/scsi/bfa/include/bfi/bfi_ctreg.h index d3caa58c0a0a..57a8497105af 100644 --- a/drivers/scsi/bfa/include/bfi/bfi_ctreg.h +++ b/drivers/scsi/bfa/include/bfi/bfi_ctreg.h | |||
@@ -430,6 +430,31 @@ enum { | |||
430 | #define __PSS_LMEM_INIT_EN 0x00000100 | 430 | #define __PSS_LMEM_INIT_EN 0x00000100 |
431 | #define __PSS_LPU1_RESET 0x00000002 | 431 | #define __PSS_LPU1_RESET 0x00000002 |
432 | #define __PSS_LPU0_RESET 0x00000001 | 432 | #define __PSS_LPU0_RESET 0x00000001 |
433 | #define PSS_ERR_STATUS_REG 0x00018810 | ||
434 | #define __PSS_LPU1_TCM_READ_ERR 0x00200000 | ||
435 | #define __PSS_LPU0_TCM_READ_ERR 0x00100000 | ||
436 | #define __PSS_LMEM5_CORR_ERR 0x00080000 | ||
437 | #define __PSS_LMEM4_CORR_ERR 0x00040000 | ||
438 | #define __PSS_LMEM3_CORR_ERR 0x00020000 | ||
439 | #define __PSS_LMEM2_CORR_ERR 0x00010000 | ||
440 | #define __PSS_LMEM1_CORR_ERR 0x00008000 | ||
441 | #define __PSS_LMEM0_CORR_ERR 0x00004000 | ||
442 | #define __PSS_LMEM5_UNCORR_ERR 0x00002000 | ||
443 | #define __PSS_LMEM4_UNCORR_ERR 0x00001000 | ||
444 | #define __PSS_LMEM3_UNCORR_ERR 0x00000800 | ||
445 | #define __PSS_LMEM2_UNCORR_ERR 0x00000400 | ||
446 | #define __PSS_LMEM1_UNCORR_ERR 0x00000200 | ||
447 | #define __PSS_LMEM0_UNCORR_ERR 0x00000100 | ||
448 | #define __PSS_BAL_PERR 0x00000080 | ||
449 | #define __PSS_DIP_IF_ERR 0x00000040 | ||
450 | #define __PSS_IOH_IF_ERR 0x00000020 | ||
451 | #define __PSS_TDS_IF_ERR 0x00000010 | ||
452 | #define __PSS_RDS_IF_ERR 0x00000008 | ||
453 | #define __PSS_SGM_IF_ERR 0x00000004 | ||
454 | #define __PSS_LPU1_RAM_ERR 0x00000002 | ||
455 | #define __PSS_LPU0_RAM_ERR 0x00000001 | ||
456 | #define ERR_SET_REG 0x00018818 | ||
457 | #define __PSS_ERR_STATUS_SET 0x003fffff | ||
433 | #define HQM_QSET0_RXQ_DRBL_P0 0x00038000 | 458 | #define HQM_QSET0_RXQ_DRBL_P0 0x00038000 |
434 | #define __RXQ0_ADD_VECTORS_P 0x80000000 | 459 | #define __RXQ0_ADD_VECTORS_P 0x80000000 |
435 | #define __RXQ0_STOP_P 0x40000000 | 460 | #define __RXQ0_STOP_P 0x40000000 |
@@ -589,6 +614,7 @@ enum { | |||
589 | #define __HFN_INT_MBOX_LPU1 0x00200000U | 614 | #define __HFN_INT_MBOX_LPU1 0x00200000U |
590 | #define __HFN_INT_MBOX1_LPU0 0x00400000U | 615 | #define __HFN_INT_MBOX1_LPU0 0x00400000U |
591 | #define __HFN_INT_MBOX1_LPU1 0x00800000U | 616 | #define __HFN_INT_MBOX1_LPU1 0x00800000U |
617 | #define __HFN_INT_LL_HALT 0x01000000U | ||
592 | #define __HFN_INT_CPE_MASK 0x000000ffU | 618 | #define __HFN_INT_CPE_MASK 0x000000ffU |
593 | #define __HFN_INT_RME_MASK 0x0000ff00U | 619 | #define __HFN_INT_RME_MASK 0x0000ff00U |
594 | 620 | ||
diff --git a/drivers/scsi/bfa/include/bfi/bfi_ioc.h b/drivers/scsi/bfa/include/bfi/bfi_ioc.h index 96ef05670659..a0158aac0024 100644 --- a/drivers/scsi/bfa/include/bfi/bfi_ioc.h +++ b/drivers/scsi/bfa/include/bfi/bfi_ioc.h | |||
@@ -123,7 +123,7 @@ enum bfi_ioc_state { | |||
123 | BFI_IOC_DISABLING = 5, /* IOC is being disabled */ | 123 | BFI_IOC_DISABLING = 5, /* IOC is being disabled */ |
124 | BFI_IOC_DISABLED = 6, /* IOC is disabled */ | 124 | BFI_IOC_DISABLED = 6, /* IOC is disabled */ |
125 | BFI_IOC_CFG_DISABLED = 7, /* IOC is being disabled;transient */ | 125 | BFI_IOC_CFG_DISABLED = 7, /* IOC is being disabled;transient */ |
126 | BFI_IOC_HBFAIL = 8, /* IOC heart-beat failure */ | 126 | BFI_IOC_FAIL = 8, /* IOC heart-beat failure */ |
127 | BFI_IOC_MEMTEST = 9, /* IOC is doing memtest */ | 127 | BFI_IOC_MEMTEST = 9, /* IOC is doing memtest */ |
128 | }; | 128 | }; |
129 | 129 | ||
diff --git a/drivers/scsi/bfa/include/bfi/bfi_lps.h b/drivers/scsi/bfa/include/bfi/bfi_lps.h index c59d47badb4b..7ed31bbb8696 100644 --- a/drivers/scsi/bfa/include/bfi/bfi_lps.h +++ b/drivers/scsi/bfa/include/bfi/bfi_lps.h | |||
@@ -30,6 +30,7 @@ enum bfi_lps_h2i_msgs { | |||
30 | enum bfi_lps_i2h_msgs { | 30 | enum bfi_lps_i2h_msgs { |
31 | BFI_LPS_H2I_LOGIN_RSP = BFA_I2HM(1), | 31 | BFI_LPS_H2I_LOGIN_RSP = BFA_I2HM(1), |
32 | BFI_LPS_H2I_LOGOUT_RSP = BFA_I2HM(2), | 32 | BFI_LPS_H2I_LOGOUT_RSP = BFA_I2HM(2), |
33 | BFI_LPS_H2I_CVL_EVENT = BFA_I2HM(3), | ||
33 | }; | 34 | }; |
34 | 35 | ||
35 | struct bfi_lps_login_req_s { | 36 | struct bfi_lps_login_req_s { |
@@ -77,6 +78,12 @@ struct bfi_lps_logout_rsp_s { | |||
77 | u8 rsvd[2]; | 78 | u8 rsvd[2]; |
78 | }; | 79 | }; |
79 | 80 | ||
81 | struct bfi_lps_cvl_event_s { | ||
82 | struct bfi_mhdr_s mh; /* common msg header */ | ||
83 | u8 lp_tag; | ||
84 | u8 rsvd[3]; | ||
85 | }; | ||
86 | |||
80 | union bfi_lps_h2i_msg_u { | 87 | union bfi_lps_h2i_msg_u { |
81 | struct bfi_mhdr_s *msg; | 88 | struct bfi_mhdr_s *msg; |
82 | struct bfi_lps_login_req_s *login_req; | 89 | struct bfi_lps_login_req_s *login_req; |
@@ -87,6 +94,7 @@ union bfi_lps_i2h_msg_u { | |||
87 | struct bfi_msg_s *msg; | 94 | struct bfi_msg_s *msg; |
88 | struct bfi_lps_login_rsp_s *login_rsp; | 95 | struct bfi_lps_login_rsp_s *login_rsp; |
89 | struct bfi_lps_logout_rsp_s *logout_rsp; | 96 | struct bfi_lps_logout_rsp_s *logout_rsp; |
97 | struct bfi_lps_cvl_event_s *cvl_event; | ||
90 | }; | 98 | }; |
91 | 99 | ||
92 | #pragma pack() | 100 | #pragma pack() |
diff --git a/drivers/scsi/bfa/include/bfi/bfi_pport.h b/drivers/scsi/bfa/include/bfi/bfi_pport.h index c96d246851af..50dcf45c7470 100644 --- a/drivers/scsi/bfa/include/bfi/bfi_pport.h +++ b/drivers/scsi/bfa/include/bfi/bfi_pport.h | |||
@@ -22,163 +22,97 @@ | |||
22 | 22 | ||
23 | #pragma pack(1) | 23 | #pragma pack(1) |
24 | 24 | ||
25 | enum bfi_pport_h2i { | 25 | enum bfi_fcport_h2i { |
26 | BFI_PPORT_H2I_ENABLE_REQ = (1), | 26 | BFI_FCPORT_H2I_ENABLE_REQ = (1), |
27 | BFI_PPORT_H2I_DISABLE_REQ = (2), | 27 | BFI_FCPORT_H2I_DISABLE_REQ = (2), |
28 | BFI_PPORT_H2I_GET_STATS_REQ = (3), | 28 | BFI_FCPORT_H2I_SET_SVC_PARAMS_REQ = (3), |
29 | BFI_PPORT_H2I_CLEAR_STATS_REQ = (4), | 29 | BFI_FCPORT_H2I_STATS_GET_REQ = (4), |
30 | BFI_PPORT_H2I_SET_SVC_PARAMS_REQ = (5), | 30 | BFI_FCPORT_H2I_STATS_CLEAR_REQ = (5), |
31 | BFI_PPORT_H2I_ENABLE_RX_VF_TAG_REQ = (6), | ||
32 | BFI_PPORT_H2I_ENABLE_TX_VF_TAG_REQ = (7), | ||
33 | BFI_PPORT_H2I_GET_QOS_STATS_REQ = (8), | ||
34 | BFI_PPORT_H2I_CLEAR_QOS_STATS_REQ = (9), | ||
35 | }; | 31 | }; |
36 | 32 | ||
37 | enum bfi_pport_i2h { | 33 | enum bfi_fcport_i2h { |
38 | BFI_PPORT_I2H_ENABLE_RSP = BFA_I2HM(1), | 34 | BFI_FCPORT_I2H_ENABLE_RSP = BFA_I2HM(1), |
39 | BFI_PPORT_I2H_DISABLE_RSP = BFA_I2HM(2), | 35 | BFI_FCPORT_I2H_DISABLE_RSP = BFA_I2HM(2), |
40 | BFI_PPORT_I2H_GET_STATS_RSP = BFA_I2HM(3), | 36 | BFI_FCPORT_I2H_SET_SVC_PARAMS_RSP = BFA_I2HM(3), |
41 | BFI_PPORT_I2H_CLEAR_STATS_RSP = BFA_I2HM(4), | 37 | BFI_FCPORT_I2H_STATS_GET_RSP = BFA_I2HM(4), |
42 | BFI_PPORT_I2H_SET_SVC_PARAMS_RSP = BFA_I2HM(5), | 38 | BFI_FCPORT_I2H_STATS_CLEAR_RSP = BFA_I2HM(5), |
43 | BFI_PPORT_I2H_ENABLE_RX_VF_TAG_RSP = BFA_I2HM(6), | 39 | BFI_FCPORT_I2H_EVENT = BFA_I2HM(6), |
44 | BFI_PPORT_I2H_ENABLE_TX_VF_TAG_RSP = BFA_I2HM(7), | ||
45 | BFI_PPORT_I2H_EVENT = BFA_I2HM(8), | ||
46 | BFI_PPORT_I2H_GET_QOS_STATS_RSP = BFA_I2HM(9), | ||
47 | BFI_PPORT_I2H_CLEAR_QOS_STATS_RSP = BFA_I2HM(10), | ||
48 | }; | 40 | }; |
49 | 41 | ||
50 | /** | 42 | /** |
51 | * Generic REQ type | 43 | * Generic REQ type |
52 | */ | 44 | */ |
53 | struct bfi_pport_generic_req_s { | 45 | struct bfi_fcport_req_s { |
54 | struct bfi_mhdr_s mh; /* msg header */ | 46 | struct bfi_mhdr_s mh; /* msg header */ |
55 | u32 msgtag; /* msgtag for reply */ | 47 | u32 msgtag; /* msgtag for reply */ |
56 | }; | 48 | }; |
57 | 49 | ||
58 | /** | 50 | /** |
59 | * Generic RSP type | 51 | * Generic RSP type |
60 | */ | 52 | */ |
61 | struct bfi_pport_generic_rsp_s { | 53 | struct bfi_fcport_rsp_s { |
62 | struct bfi_mhdr_s mh; /* common msg header */ | 54 | struct bfi_mhdr_s mh; /* common msg header */ |
63 | u8 status; /* port enable status */ | 55 | u8 status; /* port enable status */ |
64 | u8 rsvd[3]; | 56 | u8 rsvd[3]; |
65 | u32 msgtag; /* msgtag for reply */ | 57 | u32 msgtag; /* msgtag for reply */ |
66 | }; | 58 | }; |
67 | 59 | ||
68 | /** | 60 | /** |
69 | * BFI_PPORT_H2I_ENABLE_REQ | 61 | * BFI_FCPORT_H2I_ENABLE_REQ |
70 | */ | 62 | */ |
71 | struct bfi_pport_enable_req_s { | 63 | struct bfi_fcport_enable_req_s { |
72 | struct bfi_mhdr_s mh; /* msg header */ | 64 | struct bfi_mhdr_s mh; /* msg header */ |
73 | u32 rsvd1; | 65 | u32 rsvd1; |
74 | wwn_t nwwn; /* node wwn of physical port */ | 66 | wwn_t nwwn; /* node wwn of physical port */ |
75 | wwn_t pwwn; /* port wwn of physical port */ | 67 | wwn_t pwwn; /* port wwn of physical port */ |
76 | struct bfa_pport_cfg_s port_cfg; /* port configuration */ | 68 | struct bfa_pport_cfg_s port_cfg; /* port configuration */ |
77 | union bfi_addr_u stats_dma_addr; /* DMA address for stats */ | 69 | union bfi_addr_u stats_dma_addr; /* DMA address for stats */ |
78 | u32 msgtag; /* msgtag for reply */ | 70 | u32 msgtag; /* msgtag for reply */ |
79 | u32 rsvd2; | 71 | u32 rsvd2; |
80 | }; | 72 | }; |
81 | 73 | ||
82 | /** | 74 | /** |
83 | * BFI_PPORT_I2H_ENABLE_RSP | 75 | * BFI_FCPORT_H2I_SET_SVC_PARAMS_REQ |
84 | */ | 76 | */ |
85 | #define bfi_pport_enable_rsp_t struct bfi_pport_generic_rsp_s | 77 | struct bfi_fcport_set_svc_params_req_s { |
86 | |||
87 | /** | ||
88 | * BFI_PPORT_H2I_DISABLE_REQ | ||
89 | */ | ||
90 | #define bfi_pport_disable_req_t struct bfi_pport_generic_req_s | ||
91 | |||
92 | /** | ||
93 | * BFI_PPORT_I2H_DISABLE_RSP | ||
94 | */ | ||
95 | #define bfi_pport_disable_rsp_t struct bfi_pport_generic_rsp_s | ||
96 | |||
97 | /** | ||
98 | * BFI_PPORT_H2I_GET_STATS_REQ | ||
99 | */ | ||
100 | #define bfi_pport_get_stats_req_t struct bfi_pport_generic_req_s | ||
101 | |||
102 | /** | ||
103 | * BFI_PPORT_I2H_GET_STATS_RSP | ||
104 | */ | ||
105 | #define bfi_pport_get_stats_rsp_t struct bfi_pport_generic_rsp_s | ||
106 | |||
107 | /** | ||
108 | * BFI_PPORT_H2I_CLEAR_STATS_REQ | ||
109 | */ | ||
110 | #define bfi_pport_clear_stats_req_t struct bfi_pport_generic_req_s | ||
111 | |||
112 | /** | ||
113 | * BFI_PPORT_I2H_CLEAR_STATS_RSP | ||
114 | */ | ||
115 | #define bfi_pport_clear_stats_rsp_t struct bfi_pport_generic_rsp_s | ||
116 | |||
117 | /** | ||
118 | * BFI_PPORT_H2I_GET_QOS_STATS_REQ | ||
119 | */ | ||
120 | #define bfi_pport_get_qos_stats_req_t struct bfi_pport_generic_req_s | ||
121 | |||
122 | /** | ||
123 | * BFI_PPORT_H2I_GET_QOS_STATS_RSP | ||
124 | */ | ||
125 | #define bfi_pport_get_qos_stats_rsp_t struct bfi_pport_generic_rsp_s | ||
126 | |||
127 | /** | ||
128 | * BFI_PPORT_H2I_CLEAR_QOS_STATS_REQ | ||
129 | */ | ||
130 | #define bfi_pport_clear_qos_stats_req_t struct bfi_pport_generic_req_s | ||
131 | |||
132 | /** | ||
133 | * BFI_PPORT_H2I_CLEAR_QOS_STATS_RSP | ||
134 | */ | ||
135 | #define bfi_pport_clear_qos_stats_rsp_t struct bfi_pport_generic_rsp_s | ||
136 | |||
137 | /** | ||
138 | * BFI_PPORT_H2I_SET_SVC_PARAMS_REQ | ||
139 | */ | ||
140 | struct bfi_pport_set_svc_params_req_s { | ||
141 | struct bfi_mhdr_s mh; /* msg header */ | 78 | struct bfi_mhdr_s mh; /* msg header */ |
142 | u16 tx_bbcredit; /* Tx credits */ | 79 | u16 tx_bbcredit; /* Tx credits */ |
143 | u16 rsvd; | 80 | u16 rsvd; |
144 | }; | 81 | }; |
145 | 82 | ||
146 | /** | 83 | /** |
147 | * BFI_PPORT_I2H_SET_SVC_PARAMS_RSP | 84 | * BFI_FCPORT_I2H_EVENT |
148 | */ | ||
149 | |||
150 | /** | ||
151 | * BFI_PPORT_I2H_EVENT | ||
152 | */ | 85 | */ |
153 | struct bfi_pport_event_s { | 86 | struct bfi_fcport_event_s { |
154 | struct bfi_mhdr_s mh; /* common msg header */ | 87 | struct bfi_mhdr_s mh; /* common msg header */ |
155 | struct bfa_pport_link_s link_state; | 88 | struct bfa_pport_link_s link_state; |
156 | }; | 89 | }; |
157 | 90 | ||
158 | union bfi_pport_h2i_msg_u { | 91 | /** |
92 | * fcport H2I message | ||
93 | */ | ||
94 | union bfi_fcport_h2i_msg_u { | ||
159 | struct bfi_mhdr_s *mhdr; | 95 | struct bfi_mhdr_s *mhdr; |
160 | struct bfi_pport_enable_req_s *penable; | 96 | struct bfi_fcport_enable_req_s *penable; |
161 | struct bfi_pport_generic_req_s *pdisable; | 97 | struct bfi_fcport_req_s *pdisable; |
162 | struct bfi_pport_generic_req_s *pgetstats; | 98 | struct bfi_fcport_set_svc_params_req_s *psetsvcparams; |
163 | struct bfi_pport_generic_req_s *pclearstats; | 99 | struct bfi_fcport_req_s *pstatsget; |
164 | struct bfi_pport_set_svc_params_req_s *psetsvcparams; | 100 | struct bfi_fcport_req_s *pstatsclear; |
165 | struct bfi_pport_get_qos_stats_req_s *pgetqosstats; | ||
166 | struct bfi_pport_generic_req_s *pclearqosstats; | ||
167 | }; | 101 | }; |
168 | 102 | ||
169 | union bfi_pport_i2h_msg_u { | 103 | /** |
104 | * fcport I2H message | ||
105 | */ | ||
106 | union bfi_fcport_i2h_msg_u { | ||
170 | struct bfi_msg_s *msg; | 107 | struct bfi_msg_s *msg; |
171 | struct bfi_pport_generic_rsp_s *enable_rsp; | 108 | struct bfi_fcport_rsp_s *penable_rsp; |
172 | struct bfi_pport_disable_rsp_s *disable_rsp; | 109 | struct bfi_fcport_rsp_s *pdisable_rsp; |
173 | struct bfi_pport_generic_rsp_s *getstats_rsp; | 110 | struct bfi_fcport_rsp_s *psetsvcparams_rsp; |
174 | struct bfi_pport_clear_stats_rsp_s *clearstats_rsp; | 111 | struct bfi_fcport_rsp_s *pstatsget_rsp; |
175 | struct bfi_pport_set_svc_params_rsp_s *setsvcparasm_rsp; | 112 | struct bfi_fcport_rsp_s *pstatsclear_rsp; |
176 | struct bfi_pport_get_qos_stats_rsp_s *getqosstats_rsp; | 113 | struct bfi_fcport_event_s *event; |
177 | struct bfi_pport_clear_qos_stats_rsp_s *clearqosstats_rsp; | ||
178 | struct bfi_pport_event_s *event; | ||
179 | }; | 114 | }; |
180 | 115 | ||
181 | #pragma pack() | 116 | #pragma pack() |
182 | 117 | ||
183 | #endif /* __BFI_PPORT_H__ */ | 118 | #endif /* __BFI_PPORT_H__ */ |
184 | |||
diff --git a/drivers/scsi/bfa/include/cna/bfa_cna_trcmod.h b/drivers/scsi/bfa/include/cna/bfa_cna_trcmod.h index 43ba7064e81a..a75a1f3be315 100644 --- a/drivers/scsi/bfa/include/cna/bfa_cna_trcmod.h +++ b/drivers/scsi/bfa/include/cna/bfa_cna_trcmod.h | |||
@@ -31,6 +31,10 @@ | |||
31 | enum { | 31 | enum { |
32 | BFA_TRC_CNA_CEE = 1, | 32 | BFA_TRC_CNA_CEE = 1, |
33 | BFA_TRC_CNA_PORT = 2, | 33 | BFA_TRC_CNA_PORT = 2, |
34 | BFA_TRC_CNA_IOC = 3, | ||
35 | BFA_TRC_CNA_DIAG = 4, | ||
36 | BFA_TRC_CNA_IOC_CB = 5, | ||
37 | BFA_TRC_CNA_IOC_CT = 6, | ||
34 | }; | 38 | }; |
35 | 39 | ||
36 | #endif /* __BFA_CNA_TRCMOD_H__ */ | 40 | #endif /* __BFA_CNA_TRCMOD_H__ */ |
diff --git a/drivers/scsi/bfa/include/cs/bfa_log.h b/drivers/scsi/bfa/include/cs/bfa_log.h index 761cbe22130a..bc334e0a93fa 100644 --- a/drivers/scsi/bfa/include/cs/bfa_log.h +++ b/drivers/scsi/bfa/include/cs/bfa_log.h | |||
@@ -157,7 +157,7 @@ typedef void (*bfa_log_cb_t)(struct bfa_log_mod_s *log_mod, u32 msg_id, | |||
157 | 157 | ||
158 | 158 | ||
159 | struct bfa_log_mod_s { | 159 | struct bfa_log_mod_s { |
160 | char instance_info[16]; /* instance info */ | 160 | char instance_info[BFA_STRING_32]; /* instance info */ |
161 | int log_level[BFA_LOG_MODULE_ID_MAX + 1]; | 161 | int log_level[BFA_LOG_MODULE_ID_MAX + 1]; |
162 | /* log level for modules */ | 162 | /* log level for modules */ |
163 | bfa_log_cb_t cbfn; /* callback function */ | 163 | bfa_log_cb_t cbfn; /* callback function */ |
diff --git a/drivers/scsi/bfa/include/cs/bfa_plog.h b/drivers/scsi/bfa/include/cs/bfa_plog.h index 670f86e5fc6e..f5bef63b5877 100644 --- a/drivers/scsi/bfa/include/cs/bfa_plog.h +++ b/drivers/scsi/bfa/include/cs/bfa_plog.h | |||
@@ -80,7 +80,8 @@ enum bfa_plog_mid { | |||
80 | BFA_PL_MID_HAL_FCXP = 4, | 80 | BFA_PL_MID_HAL_FCXP = 4, |
81 | BFA_PL_MID_HAL_UF = 5, | 81 | BFA_PL_MID_HAL_UF = 5, |
82 | BFA_PL_MID_FCS = 6, | 82 | BFA_PL_MID_FCS = 6, |
83 | BFA_PL_MID_MAX = 7 | 83 | BFA_PL_MID_LPS = 7, |
84 | BFA_PL_MID_MAX = 8 | ||
84 | }; | 85 | }; |
85 | 86 | ||
86 | #define BFA_PL_MID_STRLEN 8 | 87 | #define BFA_PL_MID_STRLEN 8 |
@@ -118,7 +119,11 @@ enum bfa_plog_eid { | |||
118 | BFA_PL_EID_RSCN = 17, | 119 | BFA_PL_EID_RSCN = 17, |
119 | BFA_PL_EID_DEBUG = 18, | 120 | BFA_PL_EID_DEBUG = 18, |
120 | BFA_PL_EID_MISC = 19, | 121 | BFA_PL_EID_MISC = 19, |
121 | BFA_PL_EID_MAX = 20 | 122 | BFA_PL_EID_FIP_FCF_DISC = 20, |
123 | BFA_PL_EID_FIP_FCF_CVL = 21, | ||
124 | BFA_PL_EID_LOGIN = 22, | ||
125 | BFA_PL_EID_LOGO = 23, | ||
126 | BFA_PL_EID_MAX = 24 | ||
122 | }; | 127 | }; |
123 | 128 | ||
124 | #define BFA_PL_ENAME_STRLEN 8 | 129 | #define BFA_PL_ENAME_STRLEN 8 |
diff --git a/drivers/scsi/bfa/include/cs/bfa_sm.h b/drivers/scsi/bfa/include/cs/bfa_sm.h index b0a92baf6657..11fba9082f05 100644 --- a/drivers/scsi/bfa/include/cs/bfa_sm.h +++ b/drivers/scsi/bfa/include/cs/bfa_sm.h | |||
@@ -23,6 +23,14 @@ | |||
23 | #define __BFA_SM_H__ | 23 | #define __BFA_SM_H__ |
24 | 24 | ||
25 | typedef void (*bfa_sm_t)(void *sm, int event); | 25 | typedef void (*bfa_sm_t)(void *sm, int event); |
26 | /** | ||
27 | * oc - object class eg. bfa_ioc | ||
28 | * st - state, eg. reset | ||
29 | * otype - object type, eg. struct bfa_ioc_s | ||
30 | * etype - object type, eg. enum ioc_event | ||
31 | */ | ||
32 | #define bfa_sm_state_decl(oc, st, otype, etype) \ | ||
33 | static void oc ## _sm_ ## st(otype * fsm, etype event) | ||
26 | 34 | ||
27 | #define bfa_sm_set_state(_sm, _state) ((_sm)->sm = (bfa_sm_t)(_state)) | 35 | #define bfa_sm_set_state(_sm, _state) ((_sm)->sm = (bfa_sm_t)(_state)) |
28 | #define bfa_sm_send_event(_sm, _event) ((_sm)->sm((_sm), (_event))) | 36 | #define bfa_sm_send_event(_sm, _event) ((_sm)->sm((_sm), (_event))) |
diff --git a/drivers/scsi/bfa/include/defs/bfa_defs_aen.h b/drivers/scsi/bfa/include/defs/bfa_defs_aen.h index 4c81a613db3d..35244698fcdc 100644 --- a/drivers/scsi/bfa/include/defs/bfa_defs_aen.h +++ b/drivers/scsi/bfa/include/defs/bfa_defs_aen.h | |||
@@ -30,6 +30,16 @@ | |||
30 | #include <defs/bfa_defs_audit.h> | 30 | #include <defs/bfa_defs_audit.h> |
31 | #include <defs/bfa_defs_ethport.h> | 31 | #include <defs/bfa_defs_ethport.h> |
32 | 32 | ||
33 | #define BFA_AEN_MAX_APP 5 | ||
34 | |||
35 | enum bfa_aen_app { | ||
36 | bfa_aen_app_bcu = 0, /* No thread for bcu */ | ||
37 | bfa_aen_app_hcm = 1, | ||
38 | bfa_aen_app_cim = 2, | ||
39 | bfa_aen_app_snia = 3, | ||
40 | bfa_aen_app_test = 4, /* To be removed after unit test */ | ||
41 | }; | ||
42 | |||
33 | enum bfa_aen_category { | 43 | enum bfa_aen_category { |
34 | BFA_AEN_CAT_ADAPTER = 1, | 44 | BFA_AEN_CAT_ADAPTER = 1, |
35 | BFA_AEN_CAT_PORT = 2, | 45 | BFA_AEN_CAT_PORT = 2, |
diff --git a/drivers/scsi/bfa/include/defs/bfa_defs_auth.h b/drivers/scsi/bfa/include/defs/bfa_defs_auth.h index dd19c83aba58..45df32820911 100644 --- a/drivers/scsi/bfa/include/defs/bfa_defs_auth.h +++ b/drivers/scsi/bfa/include/defs/bfa_defs_auth.h | |||
@@ -23,6 +23,7 @@ | |||
23 | #define PRIVATE_KEY 19009 | 23 | #define PRIVATE_KEY 19009 |
24 | #define KEY_LEN 32399 | 24 | #define KEY_LEN 32399 |
25 | #define BFA_AUTH_SECRET_STRING_LEN 256 | 25 | #define BFA_AUTH_SECRET_STRING_LEN 256 |
26 | #define BFA_AUTH_FAIL_NO_PASSWORD 0xFE | ||
26 | #define BFA_AUTH_FAIL_TIMEOUT 0xFF | 27 | #define BFA_AUTH_FAIL_TIMEOUT 0xFF |
27 | 28 | ||
28 | /** | 29 | /** |
@@ -41,6 +42,27 @@ enum bfa_auth_status { | |||
41 | BFA_AUTH_STATUS_UNKNOWN = 9, /* authentication status unknown */ | 42 | BFA_AUTH_STATUS_UNKNOWN = 9, /* authentication status unknown */ |
42 | }; | 43 | }; |
43 | 44 | ||
45 | enum bfa_auth_rej_code { | ||
46 | BFA_AUTH_RJT_CODE_AUTH_FAILURE = 1, /* auth failure */ | ||
47 | BFA_AUTH_RJT_CODE_LOGICAL_ERR = 2, /* logical error */ | ||
48 | }; | ||
49 | |||
50 | /** | ||
51 | * Authentication reject codes | ||
52 | */ | ||
53 | enum bfa_auth_rej_code_exp { | ||
54 | BFA_AUTH_MECH_NOT_USABLE = 1, /* auth. mechanism not usable */ | ||
55 | BFA_AUTH_DH_GROUP_NOT_USABLE = 2, /* DH Group not usable */ | ||
56 | BFA_AUTH_HASH_FUNC_NOT_USABLE = 3, /* hash Function not usable */ | ||
57 | BFA_AUTH_AUTH_XACT_STARTED = 4, /* auth xact started */ | ||
58 | BFA_AUTH_AUTH_FAILED = 5, /* auth failed */ | ||
59 | BFA_AUTH_INCORRECT_PLD = 6, /* incorrect payload */ | ||
60 | BFA_AUTH_INCORRECT_PROTO_MSG = 7, /* incorrect proto msg */ | ||
61 | BFA_AUTH_RESTART_AUTH_PROTO = 8, /* restart auth protocol */ | ||
62 | BFA_AUTH_AUTH_CONCAT_NOT_SUPP = 9, /* auth concat not supported */ | ||
63 | BFA_AUTH_PROTO_VER_NOT_SUPP = 10,/* proto version not supported */ | ||
64 | }; | ||
65 | |||
44 | struct auth_proto_stats_s { | 66 | struct auth_proto_stats_s { |
45 | u32 auth_rjts; | 67 | u32 auth_rjts; |
46 | u32 auth_negs; | 68 | u32 auth_negs; |
diff --git a/drivers/scsi/bfa/include/defs/bfa_defs_cee.h b/drivers/scsi/bfa/include/defs/bfa_defs_cee.h index 520a22f52dd1..b0ac9ac15c5d 100644 --- a/drivers/scsi/bfa/include/defs/bfa_defs_cee.h +++ b/drivers/scsi/bfa/include/defs/bfa_defs_cee.h | |||
@@ -28,10 +28,6 @@ | |||
28 | 28 | ||
29 | #define BFA_CEE_LLDP_MAX_STRING_LEN (128) | 29 | #define BFA_CEE_LLDP_MAX_STRING_LEN (128) |
30 | 30 | ||
31 | |||
32 | /* FIXME: this is coming from the protocol spec. Can the host & apps share the | ||
33 | protocol .h files ? | ||
34 | */ | ||
35 | #define BFA_CEE_LLDP_SYS_CAP_OTHER 0x0001 | 31 | #define BFA_CEE_LLDP_SYS_CAP_OTHER 0x0001 |
36 | #define BFA_CEE_LLDP_SYS_CAP_REPEATER 0x0002 | 32 | #define BFA_CEE_LLDP_SYS_CAP_REPEATER 0x0002 |
37 | #define BFA_CEE_LLDP_SYS_CAP_MAC_BRIDGE 0x0004 | 33 | #define BFA_CEE_LLDP_SYS_CAP_MAC_BRIDGE 0x0004 |
@@ -94,9 +90,10 @@ struct bfa_cee_dcbx_cfg_s { | |||
94 | /* CEE status */ | 90 | /* CEE status */ |
95 | /* Making this to tri-state for the benefit of port list command */ | 91 | /* Making this to tri-state for the benefit of port list command */ |
96 | enum bfa_cee_status_e { | 92 | enum bfa_cee_status_e { |
97 | CEE_PHY_DOWN = 0, | 93 | CEE_UP = 0, |
98 | CEE_PHY_UP = 1, | 94 | CEE_PHY_UP = 1, |
99 | CEE_UP = 2, | 95 | CEE_LOOPBACK = 2, |
96 | CEE_PHY_DOWN = 3, | ||
100 | }; | 97 | }; |
101 | 98 | ||
102 | /* CEE Query */ | 99 | /* CEE Query */ |
@@ -107,7 +104,8 @@ struct bfa_cee_attr_s { | |||
107 | struct bfa_cee_dcbx_cfg_s dcbx_remote; | 104 | struct bfa_cee_dcbx_cfg_s dcbx_remote; |
108 | mac_t src_mac; | 105 | mac_t src_mac; |
109 | u8 link_speed; | 106 | u8 link_speed; |
110 | u8 filler[3]; | 107 | u8 nw_priority; |
108 | u8 filler[2]; | ||
111 | }; | 109 | }; |
112 | 110 | ||
113 | 111 | ||
diff --git a/drivers/scsi/bfa/include/defs/bfa_defs_driver.h b/drivers/scsi/bfa/include/defs/bfa_defs_driver.h index 57049805762b..50382dd2ab41 100644 --- a/drivers/scsi/bfa/include/defs/bfa_defs_driver.h +++ b/drivers/scsi/bfa/include/defs/bfa_defs_driver.h | |||
@@ -21,6 +21,7 @@ | |||
21 | /** | 21 | /** |
22 | * Driver statistics | 22 | * Driver statistics |
23 | */ | 23 | */ |
24 | struct bfa_driver_stats_s { | ||
24 | u16 tm_io_abort; | 25 | u16 tm_io_abort; |
25 | u16 tm_io_abort_comp; | 26 | u16 tm_io_abort_comp; |
26 | u16 tm_lun_reset; | 27 | u16 tm_lun_reset; |
@@ -34,7 +35,7 @@ | |||
34 | u64 output_req; | 35 | u64 output_req; |
35 | u64 input_words; | 36 | u64 input_words; |
36 | u64 output_words; | 37 | u64 output_words; |
37 | } bfa_driver_stats_t; | 38 | }; |
38 | 39 | ||
39 | 40 | ||
40 | #endif /* __BFA_DEFS_DRIVER_H__ */ | 41 | #endif /* __BFA_DEFS_DRIVER_H__ */ |
diff --git a/drivers/scsi/bfa/include/defs/bfa_defs_ethport.h b/drivers/scsi/bfa/include/defs/bfa_defs_ethport.h index 79f9b3e146f7..b4fa0923aa89 100644 --- a/drivers/scsi/bfa/include/defs/bfa_defs_ethport.h +++ b/drivers/scsi/bfa/include/defs/bfa_defs_ethport.h | |||
@@ -19,6 +19,7 @@ | |||
19 | #define __BFA_DEFS_ETHPORT_H__ | 19 | #define __BFA_DEFS_ETHPORT_H__ |
20 | 20 | ||
21 | #include <defs/bfa_defs_status.h> | 21 | #include <defs/bfa_defs_status.h> |
22 | #include <defs/bfa_defs_port.h> | ||
22 | #include <protocol/types.h> | 23 | #include <protocol/types.h> |
23 | #include <cna/pstats/phyport_defs.h> | 24 | #include <cna/pstats/phyport_defs.h> |
24 | #include <cna/pstats/ethport_defs.h> | 25 | #include <cna/pstats/ethport_defs.h> |
diff --git a/drivers/scsi/bfa/include/defs/bfa_defs_fcport.h b/drivers/scsi/bfa/include/defs/bfa_defs_fcport.h new file mode 100644 index 000000000000..a07ef4a3cd78 --- /dev/null +++ b/drivers/scsi/bfa/include/defs/bfa_defs_fcport.h | |||
@@ -0,0 +1,94 @@ | |||
1 | /* | ||
2 | * Copyright (c) 2005-2009 Brocade Communications Systems, Inc. | ||
3 | * All rights reserved | ||
4 | * www.brocade.com | ||
5 | * | ||
6 | * bfa_defs_fcport.h | ||
7 | * | ||
8 | * Linux driver for Brocade Fibre Channel Host Bus Adapter. | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify it | ||
11 | * under the terms of the GNU General Public License (GPL) Version 2 as | ||
12 | * published by the Free Software Foundation | ||
13 | * | ||
14 | * This program is distributed in the hope that it will be useful, but | ||
15 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
17 | * General Public License for more details. | ||
18 | */ | ||
19 | #ifndef __BFA_DEFS_FCPORT_H__ | ||
20 | #define __BFA_DEFS_FCPORT_H__ | ||
21 | |||
22 | #include <defs/bfa_defs_types.h> | ||
23 | #include <protocol/types.h> | ||
24 | |||
25 | #pragma pack(1) | ||
26 | |||
27 | /** | ||
28 | * FCoE statistics | ||
29 | */ | ||
30 | struct bfa_fcoe_stats_s { | ||
31 | u64 secs_reset; /* Seconds since stats reset */ | ||
32 | u64 cee_linkups; /* CEE link up */ | ||
33 | u64 cee_linkdns; /* CEE link down */ | ||
34 | u64 fip_linkups; /* FIP link up */ | ||
35 | u64 fip_linkdns; /* FIP link down */ | ||
36 | u64 fip_fails; /* FIP failures */ | ||
37 | u64 mac_invalids; /* Invalid mac assignments */ | ||
38 | u64 vlan_req; /* Vlan requests */ | ||
39 | u64 vlan_notify; /* Vlan notifications */ | ||
40 | u64 vlan_err; /* Vlan notification errors */ | ||
41 | u64 vlan_timeouts; /* Vlan request timeouts */ | ||
42 | u64 vlan_invalids; /* Vlan invalids */ | ||
43 | u64 disc_req; /* Discovery requests */ | ||
44 | u64 disc_rsp; /* Discovery responses */ | ||
45 | u64 disc_err; /* Discovery error frames */ | ||
46 | u64 disc_unsol; /* Discovery unsolicited */ | ||
47 | u64 disc_timeouts; /* Discovery timeouts */ | ||
48 | u64 disc_fcf_unavail; /* Discovery FCF not avail */ | ||
49 | u64 linksvc_unsupp; /* FIP link service req unsupp. */ | ||
50 | u64 linksvc_err; /* FIP link service req errors */ | ||
51 | u64 logo_req; /* FIP logo */ | ||
52 | u64 clrvlink_req; /* Clear virtual link requests */ | ||
53 | u64 op_unsupp; /* FIP operation unsupp. */ | ||
54 | u64 untagged; /* FIP untagged frames */ | ||
55 | u64 txf_ucast; /* Tx FCoE unicast frames */ | ||
56 | u64 txf_ucast_vlan; /* Tx FCoE unicast vlan frames */ | ||
57 | u64 txf_ucast_octets; /* Tx FCoE unicast octets */ | ||
58 | u64 txf_mcast; /* Tx FCoE mutlicast frames */ | ||
59 | u64 txf_mcast_vlan; /* Tx FCoE mutlicast vlan frames */ | ||
60 | u64 txf_mcast_octets; /* Tx FCoE multicast octets */ | ||
61 | u64 txf_bcast; /* Tx FCoE broadcast frames */ | ||
62 | u64 txf_bcast_vlan; /* Tx FCoE broadcast vlan frames */ | ||
63 | u64 txf_bcast_octets; /* Tx FCoE broadcast octets */ | ||
64 | u64 txf_timeout; /* Tx timeouts */ | ||
65 | u64 txf_parity_errors; /* Transmit parity err */ | ||
66 | u64 txf_fid_parity_errors; /* Transmit FID parity err */ | ||
67 | u64 tx_pause; /* Tx pause frames */ | ||
68 | u64 tx_zero_pause; /* Tx zero pause frames */ | ||
69 | u64 tx_first_pause; /* Tx first pause frames */ | ||
70 | u64 rx_pause; /* Rx pause frames */ | ||
71 | u64 rx_zero_pause; /* Rx zero pause frames */ | ||
72 | u64 rx_first_pause; /* Rx first pause frames */ | ||
73 | u64 rxf_ucast_octets; /* Rx unicast octets */ | ||
74 | u64 rxf_ucast; /* Rx unicast frames */ | ||
75 | u64 rxf_ucast_vlan; /* Rx unicast vlan frames */ | ||
76 | u64 rxf_mcast_octets; /* Rx multicast octets */ | ||
77 | u64 rxf_mcast; /* Rx multicast frames */ | ||
78 | u64 rxf_mcast_vlan; /* Rx multicast vlan frames */ | ||
79 | u64 rxf_bcast_octets; /* Rx broadcast octests */ | ||
80 | u64 rxf_bcast; /* Rx broadcast frames */ | ||
81 | u64 rxf_bcast_vlan; /* Rx broadcast vlan frames */ | ||
82 | }; | ||
83 | |||
84 | /** | ||
85 | * QoS or FCoE stats (fcport stats excluding physical FC port stats) | ||
86 | */ | ||
87 | union bfa_fcport_stats_u { | ||
88 | struct bfa_qos_stats_s fcqos; | ||
89 | struct bfa_fcoe_stats_s fcoe; | ||
90 | }; | ||
91 | |||
92 | #pragma pack() | ||
93 | |||
94 | #endif /* __BFA_DEFS_FCPORT_H__ */ | ||
diff --git a/drivers/scsi/bfa/include/defs/bfa_defs_im_common.h b/drivers/scsi/bfa/include/defs/bfa_defs_im_common.h deleted file mode 100644 index 9ccf53bef65a..000000000000 --- a/drivers/scsi/bfa/include/defs/bfa_defs_im_common.h +++ /dev/null | |||
@@ -1,32 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (c) 2005-2009 Brocade Communications Systems, Inc. | ||
3 | * All rights reserved | ||
4 | * www.brocade.com | ||
5 | * | ||
6 | * Linux driver for Brocade Fibre Channel Host Bus Adapter. | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify it | ||
9 | * under the terms of the GNU General Public License (GPL) Version 2 as | ||
10 | * published by the Free Software Foundation | ||
11 | * | ||
12 | * This program is distributed in the hope that it will be useful, but | ||
13 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
15 | * General Public License for more details. | ||
16 | */ | ||
17 | |||
18 | #ifndef __BFA_DEFS_IM_COMMON_H__ | ||
19 | #define __BFA_DEFS_IM_COMMON_H__ | ||
20 | |||
21 | #define BFA_ADAPTER_NAME_LEN 256 | ||
22 | #define BFA_ADAPTER_GUID_LEN 256 | ||
23 | #define RESERVED_VLAN_NAME L"PORT VLAN" | ||
24 | #define PASSTHRU_VLAN_NAME L"PASSTHRU VLAN" | ||
25 | |||
26 | u64 tx_pkt_cnt; | ||
27 | u64 rx_pkt_cnt; | ||
28 | u32 duration; | ||
29 | u8 status; | ||
30 | } bfa_im_stats_t, *pbfa_im_stats_t; | ||
31 | |||
32 | #endif /* __BFA_DEFS_IM_COMMON_H__ */ | ||
diff --git a/drivers/scsi/bfa/include/defs/bfa_defs_im_team.h b/drivers/scsi/bfa/include/defs/bfa_defs_im_team.h deleted file mode 100644 index a486a7eb81d6..000000000000 --- a/drivers/scsi/bfa/include/defs/bfa_defs_im_team.h +++ /dev/null | |||
@@ -1,72 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (c) 2005-2009 Brocade Communications Systems, Inc. | ||
3 | * All rights reserved | ||
4 | * www.brocade.com | ||
5 | * | ||
6 | * Linux driver for Brocade Fibre Channel Host Bus Adapter. | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify it | ||
9 | * under the terms of the GNU General Public License (GPL) Version 2 as | ||
10 | * published by the Free Software Foundation | ||
11 | * | ||
12 | * This program is distributed in the hope that it will be useful, but | ||
13 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
15 | * General Public License for more details. | ||
16 | */ | ||
17 | |||
18 | #ifndef __BFA_DEFS_IM_TEAM_H__ | ||
19 | #define __BFA_DEFS_IM_TEAM_H__ | ||
20 | |||
21 | #include <protocol/types.h> | ||
22 | |||
23 | #define BFA_TEAM_MAX_PORTS 8 | ||
24 | #define BFA_TEAM_NAME_LEN 256 | ||
25 | #define BFA_MAX_NUM_TEAMS 16 | ||
26 | #define BFA_TEAM_INVALID_DELAY -1 | ||
27 | |||
28 | BFA_LACP_RATE_SLOW = 1, | ||
29 | BFA_LACP_RATE_FAST | ||
30 | } bfa_im_lacp_rate_t; | ||
31 | |||
32 | BFA_TEAM_MODE_FAIL_OVER = 1, | ||
33 | BFA_TEAM_MODE_FAIL_BACK, | ||
34 | BFA_TEAM_MODE_LACP, | ||
35 | BFA_TEAM_MODE_NONE | ||
36 | } bfa_im_team_mode_t; | ||
37 | |||
38 | BFA_XMIT_POLICY_L2 = 1, | ||
39 | BFA_XMIT_POLICY_L3_L4 | ||
40 | } bfa_im_xmit_policy_t; | ||
41 | |||
42 | bfa_im_team_mode_t team_mode; | ||
43 | bfa_im_lacp_rate_t lacp_rate; | ||
44 | bfa_im_xmit_policy_t xmit_policy; | ||
45 | int delay; | ||
46 | wchar_t primary[BFA_ADAPTER_NAME_LEN]; | ||
47 | wchar_t preferred_primary[BFA_ADAPTER_NAME_LEN]; | ||
48 | mac_t mac; | ||
49 | u16 num_ports; | ||
50 | u16 num_vlans; | ||
51 | u16 vlan_list[BFA_MAX_VLANS_PER_PORT]; | ||
52 | wchar_t team_guid_list[BFA_TEAM_MAX_PORTS][BFA_ADAPTER_GUID_LEN]; | ||
53 | wchar_t ioc_name_list[BFA_TEAM_MAX_PORTS][BFA_ADAPTER_NAME_LEN]; | ||
54 | } bfa_im_team_attr_t; | ||
55 | |||
56 | wchar_t team_name[BFA_TEAM_NAME_LEN]; | ||
57 | bfa_im_xmit_policy_t xmit_policy; | ||
58 | int delay; | ||
59 | wchar_t primary[BFA_ADAPTER_NAME_LEN]; | ||
60 | wchar_t preferred_primary[BFA_ADAPTER_NAME_LEN]; | ||
61 | } bfa_im_team_edit_t, *pbfa_im_team_edit_t; | ||
62 | |||
63 | wchar_t team_name[BFA_TEAM_NAME_LEN]; | ||
64 | bfa_im_team_mode_t team_mode; | ||
65 | mac_t mac; | ||
66 | } bfa_im_team_info_t; | ||
67 | |||
68 | bfa_im_team_info_t team_info[BFA_MAX_NUM_TEAMS]; | ||
69 | u16 num_teams; | ||
70 | } bfa_im_team_list_t, *pbfa_im_team_list_t; | ||
71 | |||
72 | #endif /* __BFA_DEFS_IM_TEAM_H__ */ | ||
diff --git a/drivers/scsi/bfa/include/defs/bfa_defs_ioc.h b/drivers/scsi/bfa/include/defs/bfa_defs_ioc.h index b1d532da3a9d..8d8e6a966537 100644 --- a/drivers/scsi/bfa/include/defs/bfa_defs_ioc.h +++ b/drivers/scsi/bfa/include/defs/bfa_defs_ioc.h | |||
@@ -126,6 +126,7 @@ struct bfa_ioc_attr_s { | |||
126 | struct bfa_ioc_driver_attr_s driver_attr; /* driver attr */ | 126 | struct bfa_ioc_driver_attr_s driver_attr; /* driver attr */ |
127 | struct bfa_ioc_pci_attr_s pci_attr; | 127 | struct bfa_ioc_pci_attr_s pci_attr; |
128 | u8 port_id; /* port number */ | 128 | u8 port_id; /* port number */ |
129 | u8 rsvd[7]; /*!< 64bit align */ | ||
129 | }; | 130 | }; |
130 | 131 | ||
131 | /** | 132 | /** |
@@ -143,8 +144,8 @@ enum bfa_ioc_aen_event { | |||
143 | * BFA IOC level event data, now just a place holder | 144 | * BFA IOC level event data, now just a place holder |
144 | */ | 145 | */ |
145 | struct bfa_ioc_aen_data_s { | 146 | struct bfa_ioc_aen_data_s { |
146 | enum bfa_ioc_type_e ioc_type; | ||
147 | wwn_t pwwn; | 147 | wwn_t pwwn; |
148 | s16 ioc_type; | ||
148 | mac_t mac; | 149 | mac_t mac; |
149 | }; | 150 | }; |
150 | 151 | ||
diff --git a/drivers/scsi/bfa/include/defs/bfa_defs_iocfc.h b/drivers/scsi/bfa/include/defs/bfa_defs_iocfc.h index d76bcbd9820f..c290fb13d2d1 100644 --- a/drivers/scsi/bfa/include/defs/bfa_defs_iocfc.h +++ b/drivers/scsi/bfa/include/defs/bfa_defs_iocfc.h | |||
@@ -26,6 +26,8 @@ | |||
26 | 26 | ||
27 | #define BFA_IOCFC_INTR_DELAY 1125 | 27 | #define BFA_IOCFC_INTR_DELAY 1125 |
28 | #define BFA_IOCFC_INTR_LATENCY 225 | 28 | #define BFA_IOCFC_INTR_LATENCY 225 |
29 | #define BFA_IOCFCOE_INTR_DELAY 25 | ||
30 | #define BFA_IOCFCOE_INTR_LATENCY 5 | ||
29 | 31 | ||
30 | /** | 32 | /** |
31 | * Interrupt coalescing configuration. | 33 | * Interrupt coalescing configuration. |
@@ -50,7 +52,7 @@ struct bfa_iocfc_fwcfg_s { | |||
50 | u16 num_fcxp_reqs; /* unassisted FC exchanges */ | 52 | u16 num_fcxp_reqs; /* unassisted FC exchanges */ |
51 | u16 num_uf_bufs; /* unsolicited recv buffers */ | 53 | u16 num_uf_bufs; /* unsolicited recv buffers */ |
52 | u8 num_cqs; | 54 | u8 num_cqs; |
53 | u8 rsvd; | 55 | u8 rsvd[5]; |
54 | }; | 56 | }; |
55 | 57 | ||
56 | struct bfa_iocfc_drvcfg_s { | 58 | struct bfa_iocfc_drvcfg_s { |
@@ -224,18 +226,24 @@ struct bfa_fw_port_physm_stats_s { | |||
224 | 226 | ||
225 | 227 | ||
226 | struct bfa_fw_fip_stats_s { | 228 | struct bfa_fw_fip_stats_s { |
229 | u32 vlan_req; /* vlan discovery requests */ | ||
230 | u32 vlan_notify; /* vlan notifications */ | ||
231 | u32 vlan_err; /* vlan response error */ | ||
232 | u32 vlan_timeouts; /* vlan disvoery timeouts */ | ||
233 | u32 vlan_invalids; /* invalid vlan in discovery advert. */ | ||
227 | u32 disc_req; /* Discovery solicit requests */ | 234 | u32 disc_req; /* Discovery solicit requests */ |
228 | u32 disc_rsp; /* Discovery solicit response */ | 235 | u32 disc_rsp; /* Discovery solicit response */ |
229 | u32 disc_err; /* Discovery advt. parse errors */ | 236 | u32 disc_err; /* Discovery advt. parse errors */ |
230 | u32 disc_unsol; /* Discovery unsolicited */ | 237 | u32 disc_unsol; /* Discovery unsolicited */ |
231 | u32 disc_timeouts; /* Discovery timeouts */ | 238 | u32 disc_timeouts; /* Discovery timeouts */ |
239 | u32 disc_fcf_unavail; /* Discovery FCF Not Avail. */ | ||
232 | u32 linksvc_unsupp; /* Unsupported link service req */ | 240 | u32 linksvc_unsupp; /* Unsupported link service req */ |
233 | u32 linksvc_err; /* Parse error in link service req */ | 241 | u32 linksvc_err; /* Parse error in link service req */ |
234 | u32 logo_req; /* Number of FIP logos received */ | 242 | u32 logo_req; /* Number of FIP logos received */ |
235 | u32 clrvlink_req; /* Clear virtual link req */ | 243 | u32 clrvlink_req; /* Clear virtual link req */ |
236 | u32 op_unsupp; /* Unsupported FIP operation */ | 244 | u32 op_unsupp; /* Unsupported FIP operation */ |
237 | u32 untagged; /* Untagged frames (ignored) */ | 245 | u32 untagged; /* Untagged frames (ignored) */ |
238 | u32 rsvd; | 246 | u32 invalid_version; /*!< Invalid FIP version */ |
239 | }; | 247 | }; |
240 | 248 | ||
241 | 249 | ||
diff --git a/drivers/scsi/bfa/include/defs/bfa_defs_lport.h b/drivers/scsi/bfa/include/defs/bfa_defs_lport.h index 7359f82aacfc..0952a139c47c 100644 --- a/drivers/scsi/bfa/include/defs/bfa_defs_lport.h +++ b/drivers/scsi/bfa/include/defs/bfa_defs_lport.h | |||
@@ -59,8 +59,8 @@ enum bfa_lport_aen_event { | |||
59 | */ | 59 | */ |
60 | struct bfa_lport_aen_data_s { | 60 | struct bfa_lport_aen_data_s { |
61 | u16 vf_id; /* vf_id of this logical port */ | 61 | u16 vf_id; /* vf_id of this logical port */ |
62 | u16 rsvd; | 62 | s16 roles; /* Logical port mode,IM/TM/IP etc */ |
63 | enum bfa_port_role roles; /* Logical port mode,IM/TM/IP etc */ | 63 | u32 rsvd; |
64 | wwn_t ppwwn; /* WWN of its physical port */ | 64 | wwn_t ppwwn; /* WWN of its physical port */ |
65 | wwn_t lpwwn; /* WWN of this logical port */ | 65 | wwn_t lpwwn; /* WWN of this logical port */ |
66 | }; | 66 | }; |
diff --git a/drivers/scsi/bfa/include/defs/bfa_defs_mfg.h b/drivers/scsi/bfa/include/defs/bfa_defs_mfg.h index 13fd4ab6aae2..c5bd9c36ad4d 100644 --- a/drivers/scsi/bfa/include/defs/bfa_defs_mfg.h +++ b/drivers/scsi/bfa/include/defs/bfa_defs_mfg.h | |||
@@ -22,7 +22,47 @@ | |||
22 | /** | 22 | /** |
23 | * Manufacturing block version | 23 | * Manufacturing block version |
24 | */ | 24 | */ |
25 | #define BFA_MFG_VERSION 1 | 25 | #define BFA_MFG_VERSION 2 |
26 | |||
27 | /** | ||
28 | * Manufacturing block encrypted version | ||
29 | */ | ||
30 | #define BFA_MFG_ENC_VER 2 | ||
31 | |||
32 | /** | ||
33 | * Manufacturing block version 1 length | ||
34 | */ | ||
35 | #define BFA_MFG_VER1_LEN 128 | ||
36 | |||
37 | /** | ||
38 | * Manufacturing block header length | ||
39 | */ | ||
40 | #define BFA_MFG_HDR_LEN 4 | ||
41 | |||
42 | /** | ||
43 | * Checksum size | ||
44 | */ | ||
45 | #define BFA_MFG_CHKSUM_SIZE 16 | ||
46 | |||
47 | /** | ||
48 | * Manufacturing block encrypted version | ||
49 | */ | ||
50 | #define BFA_MFG_ENC_VER 2 | ||
51 | |||
52 | /** | ||
53 | * Manufacturing block version 1 length | ||
54 | */ | ||
55 | #define BFA_MFG_VER1_LEN 128 | ||
56 | |||
57 | /** | ||
58 | * Manufacturing block header length | ||
59 | */ | ||
60 | #define BFA_MFG_HDR_LEN 4 | ||
61 | |||
62 | /** | ||
63 | * Checksum size | ||
64 | */ | ||
65 | #define BFA_MFG_CHKSUM_SIZE 16 | ||
26 | 66 | ||
27 | /** | 67 | /** |
28 | * Manufacturing block format | 68 | * Manufacturing block format |
@@ -30,29 +70,74 @@ | |||
30 | #define BFA_MFG_SERIALNUM_SIZE 11 | 70 | #define BFA_MFG_SERIALNUM_SIZE 11 |
31 | #define BFA_MFG_PARTNUM_SIZE 14 | 71 | #define BFA_MFG_PARTNUM_SIZE 14 |
32 | #define BFA_MFG_SUPPLIER_ID_SIZE 10 | 72 | #define BFA_MFG_SUPPLIER_ID_SIZE 10 |
33 | #define BFA_MFG_SUPPLIER_PARTNUM_SIZE 20 | 73 | #define BFA_MFG_SUPPLIER_PARTNUM_SIZE 20 |
34 | #define BFA_MFG_SUPPLIER_SERIALNUM_SIZE 20 | 74 | #define BFA_MFG_SUPPLIER_SERIALNUM_SIZE 20 |
35 | #define BFA_MFG_SUPPLIER_REVISION_SIZE 4 | 75 | #define BFA_MFG_SUPPLIER_REVISION_SIZE 4 |
36 | #define STRSZ(_n) (((_n) + 4) & ~3) | 76 | #define STRSZ(_n) (((_n) + 4) & ~3) |
37 | 77 | ||
38 | /** | 78 | /** |
79 | * Manufacturing card type | ||
80 | */ | ||
81 | enum { | ||
82 | BFA_MFG_TYPE_CB_MAX = 825, /* Crossbow card type max */ | ||
83 | BFA_MFG_TYPE_FC8P2 = 825, /* 8G 2port FC card */ | ||
84 | BFA_MFG_TYPE_FC8P1 = 815, /* 8G 1port FC card */ | ||
85 | BFA_MFG_TYPE_FC4P2 = 425, /* 4G 2port FC card */ | ||
86 | BFA_MFG_TYPE_FC4P1 = 415, /* 4G 1port FC card */ | ||
87 | BFA_MFG_TYPE_CNA10P2 = 1020, /* 10G 2port CNA card */ | ||
88 | BFA_MFG_TYPE_CNA10P1 = 1010, /* 10G 1port CNA card */ | ||
89 | }; | ||
90 | |||
91 | #pragma pack(1) | ||
92 | |||
93 | /** | ||
94 | * Card type to port number conversion | ||
95 | */ | ||
96 | #define bfa_mfg_type2port_num(card_type) (((card_type) / 10) % 10) | ||
97 | |||
98 | |||
99 | /** | ||
100 | * All numerical fields are in big-endian format. | ||
101 | */ | ||
102 | struct bfa_mfg_block_s { | ||
103 | }; | ||
104 | |||
105 | /** | ||
39 | * VPD data length | 106 | * VPD data length |
40 | */ | 107 | */ |
41 | #define BFA_MFG_VPD_LEN 256 | 108 | #define BFA_MFG_VPD_LEN 512 |
109 | |||
110 | #define BFA_MFG_VPD_PCI_HDR_OFF 137 | ||
111 | #define BFA_MFG_VPD_PCI_VER_MASK 0x07 /* version mask 3 bits */ | ||
112 | #define BFA_MFG_VPD_PCI_VDR_MASK 0xf8 /* vendor mask 5 bits */ | ||
113 | |||
114 | /** | ||
115 | * VPD vendor tag | ||
116 | */ | ||
117 | enum { | ||
118 | BFA_MFG_VPD_UNKNOWN = 0, /* vendor unknown */ | ||
119 | BFA_MFG_VPD_IBM = 1, /* vendor IBM */ | ||
120 | BFA_MFG_VPD_HP = 2, /* vendor HP */ | ||
121 | BFA_MFG_VPD_DELL = 3, /* vendor DELL */ | ||
122 | BFA_MFG_VPD_PCI_IBM = 0x08, /* PCI VPD IBM */ | ||
123 | BFA_MFG_VPD_PCI_HP = 0x10, /* PCI VPD HP */ | ||
124 | BFA_MFG_VPD_PCI_DELL = 0x20, /* PCI VPD DELL */ | ||
125 | BFA_MFG_VPD_PCI_BRCD = 0xf8, /* PCI VPD Brocade */ | ||
126 | }; | ||
42 | 127 | ||
43 | /** | 128 | /** |
44 | * All numerical fields are in big-endian format. | 129 | * All numerical fields are in big-endian format. |
45 | */ | 130 | */ |
46 | struct bfa_mfg_vpd_s { | 131 | struct bfa_mfg_vpd_s { |
47 | u8 version; /* vpd data version */ | 132 | u8 version; /* vpd data version */ |
48 | u8 vpd_sig[3]; /* characters 'V', 'P', 'D' */ | 133 | u8 vpd_sig[3]; /* characters 'V', 'P', 'D' */ |
49 | u8 chksum; /* u8 checksum */ | 134 | u8 chksum; /* u8 checksum */ |
50 | u8 vendor; /* vendor */ | 135 | u8 vendor; /* vendor */ |
51 | u8 len; /* vpd data length excluding header */ | 136 | u8 len; /* vpd data length excluding header */ |
52 | u8 rsv; | 137 | u8 rsv; |
53 | u8 data[BFA_MFG_VPD_LEN]; /* vpd data */ | 138 | u8 data[BFA_MFG_VPD_LEN]; /* vpd data */ |
54 | }; | 139 | }; |
55 | 140 | ||
56 | #pragma pack(1) | 141 | #pragma pack() |
57 | 142 | ||
58 | #endif /* __BFA_DEFS_MFG_H__ */ | 143 | #endif /* __BFA_DEFS_MFG_H__ */ |
diff --git a/drivers/scsi/bfa/include/defs/bfa_defs_port.h b/drivers/scsi/bfa/include/defs/bfa_defs_port.h index de0696c81bc4..501bc9739d9d 100644 --- a/drivers/scsi/bfa/include/defs/bfa_defs_port.h +++ b/drivers/scsi/bfa/include/defs/bfa_defs_port.h | |||
@@ -185,6 +185,8 @@ struct bfa_port_attr_s { | |||
185 | wwn_t fabric_name; /* attached switch's nwwn */ | 185 | wwn_t fabric_name; /* attached switch's nwwn */ |
186 | u8 fabric_ip_addr[BFA_FCS_FABRIC_IPADDR_SZ]; /* attached | 186 | u8 fabric_ip_addr[BFA_FCS_FABRIC_IPADDR_SZ]; /* attached |
187 | * fabric's ip addr */ | 187 | * fabric's ip addr */ |
188 | struct mac_s fpma_mac; /* Lport's FPMA Mac address */ | ||
189 | u16 authfail; /* auth failed state */ | ||
188 | }; | 190 | }; |
189 | 191 | ||
190 | /** | 192 | /** |
@@ -232,14 +234,15 @@ enum bfa_port_aen_sfp_pom { | |||
232 | }; | 234 | }; |
233 | 235 | ||
234 | struct bfa_port_aen_data_s { | 236 | struct bfa_port_aen_data_s { |
235 | enum bfa_ioc_type_e ioc_type; | 237 | wwn_t pwwn; /* WWN of the physical port */ |
236 | wwn_t pwwn; /* WWN of the physical port */ | 238 | wwn_t fwwn; /* WWN of the fabric port */ |
237 | wwn_t fwwn; /* WWN of the fabric port */ | 239 | s32 phy_port_num; /*! For SFP related events */ |
238 | mac_t mac; /* MAC addres of the ethernet port, | 240 | s16 ioc_type; |
239 | * applicable to CNA port only */ | 241 | s16 level; /* Only transitions will |
240 | int phy_port_num; /*! For SFP related events */ | 242 | * be informed */ |
241 | enum bfa_port_aen_sfp_pom level; /* Only transitions will | 243 | struct mac_s mac; /* MAC address of the ethernet port, |
242 | * be informed */ | 244 | * applicable to CNA port only */ |
245 | s16 rsvd; | ||
243 | }; | 246 | }; |
244 | 247 | ||
245 | #endif /* __BFA_DEFS_PORT_H__ */ | 248 | #endif /* __BFA_DEFS_PORT_H__ */ |
diff --git a/drivers/scsi/bfa/include/defs/bfa_defs_pport.h b/drivers/scsi/bfa/include/defs/bfa_defs_pport.h index bf320412ee24..26e5cc78095d 100644 --- a/drivers/scsi/bfa/include/defs/bfa_defs_pport.h +++ b/drivers/scsi/bfa/include/defs/bfa_defs_pport.h | |||
@@ -232,7 +232,7 @@ struct bfa_pport_attr_s { | |||
232 | u32 pid; /* port ID */ | 232 | u32 pid; /* port ID */ |
233 | enum bfa_pport_type port_type; /* current topology */ | 233 | enum bfa_pport_type port_type; /* current topology */ |
234 | u32 loopback; /* external loopback */ | 234 | u32 loopback; /* external loopback */ |
235 | u32 rsvd1; | 235 | u32 authfail; /* auth fail state */ |
236 | u32 rsvd2; /* padding for 64 bit */ | 236 | u32 rsvd2; /* padding for 64 bit */ |
237 | }; | 237 | }; |
238 | 238 | ||
@@ -240,73 +240,79 @@ struct bfa_pport_attr_s { | |||
240 | * FC Port statistics. | 240 | * FC Port statistics. |
241 | */ | 241 | */ |
242 | struct bfa_pport_fc_stats_s { | 242 | struct bfa_pport_fc_stats_s { |
243 | u64 secs_reset; /* seconds since stats is reset */ | 243 | u64 secs_reset; /* Seconds since stats is reset */ |
244 | u64 tx_frames; /* transmitted frames */ | 244 | u64 tx_frames; /* Tx frames */ |
245 | u64 tx_words; /* transmitted words */ | 245 | u64 tx_words; /* Tx words */ |
246 | u64 rx_frames; /* received frames */ | 246 | u64 tx_lip; /* TX LIP */ |
247 | u64 rx_words; /* received words */ | 247 | u64 tx_nos; /* Tx NOS */ |
248 | u64 lip_count; /* LIPs seen */ | 248 | u64 tx_ols; /* Tx OLS */ |
249 | u64 nos_count; /* NOS count */ | 249 | u64 tx_lr; /* Tx LR */ |
250 | u64 error_frames; /* errored frames (sent?) */ | 250 | u64 tx_lrr; /* Tx LRR */ |
251 | u64 dropped_frames; /* dropped frames */ | 251 | u64 rx_frames; /* Rx frames */ |
252 | u64 link_failures; /* link failure count */ | 252 | u64 rx_words; /* Rx words */ |
253 | u64 loss_of_syncs; /* loss of sync count */ | 253 | u64 lip_count; /* Rx LIP */ |
254 | u64 loss_of_signals;/* loss of signal count */ | 254 | u64 nos_count; /* Rx NOS */ |
255 | u64 primseq_errs; /* primitive sequence protocol */ | 255 | u64 ols_count; /* Rx OLS */ |
256 | u64 bad_os_count; /* invalid ordered set */ | 256 | u64 lr_count; /* Rx LR */ |
257 | u64 err_enc_out; /* Encoding error outside frame */ | 257 | u64 lrr_count; /* Rx LRR */ |
258 | u64 invalid_crcs; /* frames received with invalid CRC*/ | 258 | u64 invalid_crcs; /* Rx CRC err frames */ |
259 | u64 undersized_frm; /* undersized frames */ | 259 | u64 invalid_crc_gd_eof; /* Rx CRC err good EOF frames */ |
260 | u64 oversized_frm; /* oversized frames */ | 260 | u64 undersized_frm; /* Rx undersized frames */ |
261 | u64 bad_eof_frm; /* frames with bad EOF */ | 261 | u64 oversized_frm; /* Rx oversized frames */ |
262 | struct bfa_qos_stats_s qos_stats; /* QoS statistics */ | 262 | u64 bad_eof_frm; /* Rx frames with bad EOF */ |
263 | u64 error_frames; /* Errored frames */ | ||
264 | u64 dropped_frames; /* Dropped frames */ | ||
265 | u64 link_failures; /* Link Failure (LF) count */ | ||
266 | u64 loss_of_syncs; /* Loss of sync count */ | ||
267 | u64 loss_of_signals;/* Loss of signal count */ | ||
268 | u64 primseq_errs; /* Primitive sequence protocol err. */ | ||
269 | u64 bad_os_count; /* Invalid ordered sets */ | ||
270 | u64 err_enc_out; /* Encoding err nonframe_8b10b */ | ||
271 | u64 err_enc; /* Encoding err frame_8b10b */ | ||
263 | }; | 272 | }; |
264 | 273 | ||
265 | /** | 274 | /** |
266 | * Eth Port statistics. | 275 | * Eth Port statistics. |
267 | */ | 276 | */ |
268 | struct bfa_pport_eth_stats_s { | 277 | struct bfa_pport_eth_stats_s { |
269 | u64 secs_reset; /* seconds since stats is reset */ | 278 | u64 secs_reset; /* Seconds since stats is reset */ |
270 | u64 frame_64; /* both rx and tx counter */ | 279 | u64 frame_64; /* Frames 64 bytes */ |
271 | u64 frame_65_127; /* both rx and tx counter */ | 280 | u64 frame_65_127; /* Frames 65-127 bytes */ |
272 | u64 frame_128_255; /* both rx and tx counter */ | 281 | u64 frame_128_255; /* Frames 128-255 bytes */ |
273 | u64 frame_256_511; /* both rx and tx counter */ | 282 | u64 frame_256_511; /* Frames 256-511 bytes */ |
274 | u64 frame_512_1023; /* both rx and tx counter */ | 283 | u64 frame_512_1023; /* Frames 512-1023 bytes */ |
275 | u64 frame_1024_1518; /* both rx and tx counter */ | 284 | u64 frame_1024_1518; /* Frames 1024-1518 bytes */ |
276 | u64 frame_1519_1522; /* both rx and tx counter */ | 285 | u64 frame_1519_1522; /* Frames 1519-1522 bytes */ |
277 | 286 | u64 tx_bytes; /* Tx bytes */ | |
278 | u64 tx_bytes; | 287 | u64 tx_packets; /* Tx packets */ |
279 | u64 tx_packets; | 288 | u64 tx_mcast_packets; /* Tx multicast packets */ |
280 | u64 tx_mcast_packets; | 289 | u64 tx_bcast_packets; /* Tx broadcast packets */ |
281 | u64 tx_bcast_packets; | 290 | u64 tx_control_frame; /* Tx control frame */ |
282 | u64 tx_control_frame; | 291 | u64 tx_drop; /* Tx drops */ |
283 | u64 tx_drop; | 292 | u64 tx_jabber; /* Tx jabber */ |
284 | u64 tx_jabber; | 293 | u64 tx_fcs_error; /* Tx FCS error */ |
285 | u64 tx_fcs_error; | 294 | u64 tx_fragments; /* Tx fragments */ |
286 | u64 tx_fragments; | 295 | u64 rx_bytes; /* Rx bytes */ |
287 | 296 | u64 rx_packets; /* Rx packets */ | |
288 | u64 rx_bytes; | 297 | u64 rx_mcast_packets; /* Rx multicast packets */ |
289 | u64 rx_packets; | 298 | u64 rx_bcast_packets; /* Rx broadcast packets */ |
290 | u64 rx_mcast_packets; | 299 | u64 rx_control_frames; /* Rx control frames */ |
291 | u64 rx_bcast_packets; | 300 | u64 rx_unknown_opcode; /* Rx unknown opcode */ |
292 | u64 rx_control_frames; | 301 | u64 rx_drop; /* Rx drops */ |
293 | u64 rx_unknown_opcode; | 302 | u64 rx_jabber; /* Rx jabber */ |
294 | u64 rx_drop; | 303 | u64 rx_fcs_error; /* Rx FCS errors */ |
295 | u64 rx_jabber; | 304 | u64 rx_alignment_error; /* Rx alignment errors */ |
296 | u64 rx_fcs_error; | 305 | u64 rx_frame_length_error; /* Rx frame len errors */ |
297 | u64 rx_alignment_error; | 306 | u64 rx_code_error; /* Rx code errors */ |
298 | u64 rx_frame_length_error; | 307 | u64 rx_fragments; /* Rx fragments */ |
299 | u64 rx_code_error; | 308 | u64 rx_pause; /* Rx pause */ |
300 | u64 rx_fragments; | 309 | u64 rx_zero_pause; /* Rx zero pause */ |
301 | 310 | u64 tx_pause; /* Tx pause */ | |
302 | u64 rx_pause; /* BPC */ | 311 | u64 tx_zero_pause; /* Tx zero pause */ |
303 | u64 rx_zero_pause; /* BPC Pause cancellation */ | 312 | u64 rx_fcoe_pause; /* Rx fcoe pause */ |
304 | u64 tx_pause; /* BPC */ | 313 | u64 rx_fcoe_zero_pause; /* Rx FCoE zero pause */ |
305 | u64 tx_zero_pause; /* BPC Pause cancellation */ | 314 | u64 tx_fcoe_pause; /* Tx FCoE pause */ |
306 | u64 rx_fcoe_pause; /* BPC */ | 315 | u64 tx_fcoe_zero_pause; /* Tx FCoE zero pause */ |
307 | u64 rx_fcoe_zero_pause; /* BPC Pause cancellation */ | ||
308 | u64 tx_fcoe_pause; /* BPC */ | ||
309 | u64 tx_fcoe_zero_pause; /* BPC Pause cancellation */ | ||
310 | }; | 316 | }; |
311 | 317 | ||
312 | /** | 318 | /** |
@@ -333,8 +339,7 @@ struct bfa_pport_fcpmap_s { | |||
333 | }; | 339 | }; |
334 | 340 | ||
335 | /** | 341 | /** |
336 | * Port RNID info. | 342 | * Port RNI */ |
337 | */ | ||
338 | struct bfa_pport_rnid_s { | 343 | struct bfa_pport_rnid_s { |
339 | wwn_t wwn; | 344 | wwn_t wwn; |
340 | u32 unittype; | 345 | u32 unittype; |
@@ -347,6 +352,23 @@ struct bfa_pport_rnid_s { | |||
347 | u16 topologydiscoveryflags; | 352 | u16 topologydiscoveryflags; |
348 | }; | 353 | }; |
349 | 354 | ||
355 | struct bfa_fcport_fcf_s { | ||
356 | wwn_t name; /* FCF name */ | ||
357 | wwn_t fabric_name; /* Fabric Name */ | ||
358 | u8 fipenabled; /* FIP enabled or not */ | ||
359 | u8 fipfailed; /* FIP failed or not */ | ||
360 | u8 resv[2]; | ||
361 | u8 pri; /* FCF priority */ | ||
362 | u8 version; /* FIP version used */ | ||
363 | u8 available; /* Available for login */ | ||
364 | u8 fka_disabled; /* FKA is disabled */ | ||
365 | u8 maxsz_verified; /* FCoE max size verified */ | ||
366 | u8 fc_map[3]; /* FC map */ | ||
367 | u16 vlan; /* FCoE vlan tag/priority */ | ||
368 | u32 fka_adv_per; /* FIP ka advert. period */ | ||
369 | struct mac_s mac; /* FCF mac */ | ||
370 | }; | ||
371 | |||
350 | /** | 372 | /** |
351 | * Link state information | 373 | * Link state information |
352 | */ | 374 | */ |
@@ -378,6 +400,7 @@ struct bfa_pport_link_s { | |||
378 | struct fc_alpabm_s alpabm; /* alpa bitmap */ | 400 | struct fc_alpabm_s alpabm; /* alpa bitmap */ |
379 | } loop_info; | 401 | } loop_info; |
380 | } tl; | 402 | } tl; |
403 | struct bfa_fcport_fcf_s fcf; /*!< FCF information (for FCoE) */ | ||
381 | }; | 404 | }; |
382 | 405 | ||
383 | #endif /* __BFA_DEFS_PPORT_H__ */ | 406 | #endif /* __BFA_DEFS_PPORT_H__ */ |
diff --git a/drivers/scsi/bfa/include/defs/bfa_defs_status.h b/drivers/scsi/bfa/include/defs/bfa_defs_status.h index cdceaeb9f4b8..4374494bd566 100644 --- a/drivers/scsi/bfa/include/defs/bfa_defs_status.h +++ b/drivers/scsi/bfa/include/defs/bfa_defs_status.h | |||
@@ -180,8 +180,8 @@ enum bfa_status { | |||
180 | BFA_STATUS_IM_ADAPT_ALREADY_IN_TEAM = 114, /* Given adapter is part | 180 | BFA_STATUS_IM_ADAPT_ALREADY_IN_TEAM = 114, /* Given adapter is part |
181 | * of another team */ | 181 | * of another team */ |
182 | BFA_STATUS_IM_ADAPT_HAS_VLANS = 115, /* Adapter has VLANs configured. | 182 | BFA_STATUS_IM_ADAPT_HAS_VLANS = 115, /* Adapter has VLANs configured. |
183 | * Delete all VLANs before | 183 | * Delete all VLANs to become |
184 | * creating team */ | 184 | * part of the team */ |
185 | BFA_STATUS_IM_PVID_MISMATCH = 116, /* Mismatching PVIDs configured | 185 | BFA_STATUS_IM_PVID_MISMATCH = 116, /* Mismatching PVIDs configured |
186 | * for adapters */ | 186 | * for adapters */ |
187 | BFA_STATUS_IM_LINK_SPEED_MISMATCH = 117, /* Mismatching link speeds | 187 | BFA_STATUS_IM_LINK_SPEED_MISMATCH = 117, /* Mismatching link speeds |
@@ -213,7 +213,7 @@ enum bfa_status { | |||
213 | * loaded */ | 213 | * loaded */ |
214 | BFA_STATUS_CARD_TYPE_MISMATCH = 131, /* Card type mismatch */ | 214 | BFA_STATUS_CARD_TYPE_MISMATCH = 131, /* Card type mismatch */ |
215 | BFA_STATUS_BAD_ASICBLK = 132, /* Bad ASIC block */ | 215 | BFA_STATUS_BAD_ASICBLK = 132, /* Bad ASIC block */ |
216 | BFA_STATUS_NO_DRIVER = 133, /* Storage/Ethernet driver not loaded */ | 216 | BFA_STATUS_NO_DRIVER = 133, /* Brocade adapter/driver not installed or loaded */ |
217 | BFA_STATUS_INVALID_MAC = 134, /* Invalid mac address */ | 217 | BFA_STATUS_INVALID_MAC = 134, /* Invalid mac address */ |
218 | BFA_STATUS_IM_NO_VLAN = 135, /* No VLANs configured on the adapter */ | 218 | BFA_STATUS_IM_NO_VLAN = 135, /* No VLANs configured on the adapter */ |
219 | BFA_STATUS_IM_ETH_LB_FAILED = 136, /* Ethernet loopback test failed */ | 219 | BFA_STATUS_IM_ETH_LB_FAILED = 136, /* Ethernet loopback test failed */ |
@@ -228,8 +228,7 @@ enum bfa_status { | |||
228 | BFA_STATUS_IM_GET_INETCFG_FAILED = 142, /* Acquiring Network Subsytem | 228 | BFA_STATUS_IM_GET_INETCFG_FAILED = 142, /* Acquiring Network Subsytem |
229 | * handle Failed. Please try | 229 | * handle Failed. Please try |
230 | * after some time */ | 230 | * after some time */ |
231 | BFA_STATUS_IM_NOT_BOUND = 143, /* Brocade 10G Ethernet Service is not | 231 | BFA_STATUS_IM_NOT_BOUND = 143, /* IM driver is not active */ |
232 | * Enabled on this port */ | ||
233 | BFA_STATUS_INSUFFICIENT_PERMS = 144, /* User doesn't have sufficient | 232 | BFA_STATUS_INSUFFICIENT_PERMS = 144, /* User doesn't have sufficient |
234 | * permissions to execute the BCU | 233 | * permissions to execute the BCU |
235 | * application */ | 234 | * application */ |
@@ -242,6 +241,14 @@ enum bfa_status { | |||
242 | * failed */ | 241 | * failed */ |
243 | BFA_STATUS_IM_UNBIND_FAILED = 149, /* ! < IM Driver unbind operation | 242 | BFA_STATUS_IM_UNBIND_FAILED = 149, /* ! < IM Driver unbind operation |
244 | * failed */ | 243 | * failed */ |
244 | BFA_STATUS_IM_PORT_IN_TEAM = 150, /* Port is already part of the | ||
245 | * team */ | ||
246 | BFA_STATUS_IM_VLAN_NOT_FOUND = 151, /* VLAN ID doesn't exists */ | ||
247 | BFA_STATUS_IM_TEAM_NOT_FOUND = 152, /* Teaming configuration doesn't | ||
248 | * exists */ | ||
249 | BFA_STATUS_IM_TEAM_CFG_NOT_ALLOWED = 153, /* Given settings are not | ||
250 | * allowed for the current | ||
251 | * Teaming mode */ | ||
245 | BFA_STATUS_MAX_VAL /* Unknown error code */ | 252 | BFA_STATUS_MAX_VAL /* Unknown error code */ |
246 | }; | 253 | }; |
247 | #define bfa_status_t enum bfa_status | 254 | #define bfa_status_t enum bfa_status |
diff --git a/drivers/scsi/bfa/include/fcb/bfa_fcb_fcpim.h b/drivers/scsi/bfa/include/fcb/bfa_fcb_fcpim.h index a6c70aee0aa3..52585d3dd891 100644 --- a/drivers/scsi/bfa/include/fcb/bfa_fcb_fcpim.h +++ b/drivers/scsi/bfa/include/fcb/bfa_fcb_fcpim.h | |||
@@ -70,7 +70,6 @@ void bfa_fcb_itnim_online(struct bfad_itnim_s *itnim_drv); | |||
70 | */ | 70 | */ |
71 | void bfa_fcb_itnim_offline(struct bfad_itnim_s *itnim_drv); | 71 | void bfa_fcb_itnim_offline(struct bfad_itnim_s *itnim_drv); |
72 | 72 | ||
73 | void bfa_fcb_itnim_tov_begin(struct bfad_itnim_s *itnim_drv); | ||
74 | void bfa_fcb_itnim_tov(struct bfad_itnim_s *itnim_drv); | 73 | void bfa_fcb_itnim_tov(struct bfad_itnim_s *itnim_drv); |
75 | 74 | ||
76 | #endif /* __BFAD_FCB_FCPIM_H__ */ | 75 | #endif /* __BFAD_FCB_FCPIM_H__ */ |
diff --git a/drivers/scsi/bfa/include/fcs/bfa_fcs.h b/drivers/scsi/bfa/include/fcs/bfa_fcs.h index 627669c65546..f2fd35fdee28 100644 --- a/drivers/scsi/bfa/include/fcs/bfa_fcs.h +++ b/drivers/scsi/bfa/include/fcs/bfa_fcs.h | |||
@@ -49,6 +49,7 @@ struct bfa_fcs_s { | |||
49 | struct bfa_trc_mod_s *trcmod; /* tracing module */ | 49 | struct bfa_trc_mod_s *trcmod; /* tracing module */ |
50 | struct bfa_aen_s *aen; /* aen component */ | 50 | struct bfa_aen_s *aen; /* aen component */ |
51 | bfa_boolean_t vf_enabled; /* VF mode is enabled */ | 51 | bfa_boolean_t vf_enabled; /* VF mode is enabled */ |
52 | bfa_boolean_t fdmi_enabled; /*!< FDMI is enabled */ | ||
52 | bfa_boolean_t min_cfg; /* min cfg enabled/disabled */ | 53 | bfa_boolean_t min_cfg; /* min cfg enabled/disabled */ |
53 | u16 port_vfid; /* port default VF ID */ | 54 | u16 port_vfid; /* port default VF ID */ |
54 | struct bfa_fcs_driver_info_s driver_info; | 55 | struct bfa_fcs_driver_info_s driver_info; |
@@ -60,10 +61,12 @@ struct bfa_fcs_s { | |||
60 | /* | 61 | /* |
61 | * bfa fcs API functions | 62 | * bfa fcs API functions |
62 | */ | 63 | */ |
63 | void bfa_fcs_init(struct bfa_fcs_s *fcs, struct bfa_s *bfa, struct bfad_s *bfad, | 64 | void bfa_fcs_attach(struct bfa_fcs_s *fcs, struct bfa_s *bfa, struct bfad_s *bfad, |
64 | bfa_boolean_t min_cfg); | 65 | bfa_boolean_t min_cfg); |
66 | void bfa_fcs_init(struct bfa_fcs_s *fcs); | ||
65 | void bfa_fcs_driver_info_init(struct bfa_fcs_s *fcs, | 67 | void bfa_fcs_driver_info_init(struct bfa_fcs_s *fcs, |
66 | struct bfa_fcs_driver_info_s *driver_info); | 68 | struct bfa_fcs_driver_info_s *driver_info); |
69 | void bfa_fcs_set_fdmi_param(struct bfa_fcs_s *fcs, bfa_boolean_t fdmi_enable); | ||
67 | void bfa_fcs_exit(struct bfa_fcs_s *fcs); | 70 | void bfa_fcs_exit(struct bfa_fcs_s *fcs); |
68 | void bfa_fcs_trc_init(struct bfa_fcs_s *fcs, struct bfa_trc_mod_s *trcmod); | 71 | void bfa_fcs_trc_init(struct bfa_fcs_s *fcs, struct bfa_trc_mod_s *trcmod); |
69 | void bfa_fcs_log_init(struct bfa_fcs_s *fcs, struct bfa_log_mod_s *logmod); | 72 | void bfa_fcs_log_init(struct bfa_fcs_s *fcs, struct bfa_log_mod_s *logmod); |
diff --git a/drivers/scsi/bfa/include/fcs/bfa_fcs_lport.h b/drivers/scsi/bfa/include/fcs/bfa_fcs_lport.h index 967ceb0eb074..ceaefd3060f4 100644 --- a/drivers/scsi/bfa/include/fcs/bfa_fcs_lport.h +++ b/drivers/scsi/bfa/include/fcs/bfa_fcs_lport.h | |||
@@ -34,14 +34,6 @@ struct bfa_fcs_s; | |||
34 | struct bfa_fcs_fabric_s; | 34 | struct bfa_fcs_fabric_s; |
35 | 35 | ||
36 | /* | 36 | /* |
37 | * @todo : need to move to a global config file. | ||
38 | * Maximum Vports supported per physical port or vf. | ||
39 | */ | ||
40 | #define BFA_FCS_MAX_VPORTS_SUPP_CB 255 | ||
41 | #define BFA_FCS_MAX_VPORTS_SUPP_CT 191 | ||
42 | |||
43 | /* | ||
44 | * @todo : need to move to a global config file. | ||
45 | * Maximum Rports supported per port (physical/logical). | 37 | * Maximum Rports supported per port (physical/logical). |
46 | */ | 38 | */ |
47 | #define BFA_FCS_MAX_RPORTS_SUPP 256 /* @todo : tentative value */ | 39 | #define BFA_FCS_MAX_RPORTS_SUPP 256 /* @todo : tentative value */ |
diff --git a/drivers/scsi/bfa/include/log/bfa_log_hal.h b/drivers/scsi/bfa/include/log/bfa_log_hal.h index 0412aea2ec30..5f8f5e30b9e8 100644 --- a/drivers/scsi/bfa/include/log/bfa_log_hal.h +++ b/drivers/scsi/bfa/include/log/bfa_log_hal.h | |||
@@ -27,4 +27,10 @@ | |||
27 | (((u32) BFA_LOG_HAL_ID << BFA_LOG_MODID_OFFSET) | 3) | 27 | (((u32) BFA_LOG_HAL_ID << BFA_LOG_MODID_OFFSET) | 3) |
28 | #define BFA_LOG_HAL_SM_ASSERT \ | 28 | #define BFA_LOG_HAL_SM_ASSERT \ |
29 | (((u32) BFA_LOG_HAL_ID << BFA_LOG_MODID_OFFSET) | 4) | 29 | (((u32) BFA_LOG_HAL_ID << BFA_LOG_MODID_OFFSET) | 4) |
30 | #define BFA_LOG_HAL_DRIVER_ERROR \ | ||
31 | (((u32) BFA_LOG_HAL_ID << BFA_LOG_MODID_OFFSET) | 5) | ||
32 | #define BFA_LOG_HAL_DRIVER_CONFIG_ERROR \ | ||
33 | (((u32) BFA_LOG_HAL_ID << BFA_LOG_MODID_OFFSET) | 6) | ||
34 | #define BFA_LOG_HAL_MBOX_ERROR \ | ||
35 | (((u32) BFA_LOG_HAL_ID << BFA_LOG_MODID_OFFSET) | 7) | ||
30 | #endif | 36 | #endif |
diff --git a/drivers/scsi/bfa/include/log/bfa_log_linux.h b/drivers/scsi/bfa/include/log/bfa_log_linux.h index 317c0547ee16..bd451db4c30a 100644 --- a/drivers/scsi/bfa/include/log/bfa_log_linux.h +++ b/drivers/scsi/bfa/include/log/bfa_log_linux.h | |||
@@ -41,4 +41,20 @@ | |||
41 | (((u32) BFA_LOG_LINUX_ID << BFA_LOG_MODID_OFFSET) | 10) | 41 | (((u32) BFA_LOG_LINUX_ID << BFA_LOG_MODID_OFFSET) | 10) |
42 | #define BFA_LOG_LINUX_SCSI_ABORT_COMP \ | 42 | #define BFA_LOG_LINUX_SCSI_ABORT_COMP \ |
43 | (((u32) BFA_LOG_LINUX_ID << BFA_LOG_MODID_OFFSET) | 11) | 43 | (((u32) BFA_LOG_LINUX_ID << BFA_LOG_MODID_OFFSET) | 11) |
44 | #define BFA_LOG_LINUX_DRIVER_CONFIG_ERROR \ | ||
45 | (((u32) BFA_LOG_LINUX_ID << BFA_LOG_MODID_OFFSET) | 12) | ||
46 | #define BFA_LOG_LINUX_BNA_STATE_MACHINE \ | ||
47 | (((u32) BFA_LOG_LINUX_ID << BFA_LOG_MODID_OFFSET) | 13) | ||
48 | #define BFA_LOG_LINUX_IOC_ERROR \ | ||
49 | (((u32) BFA_LOG_LINUX_ID << BFA_LOG_MODID_OFFSET) | 14) | ||
50 | #define BFA_LOG_LINUX_RESOURCE_ALLOC_ERROR \ | ||
51 | (((u32) BFA_LOG_LINUX_ID << BFA_LOG_MODID_OFFSET) | 15) | ||
52 | #define BFA_LOG_LINUX_RING_BUFFER_ERROR \ | ||
53 | (((u32) BFA_LOG_LINUX_ID << BFA_LOG_MODID_OFFSET) | 16) | ||
54 | #define BFA_LOG_LINUX_DRIVER_ERROR \ | ||
55 | (((u32) BFA_LOG_LINUX_ID << BFA_LOG_MODID_OFFSET) | 17) | ||
56 | #define BFA_LOG_LINUX_DRIVER_DIAG \ | ||
57 | (((u32) BFA_LOG_LINUX_ID << BFA_LOG_MODID_OFFSET) | 18) | ||
58 | #define BFA_LOG_LINUX_DRIVER_AEN \ | ||
59 | (((u32) BFA_LOG_LINUX_ID << BFA_LOG_MODID_OFFSET) | 19) | ||
44 | #endif | 60 | #endif |
diff --git a/drivers/scsi/bfa/include/protocol/fc.h b/drivers/scsi/bfa/include/protocol/fc.h index 14969eecf6a9..8d1038035a76 100644 --- a/drivers/scsi/bfa/include/protocol/fc.h +++ b/drivers/scsi/bfa/include/protocol/fc.h | |||
@@ -50,6 +50,11 @@ struct fchs_s { | |||
50 | 50 | ||
51 | u32 ro; /* relative offset */ | 51 | u32 ro; /* relative offset */ |
52 | }; | 52 | }; |
53 | |||
54 | #define FC_SOF_LEN 4 | ||
55 | #define FC_EOF_LEN 4 | ||
56 | #define FC_CRC_LEN 4 | ||
57 | |||
53 | /* | 58 | /* |
54 | * Fibre Channel BB_E Header Structure | 59 | * Fibre Channel BB_E Header Structure |
55 | */ | 60 | */ |
diff --git a/drivers/scsi/bfa/include/protocol/pcifw.h b/drivers/scsi/bfa/include/protocol/pcifw.h deleted file mode 100644 index 6830dc3ee58a..000000000000 --- a/drivers/scsi/bfa/include/protocol/pcifw.h +++ /dev/null | |||
@@ -1,75 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (c) 2005-2009 Brocade Communications Systems, Inc. | ||
3 | * All rights reserved | ||
4 | * www.brocade.com | ||
5 | * | ||
6 | * Linux driver for Brocade Fibre Channel Host Bus Adapter. | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify it | ||
9 | * under the terms of the GNU General Public License (GPL) Version 2 as | ||
10 | * published by the Free Software Foundation | ||
11 | * | ||
12 | * This program is distributed in the hope that it will be useful, but | ||
13 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
15 | * General Public License for more details. | ||
16 | */ | ||
17 | |||
18 | /** | ||
19 | * pcifw.h PCI FW related headers | ||
20 | */ | ||
21 | |||
22 | #ifndef __PCIFW_H__ | ||
23 | #define __PCIFW_H__ | ||
24 | |||
25 | #pragma pack(1) | ||
26 | |||
27 | struct pnp_hdr_s{ | ||
28 | u32 signature; /* "$PnP" */ | ||
29 | u8 rev; /* Struct revision */ | ||
30 | u8 len; /* Header structure len in multiples | ||
31 | * of 16 bytes */ | ||
32 | u16 off; /* Offset to next header 00 if none */ | ||
33 | u8 rsvd; /* Reserved byte */ | ||
34 | u8 cksum; /* 8-bit checksum for this header */ | ||
35 | u32 pnp_dev_id; /* PnP Device Id */ | ||
36 | u16 mfstr; /* Pointer to manufacturer string */ | ||
37 | u16 prstr; /* Pointer to product string */ | ||
38 | u8 devtype[3]; /* Device Type Code */ | ||
39 | u8 devind; /* Device Indicator */ | ||
40 | u16 bcventr; /* Bootstrap entry vector */ | ||
41 | u16 rsvd2; /* Reserved */ | ||
42 | u16 sriv; /* Static resource information vector */ | ||
43 | }; | ||
44 | |||
45 | struct pci_3_0_ds_s{ | ||
46 | u32 sig; /* Signature "PCIR" */ | ||
47 | u16 vendid; /* Vendor ID */ | ||
48 | u16 devid; /* Device ID */ | ||
49 | u16 devlistoff; /* Device List Offset */ | ||
50 | u16 len; /* PCI Data Structure Length */ | ||
51 | u8 rev; /* PCI Data Structure Revision */ | ||
52 | u8 clcode[3]; /* Class Code */ | ||
53 | u16 imglen; /* Code image length in multiples of | ||
54 | * 512 bytes */ | ||
55 | u16 coderev; /* Revision level of code/data */ | ||
56 | u8 codetype; /* Code type 0x00 - BIOS */ | ||
57 | u8 indr; /* Last image indicator */ | ||
58 | u16 mrtimglen; /* Max Run Time Image Length */ | ||
59 | u16 cuoff; /* Config Utility Code Header Offset */ | ||
60 | u16 dmtfclp; /* DMTF CLP entry point offset */ | ||
61 | }; | ||
62 | |||
63 | struct pci_optrom_hdr_s{ | ||
64 | u16 sig; /* Signature 0x55AA */ | ||
65 | u8 len; /* Option ROM length in units of 512 bytes */ | ||
66 | u8 inivec[3]; /* Initialization vector */ | ||
67 | u8 rsvd[16]; /* Reserved field */ | ||
68 | u16 verptr; /* Pointer to version string - private */ | ||
69 | u16 pcids; /* Pointer to PCI data structure */ | ||
70 | u16 pnphdr; /* Pointer to PnP expansion header */ | ||
71 | }; | ||
72 | |||
73 | #pragma pack() | ||
74 | |||
75 | #endif | ||
diff --git a/drivers/scsi/bfa/loop.c b/drivers/scsi/bfa/loop.c index f7c7f4f3c640..f6342efb6a90 100644 --- a/drivers/scsi/bfa/loop.c +++ b/drivers/scsi/bfa/loop.c | |||
@@ -162,7 +162,7 @@ bfa_fcs_port_loop_send_plogi(struct bfa_fcs_port_s *port, u8 alpa) | |||
162 | len = fc_plogi_build(&fchs, bfa_fcxp_get_reqbuf(fcxp), alpa, | 162 | len = fc_plogi_build(&fchs, bfa_fcxp_get_reqbuf(fcxp), alpa, |
163 | bfa_fcs_port_get_fcid(port), 0, | 163 | bfa_fcs_port_get_fcid(port), 0, |
164 | port->port_cfg.pwwn, port->port_cfg.nwwn, | 164 | port->port_cfg.pwwn, port->port_cfg.nwwn, |
165 | bfa_pport_get_maxfrsize(port->fcs->bfa)); | 165 | bfa_fcport_get_maxfrsize(port->fcs->bfa)); |
166 | 166 | ||
167 | bfa_fcxp_send(fcxp, NULL, port->fabric->vf_id, port->lp_tag, BFA_FALSE, | 167 | bfa_fcxp_send(fcxp, NULL, port->fabric->vf_id, port->lp_tag, BFA_FALSE, |
168 | FC_CLASS_3, len, &fchs, | 168 | FC_CLASS_3, len, &fchs, |
diff --git a/drivers/scsi/bfa/lport_api.c b/drivers/scsi/bfa/lport_api.c index 1e06792cd4c2..d3907d184e2b 100644 --- a/drivers/scsi/bfa/lport_api.c +++ b/drivers/scsi/bfa/lport_api.c | |||
@@ -156,7 +156,7 @@ bfa_fcs_port_get_rport_max_speed(struct bfa_fcs_port_s *port) | |||
156 | /* | 156 | /* |
157 | * Get Physical port's current speed | 157 | * Get Physical port's current speed |
158 | */ | 158 | */ |
159 | bfa_pport_get_attr(port->fcs->bfa, &pport_attr); | 159 | bfa_fcport_get_attr(port->fcs->bfa, &pport_attr); |
160 | pport_speed = pport_attr.speed; | 160 | pport_speed = pport_attr.speed; |
161 | bfa_trc(fcs, pport_speed); | 161 | bfa_trc(fcs, pport_speed); |
162 | 162 | ||
@@ -235,7 +235,8 @@ bfa_fcs_port_get_info(struct bfa_fcs_port_s *port, | |||
235 | port_info->port_wwn = bfa_fcs_port_get_pwwn(port); | 235 | port_info->port_wwn = bfa_fcs_port_get_pwwn(port); |
236 | port_info->node_wwn = bfa_fcs_port_get_nwwn(port); | 236 | port_info->node_wwn = bfa_fcs_port_get_nwwn(port); |
237 | 237 | ||
238 | port_info->max_vports_supp = bfa_fcs_vport_get_max(port->fcs); | 238 | port_info->max_vports_supp = |
239 | bfa_lps_get_max_vport(port->fcs->bfa); | ||
239 | port_info->num_vports_inuse = | 240 | port_info->num_vports_inuse = |
240 | bfa_fcs_fabric_vport_count(port->fabric); | 241 | bfa_fcs_fabric_vport_count(port->fabric); |
241 | port_info->max_rports_supp = BFA_FCS_MAX_RPORTS_SUPP; | 242 | port_info->max_rports_supp = BFA_FCS_MAX_RPORTS_SUPP; |
diff --git a/drivers/scsi/bfa/ms.c b/drivers/scsi/bfa/ms.c index c96b3ca007ae..5e8c8dee6c97 100644 --- a/drivers/scsi/bfa/ms.c +++ b/drivers/scsi/bfa/ms.c | |||
@@ -118,7 +118,7 @@ bfa_fcs_port_ms_sm_offline(struct bfa_fcs_port_ms_s *ms, | |||
118 | break; | 118 | break; |
119 | 119 | ||
120 | default: | 120 | default: |
121 | bfa_assert(0); | 121 | bfa_sm_fault(ms->port->fcs, event); |
122 | } | 122 | } |
123 | } | 123 | } |
124 | 124 | ||
@@ -141,7 +141,7 @@ bfa_fcs_port_ms_sm_plogi_sending(struct bfa_fcs_port_ms_s *ms, | |||
141 | break; | 141 | break; |
142 | 142 | ||
143 | default: | 143 | default: |
144 | bfa_assert(0); | 144 | bfa_sm_fault(ms->port->fcs, event); |
145 | } | 145 | } |
146 | } | 146 | } |
147 | 147 | ||
@@ -190,7 +190,7 @@ bfa_fcs_port_ms_sm_plogi(struct bfa_fcs_port_ms_s *ms, enum port_ms_event event) | |||
190 | break; | 190 | break; |
191 | 191 | ||
192 | default: | 192 | default: |
193 | bfa_assert(0); | 193 | bfa_sm_fault(ms->port->fcs, event); |
194 | } | 194 | } |
195 | } | 195 | } |
196 | 196 | ||
@@ -216,7 +216,7 @@ bfa_fcs_port_ms_sm_plogi_retry(struct bfa_fcs_port_ms_s *ms, | |||
216 | break; | 216 | break; |
217 | 217 | ||
218 | default: | 218 | default: |
219 | bfa_assert(0); | 219 | bfa_sm_fault(ms->port->fcs, event); |
220 | } | 220 | } |
221 | } | 221 | } |
222 | 222 | ||
@@ -230,10 +230,6 @@ bfa_fcs_port_ms_sm_online(struct bfa_fcs_port_ms_s *ms, | |||
230 | switch (event) { | 230 | switch (event) { |
231 | case MSSM_EVENT_PORT_OFFLINE: | 231 | case MSSM_EVENT_PORT_OFFLINE: |
232 | bfa_sm_set_state(ms, bfa_fcs_port_ms_sm_offline); | 232 | bfa_sm_set_state(ms, bfa_fcs_port_ms_sm_offline); |
233 | /* | ||
234 | * now invoke MS related sub-modules | ||
235 | */ | ||
236 | bfa_fcs_port_fdmi_offline(ms); | ||
237 | break; | 233 | break; |
238 | 234 | ||
239 | case MSSM_EVENT_PORT_FABRIC_RSCN: | 235 | case MSSM_EVENT_PORT_FABRIC_RSCN: |
@@ -243,7 +239,7 @@ bfa_fcs_port_ms_sm_online(struct bfa_fcs_port_ms_s *ms, | |||
243 | break; | 239 | break; |
244 | 240 | ||
245 | default: | 241 | default: |
246 | bfa_assert(0); | 242 | bfa_sm_fault(ms->port->fcs, event); |
247 | } | 243 | } |
248 | } | 244 | } |
249 | 245 | ||
@@ -266,7 +262,7 @@ bfa_fcs_port_ms_sm_gmal_sending(struct bfa_fcs_port_ms_s *ms, | |||
266 | break; | 262 | break; |
267 | 263 | ||
268 | default: | 264 | default: |
269 | bfa_assert(0); | 265 | bfa_sm_fault(ms->port->fcs, event); |
270 | } | 266 | } |
271 | } | 267 | } |
272 | 268 | ||
@@ -304,7 +300,7 @@ bfa_fcs_port_ms_sm_gmal(struct bfa_fcs_port_ms_s *ms, enum port_ms_event event) | |||
304 | break; | 300 | break; |
305 | 301 | ||
306 | default: | 302 | default: |
307 | bfa_assert(0); | 303 | bfa_sm_fault(ms->port->fcs, event); |
308 | } | 304 | } |
309 | } | 305 | } |
310 | 306 | ||
@@ -330,7 +326,7 @@ bfa_fcs_port_ms_sm_gmal_retry(struct bfa_fcs_port_ms_s *ms, | |||
330 | break; | 326 | break; |
331 | 327 | ||
332 | default: | 328 | default: |
333 | bfa_assert(0); | 329 | bfa_sm_fault(ms->port->fcs, event); |
334 | } | 330 | } |
335 | } | 331 | } |
336 | 332 | ||
@@ -466,7 +462,7 @@ bfa_fcs_port_ms_sm_gfn_sending(struct bfa_fcs_port_ms_s *ms, | |||
466 | break; | 462 | break; |
467 | 463 | ||
468 | default: | 464 | default: |
469 | bfa_assert(0); | 465 | bfa_sm_fault(ms->port->fcs, event); |
470 | } | 466 | } |
471 | } | 467 | } |
472 | 468 | ||
@@ -502,7 +498,7 @@ bfa_fcs_port_ms_sm_gfn(struct bfa_fcs_port_ms_s *ms, enum port_ms_event event) | |||
502 | break; | 498 | break; |
503 | 499 | ||
504 | default: | 500 | default: |
505 | bfa_assert(0); | 501 | bfa_sm_fault(ms->port->fcs, event); |
506 | } | 502 | } |
507 | } | 503 | } |
508 | 504 | ||
@@ -528,7 +524,7 @@ bfa_fcs_port_ms_sm_gfn_retry(struct bfa_fcs_port_ms_s *ms, | |||
528 | break; | 524 | break; |
529 | 525 | ||
530 | default: | 526 | default: |
531 | bfa_assert(0); | 527 | bfa_sm_fault(ms->port->fcs, event); |
532 | } | 528 | } |
533 | } | 529 | } |
534 | 530 | ||
@@ -637,7 +633,7 @@ bfa_fcs_port_ms_send_plogi(void *ms_cbarg, struct bfa_fcxp_s *fcxp_alloced) | |||
637 | bfa_os_hton3b(FC_MGMT_SERVER), | 633 | bfa_os_hton3b(FC_MGMT_SERVER), |
638 | bfa_fcs_port_get_fcid(port), 0, | 634 | bfa_fcs_port_get_fcid(port), 0, |
639 | port->port_cfg.pwwn, port->port_cfg.nwwn, | 635 | port->port_cfg.pwwn, port->port_cfg.nwwn, |
640 | bfa_pport_get_maxfrsize(port->fcs->bfa)); | 636 | bfa_fcport_get_maxfrsize(port->fcs->bfa)); |
641 | 637 | ||
642 | bfa_fcxp_send(fcxp, NULL, port->fabric->vf_id, port->lp_tag, BFA_FALSE, | 638 | bfa_fcxp_send(fcxp, NULL, port->fabric->vf_id, port->lp_tag, BFA_FALSE, |
643 | FC_CLASS_3, len, &fchs, bfa_fcs_port_ms_plogi_response, | 639 | FC_CLASS_3, len, &fchs, bfa_fcs_port_ms_plogi_response, |
@@ -735,6 +731,7 @@ bfa_fcs_port_ms_offline(struct bfa_fcs_port_s *port) | |||
735 | 731 | ||
736 | ms->port = port; | 732 | ms->port = port; |
737 | bfa_sm_send_event(ms, MSSM_EVENT_PORT_OFFLINE); | 733 | bfa_sm_send_event(ms, MSSM_EVENT_PORT_OFFLINE); |
734 | bfa_fcs_port_fdmi_offline(ms); | ||
738 | } | 735 | } |
739 | 736 | ||
740 | void | 737 | void |
diff --git a/drivers/scsi/bfa/ns.c b/drivers/scsi/bfa/ns.c index 2f8b880060bb..d20dd7e15742 100644 --- a/drivers/scsi/bfa/ns.c +++ b/drivers/scsi/bfa/ns.c | |||
@@ -164,7 +164,7 @@ bfa_fcs_port_ns_sm_offline(struct bfa_fcs_port_ns_s *ns, | |||
164 | break; | 164 | break; |
165 | 165 | ||
166 | default: | 166 | default: |
167 | bfa_assert(0); | 167 | bfa_sm_fault(ns->port->fcs, event); |
168 | } | 168 | } |
169 | } | 169 | } |
170 | 170 | ||
@@ -187,7 +187,7 @@ bfa_fcs_port_ns_sm_plogi_sending(struct bfa_fcs_port_ns_s *ns, | |||
187 | break; | 187 | break; |
188 | 188 | ||
189 | default: | 189 | default: |
190 | bfa_assert(0); | 190 | bfa_sm_fault(ns->port->fcs, event); |
191 | } | 191 | } |
192 | } | 192 | } |
193 | 193 | ||
@@ -221,7 +221,7 @@ bfa_fcs_port_ns_sm_plogi(struct bfa_fcs_port_ns_s *ns, | |||
221 | break; | 221 | break; |
222 | 222 | ||
223 | default: | 223 | default: |
224 | bfa_assert(0); | 224 | bfa_sm_fault(ns->port->fcs, event); |
225 | } | 225 | } |
226 | } | 226 | } |
227 | 227 | ||
@@ -247,7 +247,7 @@ bfa_fcs_port_ns_sm_plogi_retry(struct bfa_fcs_port_ns_s *ns, | |||
247 | break; | 247 | break; |
248 | 248 | ||
249 | default: | 249 | default: |
250 | bfa_assert(0); | 250 | bfa_sm_fault(ns->port->fcs, event); |
251 | } | 251 | } |
252 | } | 252 | } |
253 | 253 | ||
@@ -270,7 +270,7 @@ bfa_fcs_port_ns_sm_sending_rspn_id(struct bfa_fcs_port_ns_s *ns, | |||
270 | break; | 270 | break; |
271 | 271 | ||
272 | default: | 272 | default: |
273 | bfa_assert(0); | 273 | bfa_sm_fault(ns->port->fcs, event); |
274 | } | 274 | } |
275 | } | 275 | } |
276 | 276 | ||
@@ -304,7 +304,7 @@ bfa_fcs_port_ns_sm_rspn_id(struct bfa_fcs_port_ns_s *ns, | |||
304 | break; | 304 | break; |
305 | 305 | ||
306 | default: | 306 | default: |
307 | bfa_assert(0); | 307 | bfa_sm_fault(ns->port->fcs, event); |
308 | } | 308 | } |
309 | } | 309 | } |
310 | 310 | ||
@@ -330,7 +330,7 @@ bfa_fcs_port_ns_sm_rspn_id_retry(struct bfa_fcs_port_ns_s *ns, | |||
330 | break; | 330 | break; |
331 | 331 | ||
332 | default: | 332 | default: |
333 | bfa_assert(0); | 333 | bfa_sm_fault(ns->port->fcs, event); |
334 | } | 334 | } |
335 | } | 335 | } |
336 | 336 | ||
@@ -353,7 +353,7 @@ bfa_fcs_port_ns_sm_sending_rft_id(struct bfa_fcs_port_ns_s *ns, | |||
353 | break; | 353 | break; |
354 | 354 | ||
355 | default: | 355 | default: |
356 | bfa_assert(0); | 356 | bfa_sm_fault(ns->port->fcs, event); |
357 | } | 357 | } |
358 | } | 358 | } |
359 | 359 | ||
@@ -390,7 +390,7 @@ bfa_fcs_port_ns_sm_rft_id(struct bfa_fcs_port_ns_s *ns, | |||
390 | break; | 390 | break; |
391 | 391 | ||
392 | default: | 392 | default: |
393 | bfa_assert(0); | 393 | bfa_sm_fault(ns->port->fcs, event); |
394 | } | 394 | } |
395 | } | 395 | } |
396 | 396 | ||
@@ -413,7 +413,7 @@ bfa_fcs_port_ns_sm_rft_id_retry(struct bfa_fcs_port_ns_s *ns, | |||
413 | break; | 413 | break; |
414 | 414 | ||
415 | default: | 415 | default: |
416 | bfa_assert(0); | 416 | bfa_sm_fault(ns->port->fcs, event); |
417 | } | 417 | } |
418 | } | 418 | } |
419 | 419 | ||
@@ -436,7 +436,7 @@ bfa_fcs_port_ns_sm_sending_rff_id(struct bfa_fcs_port_ns_s *ns, | |||
436 | break; | 436 | break; |
437 | 437 | ||
438 | default: | 438 | default: |
439 | bfa_assert(0); | 439 | bfa_sm_fault(ns->port->fcs, event); |
440 | } | 440 | } |
441 | } | 441 | } |
442 | 442 | ||
@@ -494,7 +494,7 @@ bfa_fcs_port_ns_sm_rff_id(struct bfa_fcs_port_ns_s *ns, | |||
494 | break; | 494 | break; |
495 | 495 | ||
496 | default: | 496 | default: |
497 | bfa_assert(0); | 497 | bfa_sm_fault(ns->port->fcs, event); |
498 | } | 498 | } |
499 | } | 499 | } |
500 | 500 | ||
@@ -517,7 +517,7 @@ bfa_fcs_port_ns_sm_rff_id_retry(struct bfa_fcs_port_ns_s *ns, | |||
517 | break; | 517 | break; |
518 | 518 | ||
519 | default: | 519 | default: |
520 | bfa_assert(0); | 520 | bfa_sm_fault(ns->port->fcs, event); |
521 | } | 521 | } |
522 | } | 522 | } |
523 | static void | 523 | static void |
@@ -539,7 +539,7 @@ bfa_fcs_port_ns_sm_sending_gid_ft(struct bfa_fcs_port_ns_s *ns, | |||
539 | break; | 539 | break; |
540 | 540 | ||
541 | default: | 541 | default: |
542 | bfa_assert(0); | 542 | bfa_sm_fault(ns->port->fcs, event); |
543 | } | 543 | } |
544 | } | 544 | } |
545 | 545 | ||
@@ -575,7 +575,7 @@ bfa_fcs_port_ns_sm_gid_ft(struct bfa_fcs_port_ns_s *ns, | |||
575 | break; | 575 | break; |
576 | 576 | ||
577 | default: | 577 | default: |
578 | bfa_assert(0); | 578 | bfa_sm_fault(ns->port->fcs, event); |
579 | } | 579 | } |
580 | } | 580 | } |
581 | 581 | ||
@@ -598,7 +598,7 @@ bfa_fcs_port_ns_sm_gid_ft_retry(struct bfa_fcs_port_ns_s *ns, | |||
598 | break; | 598 | break; |
599 | 599 | ||
600 | default: | 600 | default: |
601 | bfa_assert(0); | 601 | bfa_sm_fault(ns->port->fcs, event); |
602 | } | 602 | } |
603 | } | 603 | } |
604 | 604 | ||
@@ -626,7 +626,7 @@ bfa_fcs_port_ns_sm_online(struct bfa_fcs_port_ns_s *ns, | |||
626 | break; | 626 | break; |
627 | 627 | ||
628 | default: | 628 | default: |
629 | bfa_assert(0); | 629 | bfa_sm_fault(ns->port->fcs, event); |
630 | } | 630 | } |
631 | } | 631 | } |
632 | 632 | ||
@@ -660,7 +660,7 @@ bfa_fcs_port_ns_send_plogi(void *ns_cbarg, struct bfa_fcxp_s *fcxp_alloced) | |||
660 | bfa_os_hton3b(FC_NAME_SERVER), | 660 | bfa_os_hton3b(FC_NAME_SERVER), |
661 | bfa_fcs_port_get_fcid(port), 0, | 661 | bfa_fcs_port_get_fcid(port), 0, |
662 | port->port_cfg.pwwn, port->port_cfg.nwwn, | 662 | port->port_cfg.pwwn, port->port_cfg.nwwn, |
663 | bfa_pport_get_maxfrsize(port->fcs->bfa)); | 663 | bfa_fcport_get_maxfrsize(port->fcs->bfa)); |
664 | 664 | ||
665 | bfa_fcxp_send(fcxp, NULL, port->fabric->vf_id, port->lp_tag, BFA_FALSE, | 665 | bfa_fcxp_send(fcxp, NULL, port->fabric->vf_id, port->lp_tag, BFA_FALSE, |
666 | FC_CLASS_3, len, &fchs, bfa_fcs_port_ns_plogi_response, | 666 | FC_CLASS_3, len, &fchs, bfa_fcs_port_ns_plogi_response, |
diff --git a/drivers/scsi/bfa/rport.c b/drivers/scsi/bfa/rport.c index 9cf58bb138dc..8e73dd9a625a 100644 --- a/drivers/scsi/bfa/rport.c +++ b/drivers/scsi/bfa/rport.c | |||
@@ -224,7 +224,7 @@ bfa_fcs_rport_sm_uninit(struct bfa_fcs_rport_s *rport, enum rport_event event) | |||
224 | break; | 224 | break; |
225 | 225 | ||
226 | default: | 226 | default: |
227 | bfa_assert(0); | 227 | bfa_sm_fault(rport->fcs, event); |
228 | } | 228 | } |
229 | } | 229 | } |
230 | 230 | ||
@@ -276,7 +276,7 @@ bfa_fcs_rport_sm_plogi_sending(struct bfa_fcs_rport_s *rport, | |||
276 | break; | 276 | break; |
277 | 277 | ||
278 | default: | 278 | default: |
279 | bfa_assert(0); | 279 | bfa_sm_fault(rport->fcs, event); |
280 | } | 280 | } |
281 | } | 281 | } |
282 | 282 | ||
@@ -332,7 +332,7 @@ bfa_fcs_rport_sm_plogiacc_sending(struct bfa_fcs_rport_s *rport, | |||
332 | break; | 332 | break; |
333 | 333 | ||
334 | default: | 334 | default: |
335 | bfa_assert(0); | 335 | bfa_sm_fault(rport->fcs, event); |
336 | } | 336 | } |
337 | } | 337 | } |
338 | 338 | ||
@@ -406,7 +406,7 @@ bfa_fcs_rport_sm_plogi_retry(struct bfa_fcs_rport_s *rport, | |||
406 | break; | 406 | break; |
407 | 407 | ||
408 | default: | 408 | default: |
409 | bfa_assert(0); | 409 | bfa_sm_fault(rport->fcs, event); |
410 | } | 410 | } |
411 | } | 411 | } |
412 | 412 | ||
@@ -481,7 +481,7 @@ bfa_fcs_rport_sm_plogi(struct bfa_fcs_rport_s *rport, enum rport_event event) | |||
481 | break; | 481 | break; |
482 | 482 | ||
483 | default: | 483 | default: |
484 | bfa_assert(0); | 484 | bfa_sm_fault(rport->fcs, event); |
485 | } | 485 | } |
486 | } | 486 | } |
487 | 487 | ||
@@ -534,7 +534,7 @@ bfa_fcs_rport_sm_hal_online(struct bfa_fcs_rport_s *rport, | |||
534 | break; | 534 | break; |
535 | 535 | ||
536 | default: | 536 | default: |
537 | bfa_assert(0); | 537 | bfa_sm_fault(rport->fcs, event); |
538 | } | 538 | } |
539 | } | 539 | } |
540 | 540 | ||
@@ -589,7 +589,7 @@ bfa_fcs_rport_sm_online(struct bfa_fcs_rport_s *rport, enum rport_event event) | |||
589 | break; | 589 | break; |
590 | 590 | ||
591 | default: | 591 | default: |
592 | bfa_assert(0); | 592 | bfa_sm_fault(rport->fcs, event); |
593 | } | 593 | } |
594 | } | 594 | } |
595 | 595 | ||
@@ -646,7 +646,7 @@ bfa_fcs_rport_sm_nsquery_sending(struct bfa_fcs_rport_s *rport, | |||
646 | break; | 646 | break; |
647 | 647 | ||
648 | default: | 648 | default: |
649 | bfa_assert(0); | 649 | bfa_sm_fault(rport->fcs, event); |
650 | } | 650 | } |
651 | } | 651 | } |
652 | 652 | ||
@@ -704,7 +704,7 @@ bfa_fcs_rport_sm_nsquery(struct bfa_fcs_rport_s *rport, enum rport_event event) | |||
704 | break; | 704 | break; |
705 | 705 | ||
706 | default: | 706 | default: |
707 | bfa_assert(0); | 707 | bfa_sm_fault(rport->fcs, event); |
708 | } | 708 | } |
709 | } | 709 | } |
710 | 710 | ||
@@ -754,7 +754,7 @@ bfa_fcs_rport_sm_adisc_sending(struct bfa_fcs_rport_s *rport, | |||
754 | break; | 754 | break; |
755 | 755 | ||
756 | default: | 756 | default: |
757 | bfa_assert(0); | 757 | bfa_sm_fault(rport->fcs, event); |
758 | } | 758 | } |
759 | } | 759 | } |
760 | 760 | ||
@@ -816,7 +816,7 @@ bfa_fcs_rport_sm_adisc(struct bfa_fcs_rport_s *rport, enum rport_event event) | |||
816 | break; | 816 | break; |
817 | 817 | ||
818 | default: | 818 | default: |
819 | bfa_assert(0); | 819 | bfa_sm_fault(rport->fcs, event); |
820 | } | 820 | } |
821 | } | 821 | } |
822 | 822 | ||
@@ -846,7 +846,7 @@ bfa_fcs_rport_sm_fc4_logorcv(struct bfa_fcs_rport_s *rport, | |||
846 | break; | 846 | break; |
847 | 847 | ||
848 | default: | 848 | default: |
849 | bfa_assert(0); | 849 | bfa_sm_fault(rport->fcs, event); |
850 | } | 850 | } |
851 | } | 851 | } |
852 | 852 | ||
@@ -869,7 +869,7 @@ bfa_fcs_rport_sm_fc4_logosend(struct bfa_fcs_rport_s *rport, | |||
869 | break; | 869 | break; |
870 | 870 | ||
871 | default: | 871 | default: |
872 | bfa_assert(0); | 872 | bfa_sm_fault(rport->fcs, event); |
873 | } | 873 | } |
874 | } | 874 | } |
875 | 875 | ||
@@ -905,7 +905,7 @@ bfa_fcs_rport_sm_fc4_offline(struct bfa_fcs_rport_s *rport, | |||
905 | break; | 905 | break; |
906 | 906 | ||
907 | default: | 907 | default: |
908 | bfa_assert(0); | 908 | bfa_sm_fault(rport->fcs, event); |
909 | } | 909 | } |
910 | } | 910 | } |
911 | 911 | ||
@@ -925,10 +925,17 @@ bfa_fcs_rport_sm_hcb_offline(struct bfa_fcs_rport_s *rport, | |||
925 | case RPSM_EVENT_HCB_OFFLINE: | 925 | case RPSM_EVENT_HCB_OFFLINE: |
926 | case RPSM_EVENT_ADDRESS_CHANGE: | 926 | case RPSM_EVENT_ADDRESS_CHANGE: |
927 | if (bfa_fcs_port_is_online(rport->port)) { | 927 | if (bfa_fcs_port_is_online(rport->port)) { |
928 | bfa_sm_set_state(rport, | 928 | if (bfa_fcs_fabric_is_switched(rport->port->fabric)) { |
929 | bfa_fcs_rport_sm_nsdisc_sending); | 929 | bfa_sm_set_state(rport, |
930 | rport->ns_retries = 0; | 930 | bfa_fcs_rport_sm_nsdisc_sending); |
931 | bfa_fcs_rport_send_gidpn(rport, NULL); | 931 | rport->ns_retries = 0; |
932 | bfa_fcs_rport_send_gidpn(rport, NULL); | ||
933 | } else { | ||
934 | bfa_sm_set_state(rport, | ||
935 | bfa_fcs_rport_sm_plogi_sending); | ||
936 | rport->plogi_retries = 0; | ||
937 | bfa_fcs_rport_send_plogi(rport, NULL); | ||
938 | } | ||
932 | } else { | 939 | } else { |
933 | rport->pid = 0; | 940 | rport->pid = 0; |
934 | bfa_sm_set_state(rport, bfa_fcs_rport_sm_offline); | 941 | bfa_sm_set_state(rport, bfa_fcs_rport_sm_offline); |
@@ -951,7 +958,7 @@ bfa_fcs_rport_sm_hcb_offline(struct bfa_fcs_rport_s *rport, | |||
951 | break; | 958 | break; |
952 | 959 | ||
953 | default: | 960 | default: |
954 | bfa_assert(0); | 961 | bfa_sm_fault(rport->fcs, event); |
955 | } | 962 | } |
956 | } | 963 | } |
957 | 964 | ||
@@ -1011,7 +1018,7 @@ bfa_fcs_rport_sm_hcb_logorcv(struct bfa_fcs_rport_s *rport, | |||
1011 | break; | 1018 | break; |
1012 | 1019 | ||
1013 | default: | 1020 | default: |
1014 | bfa_assert(0); | 1021 | bfa_sm_fault(rport->fcs, event); |
1015 | } | 1022 | } |
1016 | } | 1023 | } |
1017 | 1024 | ||
@@ -1038,7 +1045,7 @@ bfa_fcs_rport_sm_hcb_logosend(struct bfa_fcs_rport_s *rport, | |||
1038 | break; | 1045 | break; |
1039 | 1046 | ||
1040 | default: | 1047 | default: |
1041 | bfa_assert(0); | 1048 | bfa_sm_fault(rport->fcs, event); |
1042 | } | 1049 | } |
1043 | } | 1050 | } |
1044 | 1051 | ||
@@ -1073,7 +1080,7 @@ bfa_fcs_rport_sm_logo_sending(struct bfa_fcs_rport_s *rport, | |||
1073 | break; | 1080 | break; |
1074 | 1081 | ||
1075 | default: | 1082 | default: |
1076 | bfa_assert(0); | 1083 | bfa_sm_fault(rport->fcs, event); |
1077 | } | 1084 | } |
1078 | } | 1085 | } |
1079 | 1086 | ||
@@ -1132,7 +1139,7 @@ bfa_fcs_rport_sm_offline(struct bfa_fcs_rport_s *rport, enum rport_event event) | |||
1132 | break; | 1139 | break; |
1133 | 1140 | ||
1134 | default: | 1141 | default: |
1135 | bfa_assert(0); | 1142 | bfa_sm_fault(rport->fcs, event); |
1136 | } | 1143 | } |
1137 | } | 1144 | } |
1138 | 1145 | ||
@@ -1188,7 +1195,7 @@ bfa_fcs_rport_sm_nsdisc_sending(struct bfa_fcs_rport_s *rport, | |||
1188 | break; | 1195 | break; |
1189 | 1196 | ||
1190 | default: | 1197 | default: |
1191 | bfa_assert(0); | 1198 | bfa_sm_fault(rport->fcs, event); |
1192 | } | 1199 | } |
1193 | } | 1200 | } |
1194 | 1201 | ||
@@ -1249,7 +1256,7 @@ bfa_fcs_rport_sm_nsdisc_retry(struct bfa_fcs_rport_s *rport, | |||
1249 | break; | 1256 | break; |
1250 | 1257 | ||
1251 | default: | 1258 | default: |
1252 | bfa_assert(0); | 1259 | bfa_sm_fault(rport->fcs, event); |
1253 | } | 1260 | } |
1254 | } | 1261 | } |
1255 | 1262 | ||
@@ -1334,7 +1341,7 @@ bfa_fcs_rport_sm_nsdisc_sent(struct bfa_fcs_rport_s *rport, | |||
1334 | break; | 1341 | break; |
1335 | 1342 | ||
1336 | default: | 1343 | default: |
1337 | bfa_assert(0); | 1344 | bfa_sm_fault(rport->fcs, event); |
1338 | } | 1345 | } |
1339 | } | 1346 | } |
1340 | 1347 | ||
@@ -1366,7 +1373,7 @@ bfa_fcs_rport_send_plogi(void *rport_cbarg, struct bfa_fcxp_s *fcxp_alloced) | |||
1366 | len = fc_plogi_build(&fchs, bfa_fcxp_get_reqbuf(fcxp), rport->pid, | 1373 | len = fc_plogi_build(&fchs, bfa_fcxp_get_reqbuf(fcxp), rport->pid, |
1367 | bfa_fcs_port_get_fcid(port), 0, | 1374 | bfa_fcs_port_get_fcid(port), 0, |
1368 | port->port_cfg.pwwn, port->port_cfg.nwwn, | 1375 | port->port_cfg.pwwn, port->port_cfg.nwwn, |
1369 | bfa_pport_get_maxfrsize(port->fcs->bfa)); | 1376 | bfa_fcport_get_maxfrsize(port->fcs->bfa)); |
1370 | 1377 | ||
1371 | bfa_fcxp_send(fcxp, NULL, port->fabric->vf_id, port->lp_tag, BFA_FALSE, | 1378 | bfa_fcxp_send(fcxp, NULL, port->fabric->vf_id, port->lp_tag, BFA_FALSE, |
1372 | FC_CLASS_3, len, &fchs, bfa_fcs_rport_plogi_response, | 1379 | FC_CLASS_3, len, &fchs, bfa_fcs_rport_plogi_response, |
@@ -1478,7 +1485,7 @@ bfa_fcs_rport_send_plogiacc(void *rport_cbarg, struct bfa_fcxp_s *fcxp_alloced) | |||
1478 | len = fc_plogi_acc_build(&fchs, bfa_fcxp_get_reqbuf(fcxp), rport->pid, | 1485 | len = fc_plogi_acc_build(&fchs, bfa_fcxp_get_reqbuf(fcxp), rport->pid, |
1479 | bfa_fcs_port_get_fcid(port), rport->reply_oxid, | 1486 | bfa_fcs_port_get_fcid(port), rport->reply_oxid, |
1480 | port->port_cfg.pwwn, port->port_cfg.nwwn, | 1487 | port->port_cfg.pwwn, port->port_cfg.nwwn, |
1481 | bfa_pport_get_maxfrsize(port->fcs->bfa)); | 1488 | bfa_fcport_get_maxfrsize(port->fcs->bfa)); |
1482 | 1489 | ||
1483 | bfa_fcxp_send(fcxp, NULL, port->fabric->vf_id, port->lp_tag, BFA_FALSE, | 1490 | bfa_fcxp_send(fcxp, NULL, port->fabric->vf_id, port->lp_tag, BFA_FALSE, |
1484 | FC_CLASS_3, len, &fchs, NULL, NULL, FC_MAX_PDUSZ, 0); | 1491 | FC_CLASS_3, len, &fchs, NULL, NULL, FC_MAX_PDUSZ, 0); |
@@ -1813,7 +1820,7 @@ bfa_fcs_rport_process_rpsc(struct bfa_fcs_rport_s *rport, | |||
1813 | /* | 1820 | /* |
1814 | * get curent speed from pport attributes from BFA | 1821 | * get curent speed from pport attributes from BFA |
1815 | */ | 1822 | */ |
1816 | bfa_pport_get_attr(port->fcs->bfa, &pport_attr); | 1823 | bfa_fcport_get_attr(port->fcs->bfa, &pport_attr); |
1817 | 1824 | ||
1818 | speeds.port_op_speed = fc_bfa_speed_to_rpsc_operspeed(pport_attr.speed); | 1825 | speeds.port_op_speed = fc_bfa_speed_to_rpsc_operspeed(pport_attr.speed); |
1819 | 1826 | ||
@@ -2032,13 +2039,10 @@ bfa_fcs_rport_aen_post(struct bfa_fcs_rport_s *rport, | |||
2032 | 2039 | ||
2033 | switch (event) { | 2040 | switch (event) { |
2034 | case BFA_RPORT_AEN_ONLINE: | 2041 | case BFA_RPORT_AEN_ONLINE: |
2035 | bfa_log(logmod, BFA_AEN_RPORT_ONLINE, rpwwn_ptr, lpwwn_ptr); | ||
2036 | break; | ||
2037 | case BFA_RPORT_AEN_OFFLINE: | 2042 | case BFA_RPORT_AEN_OFFLINE: |
2038 | bfa_log(logmod, BFA_AEN_RPORT_OFFLINE, rpwwn_ptr, lpwwn_ptr); | ||
2039 | break; | ||
2040 | case BFA_RPORT_AEN_DISCONNECT: | 2043 | case BFA_RPORT_AEN_DISCONNECT: |
2041 | bfa_log(logmod, BFA_AEN_RPORT_DISCONNECT, rpwwn_ptr, lpwwn_ptr); | 2044 | bfa_log(logmod, BFA_LOG_CREATE_ID(BFA_AEN_CAT_RPORT, event), |
2045 | rpwwn_ptr, lpwwn_ptr); | ||
2042 | break; | 2046 | break; |
2043 | case BFA_RPORT_AEN_QOS_PRIO: | 2047 | case BFA_RPORT_AEN_QOS_PRIO: |
2044 | aen_data.rport.priv.qos = data->priv.qos; | 2048 | aen_data.rport.priv.qos = data->priv.qos; |
@@ -2164,7 +2168,7 @@ bfa_fcs_rport_update(struct bfa_fcs_rport_s *rport, struct fc_logi_s *plogi) | |||
2164 | bfa_trc(port->fcs, port->fabric->bb_credit); | 2168 | bfa_trc(port->fcs, port->fabric->bb_credit); |
2165 | 2169 | ||
2166 | port->fabric->bb_credit = bfa_os_ntohs(plogi->csp.bbcred); | 2170 | port->fabric->bb_credit = bfa_os_ntohs(plogi->csp.bbcred); |
2167 | bfa_pport_set_tx_bbcredit(port->fcs->bfa, | 2171 | bfa_fcport_set_tx_bbcredit(port->fcs->bfa, |
2168 | port->fabric->bb_credit); | 2172 | port->fabric->bb_credit); |
2169 | } | 2173 | } |
2170 | 2174 | ||
@@ -2575,23 +2579,6 @@ bfa_fcs_rport_send_ls_rjt(struct bfa_fcs_rport_s *rport, struct fchs_s *rx_fchs, | |||
2575 | } | 2579 | } |
2576 | 2580 | ||
2577 | /** | 2581 | /** |
2578 | * Module initialization | ||
2579 | */ | ||
2580 | void | ||
2581 | bfa_fcs_rport_modinit(struct bfa_fcs_s *fcs) | ||
2582 | { | ||
2583 | } | ||
2584 | |||
2585 | /** | ||
2586 | * Module cleanup | ||
2587 | */ | ||
2588 | void | ||
2589 | bfa_fcs_rport_modexit(struct bfa_fcs_s *fcs) | ||
2590 | { | ||
2591 | bfa_fcs_modexit_comp(fcs); | ||
2592 | } | ||
2593 | |||
2594 | /** | ||
2595 | * Return state of rport. | 2582 | * Return state of rport. |
2596 | */ | 2583 | */ |
2597 | int | 2584 | int |
diff --git a/drivers/scsi/bfa/rport_api.c b/drivers/scsi/bfa/rport_api.c index 3dae1774181e..a441f41d2a64 100644 --- a/drivers/scsi/bfa/rport_api.c +++ b/drivers/scsi/bfa/rport_api.c | |||
@@ -102,7 +102,7 @@ bfa_fcs_rport_get_attr(struct bfa_fcs_rport_s *rport, | |||
102 | rport_attr->qos_attr = qos_attr; | 102 | rport_attr->qos_attr = qos_attr; |
103 | 103 | ||
104 | rport_attr->trl_enforced = BFA_FALSE; | 104 | rport_attr->trl_enforced = BFA_FALSE; |
105 | if (bfa_pport_is_ratelim(port->fcs->bfa)) { | 105 | if (bfa_fcport_is_ratelim(port->fcs->bfa)) { |
106 | if ((rport->rpf.rpsc_speed == BFA_PPORT_SPEED_UNKNOWN) || | 106 | if ((rport->rpf.rpsc_speed == BFA_PPORT_SPEED_UNKNOWN) || |
107 | (rport->rpf.rpsc_speed < | 107 | (rport->rpf.rpsc_speed < |
108 | bfa_fcs_port_get_rport_max_speed(port))) | 108 | bfa_fcs_port_get_rport_max_speed(port))) |
diff --git a/drivers/scsi/bfa/rport_ftrs.c b/drivers/scsi/bfa/rport_ftrs.c index e1932c885ac2..ae7bba67ae2a 100644 --- a/drivers/scsi/bfa/rport_ftrs.c +++ b/drivers/scsi/bfa/rport_ftrs.c | |||
@@ -91,7 +91,7 @@ bfa_fcs_rpf_sm_uninit(struct bfa_fcs_rpf_s *rpf, enum rpf_event event) | |||
91 | break; | 91 | break; |
92 | 92 | ||
93 | default: | 93 | default: |
94 | bfa_assert(0); | 94 | bfa_sm_fault(rport->fcs, event); |
95 | } | 95 | } |
96 | } | 96 | } |
97 | 97 | ||
@@ -114,7 +114,7 @@ bfa_fcs_rpf_sm_rpsc_sending(struct bfa_fcs_rpf_s *rpf, enum rpf_event event) | |||
114 | break; | 114 | break; |
115 | 115 | ||
116 | default: | 116 | default: |
117 | bfa_assert(0); | 117 | bfa_sm_fault(rport->fcs, event); |
118 | } | 118 | } |
119 | } | 119 | } |
120 | 120 | ||
@@ -160,7 +160,7 @@ bfa_fcs_rpf_sm_rpsc(struct bfa_fcs_rpf_s *rpf, enum rpf_event event) | |||
160 | break; | 160 | break; |
161 | 161 | ||
162 | default: | 162 | default: |
163 | bfa_assert(0); | 163 | bfa_sm_fault(rport->fcs, event); |
164 | } | 164 | } |
165 | } | 165 | } |
166 | 166 | ||
@@ -186,7 +186,7 @@ bfa_fcs_rpf_sm_rpsc_retry(struct bfa_fcs_rpf_s *rpf, enum rpf_event event) | |||
186 | break; | 186 | break; |
187 | 187 | ||
188 | default: | 188 | default: |
189 | bfa_assert(0); | 189 | bfa_sm_fault(rport->fcs, event); |
190 | } | 190 | } |
191 | } | 191 | } |
192 | 192 | ||
@@ -206,7 +206,7 @@ bfa_fcs_rpf_sm_online(struct bfa_fcs_rpf_s *rpf, enum rpf_event event) | |||
206 | break; | 206 | break; |
207 | 207 | ||
208 | default: | 208 | default: |
209 | bfa_assert(0); | 209 | bfa_sm_fault(rport->fcs, event); |
210 | } | 210 | } |
211 | } | 211 | } |
212 | 212 | ||
@@ -229,7 +229,7 @@ bfa_fcs_rpf_sm_offline(struct bfa_fcs_rpf_s *rpf, enum rpf_event event) | |||
229 | break; | 229 | break; |
230 | 230 | ||
231 | default: | 231 | default: |
232 | bfa_assert(0); | 232 | bfa_sm_fault(rport->fcs, event); |
233 | } | 233 | } |
234 | } | 234 | } |
235 | /** | 235 | /** |
diff --git a/drivers/scsi/bfa/scn.c b/drivers/scsi/bfa/scn.c index bd4771ff62c8..8fe09ba88a91 100644 --- a/drivers/scsi/bfa/scn.c +++ b/drivers/scsi/bfa/scn.c | |||
@@ -90,7 +90,7 @@ bfa_fcs_port_scn_sm_offline(struct bfa_fcs_port_scn_s *scn, | |||
90 | break; | 90 | break; |
91 | 91 | ||
92 | default: | 92 | default: |
93 | bfa_assert(0); | 93 | bfa_sm_fault(scn->port->fcs, event); |
94 | } | 94 | } |
95 | } | 95 | } |
96 | 96 | ||
@@ -109,7 +109,7 @@ bfa_fcs_port_scn_sm_sending_scr(struct bfa_fcs_port_scn_s *scn, | |||
109 | break; | 109 | break; |
110 | 110 | ||
111 | default: | 111 | default: |
112 | bfa_assert(0); | 112 | bfa_sm_fault(scn->port->fcs, event); |
113 | } | 113 | } |
114 | } | 114 | } |
115 | 115 | ||
@@ -137,7 +137,7 @@ bfa_fcs_port_scn_sm_scr(struct bfa_fcs_port_scn_s *scn, | |||
137 | break; | 137 | break; |
138 | 138 | ||
139 | default: | 139 | default: |
140 | bfa_assert(0); | 140 | bfa_sm_fault(scn->port->fcs, event); |
141 | } | 141 | } |
142 | } | 142 | } |
143 | 143 | ||
@@ -157,7 +157,7 @@ bfa_fcs_port_scn_sm_scr_retry(struct bfa_fcs_port_scn_s *scn, | |||
157 | break; | 157 | break; |
158 | 158 | ||
159 | default: | 159 | default: |
160 | bfa_assert(0); | 160 | bfa_sm_fault(scn->port->fcs, event); |
161 | } | 161 | } |
162 | } | 162 | } |
163 | 163 | ||
@@ -171,7 +171,7 @@ bfa_fcs_port_scn_sm_online(struct bfa_fcs_port_scn_s *scn, | |||
171 | break; | 171 | break; |
172 | 172 | ||
173 | default: | 173 | default: |
174 | bfa_assert(0); | 174 | bfa_sm_fault(scn->port->fcs, event); |
175 | } | 175 | } |
176 | } | 176 | } |
177 | 177 | ||
diff --git a/drivers/scsi/bfa/vport.c b/drivers/scsi/bfa/vport.c index e90f1e38c32d..27cd619a227a 100644 --- a/drivers/scsi/bfa/vport.c +++ b/drivers/scsi/bfa/vport.c | |||
@@ -122,7 +122,7 @@ bfa_fcs_vport_sm_uninit(struct bfa_fcs_vport_s *vport, | |||
122 | break; | 122 | break; |
123 | 123 | ||
124 | default: | 124 | default: |
125 | bfa_assert(0); | 125 | bfa_sm_fault(__vport_fcs(vport), event); |
126 | } | 126 | } |
127 | } | 127 | } |
128 | 128 | ||
@@ -165,7 +165,7 @@ bfa_fcs_vport_sm_created(struct bfa_fcs_vport_s *vport, | |||
165 | break; | 165 | break; |
166 | 166 | ||
167 | default: | 167 | default: |
168 | bfa_assert(0); | 168 | bfa_sm_fault(__vport_fcs(vport), event); |
169 | } | 169 | } |
170 | } | 170 | } |
171 | 171 | ||
@@ -202,7 +202,7 @@ bfa_fcs_vport_sm_offline(struct bfa_fcs_vport_s *vport, | |||
202 | break; | 202 | break; |
203 | 203 | ||
204 | default: | 204 | default: |
205 | bfa_assert(0); | 205 | bfa_sm_fault(__vport_fcs(vport), event); |
206 | } | 206 | } |
207 | } | 207 | } |
208 | 208 | ||
@@ -249,7 +249,7 @@ bfa_fcs_vport_sm_fdisc(struct bfa_fcs_vport_s *vport, | |||
249 | break; | 249 | break; |
250 | 250 | ||
251 | default: | 251 | default: |
252 | bfa_assert(0); | 252 | bfa_sm_fault(__vport_fcs(vport), event); |
253 | } | 253 | } |
254 | } | 254 | } |
255 | 255 | ||
@@ -283,7 +283,7 @@ bfa_fcs_vport_sm_fdisc_retry(struct bfa_fcs_vport_s *vport, | |||
283 | break; | 283 | break; |
284 | 284 | ||
285 | default: | 285 | default: |
286 | bfa_assert(0); | 286 | bfa_sm_fault(__vport_fcs(vport), event); |
287 | } | 287 | } |
288 | } | 288 | } |
289 | 289 | ||
@@ -310,7 +310,7 @@ bfa_fcs_vport_sm_online(struct bfa_fcs_vport_s *vport, | |||
310 | break; | 310 | break; |
311 | 311 | ||
312 | default: | 312 | default: |
313 | bfa_assert(0); | 313 | bfa_sm_fault(__vport_fcs(vport), event); |
314 | } | 314 | } |
315 | } | 315 | } |
316 | 316 | ||
@@ -339,7 +339,7 @@ bfa_fcs_vport_sm_deleting(struct bfa_fcs_vport_s *vport, | |||
339 | break; | 339 | break; |
340 | 340 | ||
341 | default: | 341 | default: |
342 | bfa_assert(0); | 342 | bfa_sm_fault(__vport_fcs(vport), event); |
343 | } | 343 | } |
344 | } | 344 | } |
345 | 345 | ||
@@ -387,7 +387,7 @@ bfa_fcs_vport_sm_cleanup(struct bfa_fcs_vport_s *vport, | |||
387 | break; | 387 | break; |
388 | 388 | ||
389 | default: | 389 | default: |
390 | bfa_assert(0); | 390 | bfa_sm_fault(__vport_fcs(vport), event); |
391 | } | 391 | } |
392 | } | 392 | } |
393 | 393 | ||
@@ -419,7 +419,7 @@ bfa_fcs_vport_sm_logo(struct bfa_fcs_vport_s *vport, | |||
419 | break; | 419 | break; |
420 | 420 | ||
421 | default: | 421 | default: |
422 | bfa_assert(0); | 422 | bfa_sm_fault(__vport_fcs(vport), event); |
423 | } | 423 | } |
424 | } | 424 | } |
425 | 425 | ||
@@ -447,22 +447,8 @@ bfa_fcs_vport_aen_post(bfa_fcs_lport_t *port, enum bfa_lport_aen_event event) | |||
447 | 447 | ||
448 | bfa_assert(role <= BFA_PORT_ROLE_FCP_MAX); | 448 | bfa_assert(role <= BFA_PORT_ROLE_FCP_MAX); |
449 | 449 | ||
450 | switch (event) { | 450 | bfa_log(logmod, BFA_LOG_CREATE_ID(BFA_AEN_CAT_LPORT, event), lpwwn_ptr, |
451 | case BFA_LPORT_AEN_NPIV_DUP_WWN: | 451 | role_str[role/2]); |
452 | bfa_log(logmod, BFA_AEN_LPORT_NPIV_DUP_WWN, lpwwn_ptr, | ||
453 | role_str[role / 2]); | ||
454 | break; | ||
455 | case BFA_LPORT_AEN_NPIV_FABRIC_MAX: | ||
456 | bfa_log(logmod, BFA_AEN_LPORT_NPIV_FABRIC_MAX, lpwwn_ptr, | ||
457 | role_str[role / 2]); | ||
458 | break; | ||
459 | case BFA_LPORT_AEN_NPIV_UNKNOWN: | ||
460 | bfa_log(logmod, BFA_AEN_LPORT_NPIV_UNKNOWN, lpwwn_ptr, | ||
461 | role_str[role / 2]); | ||
462 | break; | ||
463 | default: | ||
464 | break; | ||
465 | } | ||
466 | 452 | ||
467 | aen_data.lport.vf_id = port->fabric->vf_id; | 453 | aen_data.lport.vf_id = port->fabric->vf_id; |
468 | aen_data.lport.roles = role; | 454 | aen_data.lport.roles = role; |
@@ -478,7 +464,7 @@ static void | |||
478 | bfa_fcs_vport_do_fdisc(struct bfa_fcs_vport_s *vport) | 464 | bfa_fcs_vport_do_fdisc(struct bfa_fcs_vport_s *vport) |
479 | { | 465 | { |
480 | bfa_lps_fdisc(vport->lps, vport, | 466 | bfa_lps_fdisc(vport->lps, vport, |
481 | bfa_pport_get_maxfrsize(__vport_bfa(vport)), | 467 | bfa_fcport_get_maxfrsize(__vport_bfa(vport)), |
482 | __vport_pwwn(vport), __vport_nwwn(vport)); | 468 | __vport_pwwn(vport), __vport_nwwn(vport)); |
483 | vport->vport_stats.fdisc_sent++; | 469 | vport->vport_stats.fdisc_sent++; |
484 | } | 470 | } |
@@ -617,38 +603,6 @@ bfa_fcs_vport_delete_comp(struct bfa_fcs_vport_s *vport) | |||
617 | } | 603 | } |
618 | 604 | ||
619 | /** | 605 | /** |
620 | * Module initialization | ||
621 | */ | ||
622 | void | ||
623 | bfa_fcs_vport_modinit(struct bfa_fcs_s *fcs) | ||
624 | { | ||
625 | } | ||
626 | |||
627 | /** | ||
628 | * Module cleanup | ||
629 | */ | ||
630 | void | ||
631 | bfa_fcs_vport_modexit(struct bfa_fcs_s *fcs) | ||
632 | { | ||
633 | bfa_fcs_modexit_comp(fcs); | ||
634 | } | ||
635 | |||
636 | u32 | ||
637 | bfa_fcs_vport_get_max(struct bfa_fcs_s *fcs) | ||
638 | { | ||
639 | struct bfa_ioc_attr_s ioc_attr; | ||
640 | |||
641 | bfa_get_attr(fcs->bfa, &ioc_attr); | ||
642 | |||
643 | if (ioc_attr.pci_attr.device_id == BFA_PCI_DEVICE_ID_CT) | ||
644 | return BFA_FCS_MAX_VPORTS_SUPP_CT; | ||
645 | else | ||
646 | return BFA_FCS_MAX_VPORTS_SUPP_CB; | ||
647 | } | ||
648 | |||
649 | |||
650 | |||
651 | /** | ||
652 | * fcs_vport_api Virtual port API | 606 | * fcs_vport_api Virtual port API |
653 | */ | 607 | */ |
654 | 608 | ||
@@ -684,7 +638,7 @@ bfa_fcs_vport_create(struct bfa_fcs_vport_s *vport, struct bfa_fcs_s *fcs, | |||
684 | return BFA_STATUS_VPORT_EXISTS; | 638 | return BFA_STATUS_VPORT_EXISTS; |
685 | 639 | ||
686 | if (bfa_fcs_fabric_vport_count(&fcs->fabric) == | 640 | if (bfa_fcs_fabric_vport_count(&fcs->fabric) == |
687 | bfa_fcs_vport_get_max(fcs)) | 641 | bfa_lps_get_max_vport(fcs->bfa)) |
688 | return BFA_STATUS_VPORT_MAX; | 642 | return BFA_STATUS_VPORT_MAX; |
689 | 643 | ||
690 | vport->lps = bfa_lps_alloc(fcs->bfa); | 644 | vport->lps = bfa_lps_alloc(fcs->bfa); |
@@ -694,7 +648,8 @@ bfa_fcs_vport_create(struct bfa_fcs_vport_s *vport, struct bfa_fcs_s *fcs, | |||
694 | vport->vport_drv = vport_drv; | 648 | vport->vport_drv = vport_drv; |
695 | bfa_sm_set_state(vport, bfa_fcs_vport_sm_uninit); | 649 | bfa_sm_set_state(vport, bfa_fcs_vport_sm_uninit); |
696 | 650 | ||
697 | bfa_fcs_lport_init(&vport->lport, fcs, vf_id, vport_cfg, vport); | 651 | bfa_fcs_lport_attach(&vport->lport, fcs, vf_id, vport); |
652 | bfa_fcs_lport_init(&vport->lport, vport_cfg); | ||
698 | 653 | ||
699 | bfa_sm_send_event(vport, BFA_FCS_VPORT_SM_CREATE); | 654 | bfa_sm_send_event(vport, BFA_FCS_VPORT_SM_CREATE); |
700 | 655 | ||
@@ -888,4 +843,15 @@ bfa_cb_lps_fdisclogo_comp(void *bfad, void *uarg) | |||
888 | bfa_sm_send_event(vport, BFA_FCS_VPORT_SM_RSP_OK); | 843 | bfa_sm_send_event(vport, BFA_FCS_VPORT_SM_RSP_OK); |
889 | } | 844 | } |
890 | 845 | ||
846 | /** | ||
847 | * Received clear virtual link | ||
848 | */ | ||
849 | void | ||
850 | bfa_cb_lps_cvl_event(void *bfad, void *uarg) | ||
851 | { | ||
852 | struct bfa_fcs_vport_s *vport = uarg; | ||
891 | 853 | ||
854 | /* Send an Offline followed by an ONLINE */ | ||
855 | bfa_sm_send_event(vport, BFA_FCS_VPORT_SM_OFFLINE); | ||
856 | bfa_sm_send_event(vport, BFA_FCS_VPORT_SM_ONLINE); | ||
857 | } | ||