aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/bfa
diff options
context:
space:
mode:
authorKrishna Gudipati <kgudipat@brocade.com>2011-06-13 18:42:10 -0400
committerJames Bottomley <JBottomley@Parallels.com>2011-06-29 16:25:57 -0400
commitd37779f8d98a1d7c5ba904982958167d988f01dd (patch)
tree8d73314ba2894c322494d3cfa06f3273b7ff1c35 /drivers/scsi/bfa
parent85ce928dbb87585042e7dfebe513f724eadebd5e (diff)
[SCSI] bfa: Introduce IOC event notification mechanism.
Introduced a generic event notification callback function that receives IOC_ENABLED, IOC_DISABLED, IOC_FAILED events and notifies the modules registered for these events. Signed-off-by: Krishna Gudipati <kgudipat@brocade.com> Signed-off-by: James Bottomley <JBottomley@Parallels.com>
Diffstat (limited to 'drivers/scsi/bfa')
-rw-r--r--drivers/scsi/bfa/bfa_core.c2
-rw-r--r--drivers/scsi/bfa/bfa_ioc.c53
-rw-r--r--drivers/scsi/bfa/bfa_ioc.h24
-rw-r--r--drivers/scsi/bfa/bfa_port.c47
-rw-r--r--drivers/scsi/bfa/bfa_port.h4
-rw-r--r--drivers/scsi/bfa/bfi.h16
6 files changed, 88 insertions, 58 deletions
diff --git a/drivers/scsi/bfa/bfa_core.c b/drivers/scsi/bfa/bfa_core.c
index 91838c51fb76..8e496e16a2a8 100644
--- a/drivers/scsi/bfa/bfa_core.c
+++ b/drivers/scsi/bfa/bfa_core.c
@@ -821,7 +821,7 @@ bfa_iocfc_attach(struct bfa_s *bfa, void *bfad, struct bfa_iocfc_cfg_s *cfg,
821 if (pcidev->device_id == BFA_PCI_DEVICE_ID_CT_FC) 821 if (pcidev->device_id == BFA_PCI_DEVICE_ID_CT_FC)
822 bfa_ioc_set_fcmode(&bfa->ioc); 822 bfa_ioc_set_fcmode(&bfa->ioc);
823 823
824 bfa_ioc_pci_init(&bfa->ioc, pcidev, BFI_MC_IOCFC); 824 bfa_ioc_pci_init(&bfa->ioc, pcidev, BFI_PCIFN_CLASS_FC);
825 bfa_ioc_mbox_register(&bfa->ioc, bfa_mbox_isrs); 825 bfa_ioc_mbox_register(&bfa->ioc, bfa_mbox_isrs);
826 826
827 bfa_iocfc_init_mem(bfa, bfad, cfg, pcidev); 827 bfa_iocfc_init_mem(bfa, bfad, cfg, pcidev);
diff --git a/drivers/scsi/bfa/bfa_ioc.c b/drivers/scsi/bfa/bfa_ioc.c
index 6c7e0339dda4..d215168ab8b5 100644
--- a/drivers/scsi/bfa/bfa_ioc.c
+++ b/drivers/scsi/bfa/bfa_ioc.c
@@ -87,6 +87,8 @@ static void bfa_ioc_mbox_poll(struct bfa_ioc_s *ioc);
87static void bfa_ioc_mbox_hbfail(struct bfa_ioc_s *ioc); 87static void bfa_ioc_mbox_hbfail(struct bfa_ioc_s *ioc);
88static void bfa_ioc_recover(struct bfa_ioc_s *ioc); 88static void bfa_ioc_recover(struct bfa_ioc_s *ioc);
89static void bfa_ioc_check_attr_wwns(struct bfa_ioc_s *ioc); 89static void bfa_ioc_check_attr_wwns(struct bfa_ioc_s *ioc);
90static void bfa_ioc_event_notify(struct bfa_ioc_s *ioc ,
91 enum bfa_ioc_event_e event);
90static void bfa_ioc_disable_comp(struct bfa_ioc_s *ioc); 92static void bfa_ioc_disable_comp(struct bfa_ioc_s *ioc);
91static void bfa_ioc_lpu_stop(struct bfa_ioc_s *ioc); 93static void bfa_ioc_lpu_stop(struct bfa_ioc_s *ioc);
92static void bfa_ioc_debug_save_ftrc(struct bfa_ioc_s *ioc); 94static void bfa_ioc_debug_save_ftrc(struct bfa_ioc_s *ioc);
@@ -391,6 +393,7 @@ bfa_ioc_sm_op_entry(struct bfa_ioc_s *ioc)
391 struct bfad_s *bfad = (struct bfad_s *)ioc->bfa->bfad; 393 struct bfad_s *bfad = (struct bfad_s *)ioc->bfa->bfad;
392 394
393 ioc->cbfn->enable_cbfn(ioc->bfa, BFA_STATUS_OK); 395 ioc->cbfn->enable_cbfn(ioc->bfa, BFA_STATUS_OK);
396 bfa_ioc_event_notify(ioc, BFA_IOC_E_ENABLED);
394 bfa_ioc_hb_monitor(ioc); 397 bfa_ioc_hb_monitor(ioc);
395 BFA_LOG(KERN_INFO, bfad, bfa_log_level, "IOC enabled\n"); 398 BFA_LOG(KERN_INFO, bfad, bfa_log_level, "IOC enabled\n");
396} 399}
@@ -1185,23 +1188,28 @@ bfa_iocpf_sm_fail(struct bfa_iocpf_s *iocpf, enum iocpf_event event)
1185 * BFA IOC private functions 1188 * BFA IOC private functions
1186 */ 1189 */
1187 1190
1191/*
1192 * Notify common modules registered for notification.
1193 */
1188static void 1194static void
1189bfa_ioc_disable_comp(struct bfa_ioc_s *ioc) 1195bfa_ioc_event_notify(struct bfa_ioc_s *ioc, enum bfa_ioc_event_e event)
1190{ 1196{
1191 struct list_head *qe; 1197 struct bfa_ioc_notify_s *notify;
1192 struct bfa_ioc_hbfail_notify_s *notify; 1198 struct list_head *qe;
1193
1194 ioc->cbfn->disable_cbfn(ioc->bfa);
1195 1199
1196 /* 1200 list_for_each(qe, &ioc->notify_q) {
1197 * Notify common modules registered for notification. 1201 notify = (struct bfa_ioc_notify_s *)qe;
1198 */ 1202 notify->cbfn(notify->cbarg, event);
1199 list_for_each(qe, &ioc->hb_notify_q) {
1200 notify = (struct bfa_ioc_hbfail_notify_s *) qe;
1201 notify->cbfn(notify->cbarg);
1202 } 1203 }
1203} 1204}
1204 1205
1206static void
1207bfa_ioc_disable_comp(struct bfa_ioc_s *ioc)
1208{
1209 ioc->cbfn->disable_cbfn(ioc->bfa);
1210 bfa_ioc_event_notify(ioc, BFA_IOC_E_DISABLED);
1211}
1212
1205bfa_boolean_t 1213bfa_boolean_t
1206bfa_ioc_sem_get(void __iomem *sem_reg) 1214bfa_ioc_sem_get(void __iomem *sem_reg)
1207{ 1215{
@@ -1508,7 +1516,7 @@ bfa_ioc_send_enable(struct bfa_ioc_s *ioc)
1508 1516
1509 bfi_h2i_set(enable_req.mh, BFI_MC_IOC, BFI_IOC_H2I_ENABLE_REQ, 1517 bfi_h2i_set(enable_req.mh, BFI_MC_IOC, BFI_IOC_H2I_ENABLE_REQ,
1510 bfa_ioc_portid(ioc)); 1518 bfa_ioc_portid(ioc));
1511 enable_req.ioc_class = ioc->ioc_mc; 1519 enable_req.clscode = cpu_to_be16(ioc->clscode);
1512 do_gettimeofday(&tv); 1520 do_gettimeofday(&tv);
1513 enable_req.tv_sec = be32_to_cpu(tv.tv_sec); 1521 enable_req.tv_sec = be32_to_cpu(tv.tv_sec);
1514 bfa_ioc_mbox_send(ioc, &enable_req, sizeof(struct bfi_ioc_ctrl_req_s)); 1522 bfa_ioc_mbox_send(ioc, &enable_req, sizeof(struct bfi_ioc_ctrl_req_s));
@@ -1816,18 +1824,13 @@ bfa_ioc_smem_clr(struct bfa_ioc_s *ioc, u32 soff, u32 sz)
1816static void 1824static void
1817bfa_ioc_fail_notify(struct bfa_ioc_s *ioc) 1825bfa_ioc_fail_notify(struct bfa_ioc_s *ioc)
1818{ 1826{
1819 struct list_head *qe;
1820 struct bfa_ioc_hbfail_notify_s *notify;
1821 struct bfad_s *bfad = (struct bfad_s *)ioc->bfa->bfad; 1827 struct bfad_s *bfad = (struct bfad_s *)ioc->bfa->bfad;
1822 1828
1823 /* 1829 /*
1824 * Notify driver and common modules registered for notification. 1830 * Notify driver and common modules registered for notification.
1825 */ 1831 */
1826 ioc->cbfn->hbfail_cbfn(ioc->bfa); 1832 ioc->cbfn->hbfail_cbfn(ioc->bfa);
1827 list_for_each(qe, &ioc->hb_notify_q) { 1833 bfa_ioc_event_notify(ioc, BFA_IOC_E_FAILED);
1828 notify = (struct bfa_ioc_hbfail_notify_s *) qe;
1829 notify->cbfn(notify->cbarg);
1830 }
1831 1834
1832 bfa_ioc_debug_save_ftrc(ioc); 1835 bfa_ioc_debug_save_ftrc(ioc);
1833 1836
@@ -2011,7 +2014,7 @@ bfa_ioc_attach(struct bfa_ioc_s *ioc, void *bfa, struct bfa_ioc_cbfn_s *cbfn,
2011 ioc->iocpf.ioc = ioc; 2014 ioc->iocpf.ioc = ioc;
2012 2015
2013 bfa_ioc_mbox_attach(ioc); 2016 bfa_ioc_mbox_attach(ioc);
2014 INIT_LIST_HEAD(&ioc->hb_notify_q); 2017 INIT_LIST_HEAD(&ioc->notify_q);
2015 2018
2016 bfa_fsm_set_state(ioc, bfa_ioc_sm_uninit); 2019 bfa_fsm_set_state(ioc, bfa_ioc_sm_uninit);
2017 bfa_fsm_send_event(ioc, IOC_E_RESET); 2020 bfa_fsm_send_event(ioc, IOC_E_RESET);
@@ -2033,9 +2036,9 @@ bfa_ioc_detach(struct bfa_ioc_s *ioc)
2033 */ 2036 */
2034void 2037void
2035bfa_ioc_pci_init(struct bfa_ioc_s *ioc, struct bfa_pcidev_s *pcidev, 2038bfa_ioc_pci_init(struct bfa_ioc_s *ioc, struct bfa_pcidev_s *pcidev,
2036 enum bfi_mclass mc) 2039 enum bfi_pcifn_class clscode)
2037{ 2040{
2038 ioc->ioc_mc = mc; 2041 ioc->clscode = clscode;
2039 ioc->pcidev = *pcidev; 2042 ioc->pcidev = *pcidev;
2040 ioc->ctdev = bfa_asic_id_ct(ioc->pcidev.device_id); 2043 ioc->ctdev = bfa_asic_id_ct(ioc->pcidev.device_id);
2041 ioc->cna = ioc->ctdev && !ioc->fcmode; 2044 ioc->cna = ioc->ctdev && !ioc->fcmode;
@@ -2318,12 +2321,10 @@ bfa_ioc_get_type(struct bfa_ioc_s *ioc)
2318{ 2321{
2319 if (!ioc->ctdev || ioc->fcmode) 2322 if (!ioc->ctdev || ioc->fcmode)
2320 return BFA_IOC_TYPE_FC; 2323 return BFA_IOC_TYPE_FC;
2321 else if (ioc->ioc_mc == BFI_MC_IOCFC) 2324 else if (ioc->clscode == BFI_PCIFN_CLASS_FC)
2322 return BFA_IOC_TYPE_FCoE; 2325 return BFA_IOC_TYPE_FCoE;
2323 else if (ioc->ioc_mc == BFI_MC_LL)
2324 return BFA_IOC_TYPE_LL;
2325 else { 2326 else {
2326 WARN_ON(ioc->ioc_mc != BFI_MC_LL); 2327 WARN_ON(ioc->clscode != BFI_PCIFN_CLASS_ETH);
2327 return BFA_IOC_TYPE_LL; 2328 return BFA_IOC_TYPE_LL;
2328 } 2329 }
2329} 2330}
@@ -2531,7 +2532,7 @@ bfa_ioc_send_fwsync(struct bfa_ioc_s *ioc)
2531 2532
2532 bfi_h2i_set(req->mh, BFI_MC_IOC, BFI_IOC_H2I_DBG_SYNC, 2533 bfi_h2i_set(req->mh, BFI_MC_IOC, BFI_IOC_H2I_DBG_SYNC,
2533 bfa_ioc_portid(ioc)); 2534 bfa_ioc_portid(ioc));
2534 req->ioc_class = ioc->ioc_mc; 2535 req->clscode = cpu_to_be16(ioc->clscode);
2535 bfa_ioc_mbox_queue(ioc, &cmd); 2536 bfa_ioc_mbox_queue(ioc, &cmd);
2536} 2537}
2537 2538
diff --git a/drivers/scsi/bfa/bfa_ioc.h b/drivers/scsi/bfa/bfa_ioc.h
index 62318d24f85e..ff8e21d579df 100644
--- a/drivers/scsi/bfa/bfa_ioc.h
+++ b/drivers/scsi/bfa/bfa_ioc.h
@@ -197,18 +197,26 @@ struct bfa_ioc_cbfn_s {
197}; 197};
198 198
199/* 199/*
200 * Heartbeat failure notification queue element. 200 * IOC event notification mechanism.
201 */ 201 */
202struct bfa_ioc_hbfail_notify_s { 202enum bfa_ioc_event_e {
203 BFA_IOC_E_ENABLED = 1,
204 BFA_IOC_E_DISABLED = 2,
205 BFA_IOC_E_FAILED = 3,
206};
207
208typedef void (*bfa_ioc_notify_cbfn_t)(void *, enum bfa_ioc_event_e);
209
210struct bfa_ioc_notify_s {
203 struct list_head qe; 211 struct list_head qe;
204 bfa_ioc_hbfail_cbfn_t cbfn; 212 bfa_ioc_notify_cbfn_t cbfn;
205 void *cbarg; 213 void *cbarg;
206}; 214};
207 215
208/* 216/*
209 * Initialize a heartbeat failure notification structure 217 * Initialize a IOC event notification structure
210 */ 218 */
211#define bfa_ioc_hbfail_init(__notify, __cbfn, __cbarg) do { \ 219#define bfa_ioc_notify_init(__notify, __cbfn, __cbarg) do { \
212 (__notify)->cbfn = (__cbfn); \ 220 (__notify)->cbfn = (__cbfn); \
213 (__notify)->cbarg = (__cbarg); \ 221 (__notify)->cbarg = (__cbarg); \
214} while (0) 222} while (0)
@@ -229,11 +237,11 @@ struct bfa_ioc_s {
229 struct bfa_timer_s sem_timer; 237 struct bfa_timer_s sem_timer;
230 struct bfa_timer_s hb_timer; 238 struct bfa_timer_s hb_timer;
231 u32 hb_count; 239 u32 hb_count;
232 struct list_head hb_notify_q; 240 struct list_head notify_q;
233 void *dbg_fwsave; 241 void *dbg_fwsave;
234 int dbg_fwsave_len; 242 int dbg_fwsave_len;
235 bfa_boolean_t dbg_fwsave_once; 243 bfa_boolean_t dbg_fwsave_once;
236 enum bfi_mclass ioc_mc; 244 enum bfi_pcifn_class clscode;
237 struct bfa_ioc_regs_s ioc_regs; 245 struct bfa_ioc_regs_s ioc_regs;
238 struct bfa_trc_mod_s *trcmod; 246 struct bfa_trc_mod_s *trcmod;
239 struct bfa_ioc_drv_stats_s stats; 247 struct bfa_ioc_drv_stats_s stats;
@@ -334,7 +342,7 @@ void bfa_ioc_attach(struct bfa_ioc_s *ioc, void *bfa,
334void bfa_ioc_auto_recover(bfa_boolean_t auto_recover); 342void bfa_ioc_auto_recover(bfa_boolean_t auto_recover);
335void bfa_ioc_detach(struct bfa_ioc_s *ioc); 343void bfa_ioc_detach(struct bfa_ioc_s *ioc);
336void bfa_ioc_pci_init(struct bfa_ioc_s *ioc, struct bfa_pcidev_s *pcidev, 344void bfa_ioc_pci_init(struct bfa_ioc_s *ioc, struct bfa_pcidev_s *pcidev,
337 enum bfi_mclass mc); 345 enum bfi_pcifn_class clscode);
338void bfa_ioc_mem_claim(struct bfa_ioc_s *ioc, u8 *dm_kva, u64 dm_pa); 346void bfa_ioc_mem_claim(struct bfa_ioc_s *ioc, u8 *dm_kva, u64 dm_pa);
339void bfa_ioc_enable(struct bfa_ioc_s *ioc); 347void bfa_ioc_enable(struct bfa_ioc_s *ioc);
340void bfa_ioc_disable(struct bfa_ioc_s *ioc); 348void bfa_ioc_disable(struct bfa_ioc_s *ioc);
diff --git a/drivers/scsi/bfa/bfa_port.c b/drivers/scsi/bfa/bfa_port.c
index 3f8e9d6066ec..5ebdb6297b4c 100644
--- a/drivers/scsi/bfa/bfa_port.c
+++ b/drivers/scsi/bfa/bfa_port.c
@@ -387,32 +387,43 @@ bfa_port_clear_stats(struct bfa_port_s *port, bfa_port_stats_cbfn_t cbfn,
387} 387}
388 388
389/* 389/*
390 * bfa_port_hbfail() 390 * bfa_port_notify()
391 * 391 *
392 * Port module IOC event handler
392 * 393 *
393 * @param[in] Pointer to the Port module data structure. 394 * @param[in] Pointer to the Port module data structure.
395 * @param[in] IOC event structure
394 * 396 *
395 * @return void 397 * @return void
396 */ 398 */
397void 399void
398bfa_port_hbfail(void *arg) 400bfa_port_notify(void *arg, enum bfa_ioc_event_e event)
399{ 401{
400 struct bfa_port_s *port = (struct bfa_port_s *) arg; 402 struct bfa_port_s *port = (struct bfa_port_s *) arg;
401 403
402 /* Fail any pending get_stats/clear_stats requests */ 404 switch (event) {
403 if (port->stats_busy) { 405 case BFA_IOC_E_DISABLED:
404 if (port->stats_cbfn) 406 case BFA_IOC_E_FAILED:
405 port->stats_cbfn(port->stats_cbarg, BFA_STATUS_FAILED); 407 /* Fail any pending get_stats/clear_stats requests */
406 port->stats_cbfn = NULL; 408 if (port->stats_busy) {
407 port->stats_busy = BFA_FALSE; 409 if (port->stats_cbfn)
408 } 410 port->stats_cbfn(port->stats_cbarg,
409 411 BFA_STATUS_FAILED);
410 /* Clear any enable/disable is pending */ 412 port->stats_cbfn = NULL;
411 if (port->endis_pending) { 413 port->stats_busy = BFA_FALSE;
412 if (port->endis_cbfn) 414 }
413 port->endis_cbfn(port->endis_cbarg, BFA_STATUS_FAILED); 415
414 port->endis_cbfn = NULL; 416 /* Clear any enable/disable is pending */
415 port->endis_pending = BFA_FALSE; 417 if (port->endis_pending) {
418 if (port->endis_cbfn)
419 port->endis_cbfn(port->endis_cbarg,
420 BFA_STATUS_FAILED);
421 port->endis_cbfn = NULL;
422 port->endis_pending = BFA_FALSE;
423 }
424 break;
425 default:
426 break;
416 } 427 }
417} 428}
418 429
@@ -447,8 +458,8 @@ bfa_port_attach(struct bfa_port_s *port, struct bfa_ioc_s *ioc,
447 port->endis_cbfn = NULL; 458 port->endis_cbfn = NULL;
448 459
449 bfa_ioc_mbox_regisr(port->ioc, BFI_MC_PORT, bfa_port_isr, port); 460 bfa_ioc_mbox_regisr(port->ioc, BFI_MC_PORT, bfa_port_isr, port);
450 bfa_ioc_hbfail_init(&port->hbfail, bfa_port_hbfail, port); 461 bfa_ioc_notify_init(&port->ioc_notify, bfa_port_notify, port);
451 list_add_tail(&port->hbfail.qe, &port->ioc->hb_notify_q); 462 list_add_tail(&port->ioc_notify.qe, &port->ioc->notify_q);
452 463
453 /* 464 /*
454 * initialize time stamp for stats reset 465 * initialize time stamp for stats reset
diff --git a/drivers/scsi/bfa/bfa_port.h b/drivers/scsi/bfa/bfa_port.h
index c4ee9db6b470..8b5617447dcd 100644
--- a/drivers/scsi/bfa/bfa_port.h
+++ b/drivers/scsi/bfa/bfa_port.h
@@ -43,12 +43,12 @@ struct bfa_port_s {
43 bfa_port_endis_cbfn_t endis_cbfn; 43 bfa_port_endis_cbfn_t endis_cbfn;
44 void *endis_cbarg; 44 void *endis_cbarg;
45 bfa_status_t endis_status; 45 bfa_status_t endis_status;
46 struct bfa_ioc_hbfail_notify_s hbfail; 46 struct bfa_ioc_notify_s ioc_notify;
47}; 47};
48 48
49void bfa_port_attach(struct bfa_port_s *port, struct bfa_ioc_s *ioc, 49void bfa_port_attach(struct bfa_port_s *port, struct bfa_ioc_s *ioc,
50 void *dev, struct bfa_trc_mod_s *trcmod); 50 void *dev, struct bfa_trc_mod_s *trcmod);
51void bfa_port_hbfail(void *arg); 51void bfa_port_notify(void *arg, enum bfa_ioc_event_e event);
52 52
53bfa_status_t bfa_port_get_stats(struct bfa_port_s *port, 53bfa_status_t bfa_port_get_stats(struct bfa_port_s *port,
54 union bfa_port_stats_u *stats, 54 union bfa_port_stats_u *stats,
diff --git a/drivers/scsi/bfa/bfi.h b/drivers/scsi/bfa/bfi.h
index 6ef1ba50ecf9..d57522dd949b 100644
--- a/drivers/scsi/bfa/bfi.h
+++ b/drivers/scsi/bfa/bfi.h
@@ -43,13 +43,15 @@ struct bfi_mhdr_s {
43 u8 msg_id; /* msg opcode with in the class */ 43 u8 msg_id; /* msg opcode with in the class */
44 union { 44 union {
45 struct { 45 struct {
46 u8 rsvd; 46 u8 qid;
47 u8 lpu_id; /* msg destination */ 47 u8 lpu_id; /* msg destination */
48 } h2i; 48 } h2i;
49 u16 i2htok; /* token in msgs to host */ 49 u16 i2htok; /* token in msgs to host */
50 } mtag; 50 } mtag;
51}; 51};
52 52
53#define bfi_mhdr_2_qid(_mh) (_mh)->mtag.h2i.qid
54
53#define bfi_h2i_set(_mh, _mc, _op, _lpuid) do { \ 55#define bfi_h2i_set(_mh, _mc, _op, _lpuid) do { \
54 (_mh).msg_class = (_mc); \ 56 (_mh).msg_class = (_mc); \
55 (_mh).msg_id = (_op); \ 57 (_mh).msg_id = (_op); \
@@ -157,6 +159,14 @@ struct bfi_mbmsg_s {
157}; 159};
158 160
159/* 161/*
162 * Supported PCI function class codes (personality)
163 */
164enum bfi_pcifn_class {
165 BFI_PCIFN_CLASS_FC = 0x0c04,
166 BFI_PCIFN_CLASS_ETH = 0x0200,
167};
168
169/*
160 * Message Classes 170 * Message Classes
161 */ 171 */
162enum bfi_mclass { 172enum bfi_mclass {
@@ -353,8 +363,8 @@ enum {
353 */ 363 */
354struct bfi_ioc_ctrl_req_s { 364struct bfi_ioc_ctrl_req_s {
355 struct bfi_mhdr_s mh; 365 struct bfi_mhdr_s mh;
356 u8 ioc_class; 366 u16 clscode;
357 u8 rsvd[3]; 367 u16 rsvd;
358 u32 tv_sec; 368 u32 tv_sec;
359}; 369};
360#define bfi_ioc_enable_req_t struct bfi_ioc_ctrl_req_s; 370#define bfi_ioc_enable_req_t struct bfi_ioc_ctrl_req_s;