Skip to content

Commit 3712639

Browse files
arndbmartinkpetersen
authored andcommitted
scsi: bfa: Fix function pointer type mismatch for state machines
The bfa driver is full of state machines and a generic abstraction layer for them. This relies on casting function pointers, but that is no longer allowed when CONFIG_CFI_CLANG is enabled and causes a huge number of warnings like: drivers/scsi/bfa/bfad.c:169:3: error: cast from 'void (*)(struct bfad_s *, enum bfad_sm_event)' to 'bfa_sm_t' (aka 'void (*)(void *, int)') converts to incompatible function type [-Werror,-Wcast-function-type-strict] bfa_sm_set_state(bfad, bfad_sm_created); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Rework the mechanism to no longer require the function pointer casts, by having separate types for each individual state machine. This in turn requires moving the enum definitions for each state machine into the header files in order to define the typedef. Reviewed-by: Kees Cook <keescook@chromium.org> Signed-off-by: Arnd Bergmann <arnd@arndb.de> Link: https://lore.kernel.org/r/20240222124433.2046570-2-arnd@kernel.org Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
1 parent b696002 commit 3712639

File tree

13 files changed

+582
-435
lines changed

13 files changed

+582
-435
lines changed

drivers/scsi/bfa/bfa.h

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -215,8 +215,27 @@ struct bfa_faa_args_s {
215215
bfa_boolean_t busy;
216216
};
217217

218+
/*
219+
* IOCFC state machine definitions/declarations
220+
*/
221+
enum iocfc_event {
222+
IOCFC_E_INIT = 1, /* IOCFC init request */
223+
IOCFC_E_START = 2, /* IOCFC mod start request */
224+
IOCFC_E_STOP = 3, /* IOCFC stop request */
225+
IOCFC_E_ENABLE = 4, /* IOCFC enable request */
226+
IOCFC_E_DISABLE = 5, /* IOCFC disable request */
227+
IOCFC_E_IOC_ENABLED = 6, /* IOC enabled message */
228+
IOCFC_E_IOC_DISABLED = 7, /* IOC disabled message */
229+
IOCFC_E_IOC_FAILED = 8, /* failure notice by IOC sm */
230+
IOCFC_E_DCONF_DONE = 9, /* dconf read/write done */
231+
IOCFC_E_CFG_DONE = 10, /* IOCFC config complete */
232+
};
233+
234+
struct bfa_iocfc_s;
235+
typedef void (*bfa_iocfs_fsm_t)(struct bfa_iocfc_s *, enum iocfc_event);
236+
218237
struct bfa_iocfc_s {
219-
bfa_fsm_t fsm;
238+
bfa_iocfs_fsm_t fsm;
220239
struct bfa_s *bfa;
221240
struct bfa_iocfc_cfg_s cfg;
222241
u32 req_cq_pi[BFI_IOC_MAX_CQS];

drivers/scsi/bfa/bfa_cs.h

Lines changed: 5 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -187,10 +187,10 @@ typedef void (*bfa_sm_t)(void *sm, int event);
187187
#define bfa_sm_state_decl(oc, st, otype, etype) \
188188
static void oc ## _sm_ ## st(otype * fsm, etype event)
189189

190-
#define bfa_sm_set_state(_sm, _state) ((_sm)->sm = (bfa_sm_t)(_state))
190+
#define bfa_sm_set_state(_sm, _state) ((_sm)->sm = (_state))
191191
#define bfa_sm_send_event(_sm, _event) ((_sm)->sm((_sm), (_event)))
192192
#define bfa_sm_get_state(_sm) ((_sm)->sm)
193-
#define bfa_sm_cmp_state(_sm, _state) ((_sm)->sm == (bfa_sm_t)(_state))
193+
#define bfa_sm_cmp_state(_sm, _state) ((_sm)->sm == (_state))
194194

195195
/*
196196
* For converting from state machine function to state encoding.
@@ -200,7 +200,7 @@ struct bfa_sm_table_s {
200200
int state; /* state machine encoding */
201201
char *name; /* state name for display */
202202
};
203-
#define BFA_SM(_sm) ((bfa_sm_t)(_sm))
203+
#define BFA_SM(_sm) (_sm)
204204

205205
/*
206206
* State machine with entry actions.
@@ -218,24 +218,13 @@ typedef void (*bfa_fsm_t)(void *fsm, int event);
218218
static void oc ## _sm_ ## st ## _entry(otype * fsm)
219219

220220
#define bfa_fsm_set_state(_fsm, _state) do { \
221-
(_fsm)->fsm = (bfa_fsm_t)(_state); \
221+
(_fsm)->fsm = (_state); \
222222
_state ## _entry(_fsm); \
223223
} while (0)
224224

225225
#define bfa_fsm_send_event(_fsm, _event) ((_fsm)->fsm((_fsm), (_event)))
226226
#define bfa_fsm_get_state(_fsm) ((_fsm)->fsm)
227-
#define bfa_fsm_cmp_state(_fsm, _state) \
228-
((_fsm)->fsm == (bfa_fsm_t)(_state))
229-
230-
static inline int
231-
bfa_sm_to_state(struct bfa_sm_table_s *smt, bfa_sm_t sm)
232-
{
233-
int i = 0;
234-
235-
while (smt[i].sm && smt[i].sm != sm)
236-
i++;
237-
return smt[i].state;
238-
}
227+
#define bfa_fsm_cmp_state(_fsm, _state) ((_fsm)->fsm == (_state))
239228

240229
/*
241230
* @ Generic wait counter.

drivers/scsi/bfa/bfa_fcpim.c

Lines changed: 0 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -64,21 +64,6 @@ enum bfa_ioim_lm_ua_status {
6464
BFA_IOIM_LM_UA_SET = 1,
6565
};
6666

67-
/*
68-
* itnim state machine event
69-
*/
70-
enum bfa_itnim_event {
71-
BFA_ITNIM_SM_CREATE = 1, /* itnim is created */
72-
BFA_ITNIM_SM_ONLINE = 2, /* itnim is online */
73-
BFA_ITNIM_SM_OFFLINE = 3, /* itnim is offline */
74-
BFA_ITNIM_SM_FWRSP = 4, /* firmware response */
75-
BFA_ITNIM_SM_DELETE = 5, /* deleting an existing itnim */
76-
BFA_ITNIM_SM_CLEANUP = 6, /* IO cleanup completion */
77-
BFA_ITNIM_SM_SLER = 7, /* second level error recovery */
78-
BFA_ITNIM_SM_HWFAIL = 8, /* IOC h/w failure event */
79-
BFA_ITNIM_SM_QRESUME = 9, /* queue space available */
80-
};
81-
8267
/*
8368
* BFA IOIM related definitions
8469
*/
@@ -98,30 +83,6 @@ enum bfa_itnim_event {
9883
(__fcpim)->profile_start(__ioim); \
9984
} while (0)
10085

101-
/*
102-
* IO state machine events
103-
*/
104-
enum bfa_ioim_event {
105-
BFA_IOIM_SM_START = 1, /* io start request from host */
106-
BFA_IOIM_SM_COMP_GOOD = 2, /* io good comp, resource free */
107-
BFA_IOIM_SM_COMP = 3, /* io comp, resource is free */
108-
BFA_IOIM_SM_COMP_UTAG = 4, /* io comp, resource is free */
109-
BFA_IOIM_SM_DONE = 5, /* io comp, resource not free */
110-
BFA_IOIM_SM_FREE = 6, /* io resource is freed */
111-
BFA_IOIM_SM_ABORT = 7, /* abort request from scsi stack */
112-
BFA_IOIM_SM_ABORT_COMP = 8, /* abort from f/w */
113-
BFA_IOIM_SM_ABORT_DONE = 9, /* abort completion from f/w */
114-
BFA_IOIM_SM_QRESUME = 10, /* CQ space available to queue IO */
115-
BFA_IOIM_SM_SGALLOCED = 11, /* SG page allocation successful */
116-
BFA_IOIM_SM_SQRETRY = 12, /* sequence recovery retry */
117-
BFA_IOIM_SM_HCB = 13, /* bfa callback complete */
118-
BFA_IOIM_SM_CLEANUP = 14, /* IO cleanup from itnim */
119-
BFA_IOIM_SM_TMSTART = 15, /* IO cleanup from tskim */
120-
BFA_IOIM_SM_TMDONE = 16, /* IO cleanup from tskim */
121-
BFA_IOIM_SM_HWFAIL = 17, /* IOC h/w failure event */
122-
BFA_IOIM_SM_IOTOV = 18, /* ITN offline TOV */
123-
};
124-
12586

12687
/*
12788
* BFA TSKIM related definitions
@@ -141,18 +102,6 @@ enum bfa_ioim_event {
141102
} while (0)
142103

143104

144-
enum bfa_tskim_event {
145-
BFA_TSKIM_SM_START = 1, /* TM command start */
146-
BFA_TSKIM_SM_DONE = 2, /* TM completion */
147-
BFA_TSKIM_SM_QRESUME = 3, /* resume after qfull */
148-
BFA_TSKIM_SM_HWFAIL = 5, /* IOC h/w failure event */
149-
BFA_TSKIM_SM_HCB = 6, /* BFA callback completion */
150-
BFA_TSKIM_SM_IOS_DONE = 7, /* IO and sub TM completions */
151-
BFA_TSKIM_SM_CLEANUP = 8, /* TM cleanup on ITN offline */
152-
BFA_TSKIM_SM_CLEANUP_DONE = 9, /* TM abort completion */
153-
BFA_TSKIM_SM_UTAG = 10, /* TM completion unknown tag */
154-
};
155-
156105
/*
157106
* forward declaration for BFA ITNIM functions
158107
*/

drivers/scsi/bfa/bfa_fcpim.h

Lines changed: 63 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -154,12 +154,39 @@ struct bfa_fcp_mod_s {
154154
int throttle_update_required;
155155
};
156156

157+
/*
158+
* IO state machine events
159+
*/
160+
enum bfa_ioim_event {
161+
BFA_IOIM_SM_START = 1, /* io start request from host */
162+
BFA_IOIM_SM_COMP_GOOD = 2, /* io good comp, resource free */
163+
BFA_IOIM_SM_COMP = 3, /* io comp, resource is free */
164+
BFA_IOIM_SM_COMP_UTAG = 4, /* io comp, resource is free */
165+
BFA_IOIM_SM_DONE = 5, /* io comp, resource not free */
166+
BFA_IOIM_SM_FREE = 6, /* io resource is freed */
167+
BFA_IOIM_SM_ABORT = 7, /* abort request from scsi stack */
168+
BFA_IOIM_SM_ABORT_COMP = 8, /* abort from f/w */
169+
BFA_IOIM_SM_ABORT_DONE = 9, /* abort completion from f/w */
170+
BFA_IOIM_SM_QRESUME = 10, /* CQ space available to queue IO */
171+
BFA_IOIM_SM_SGALLOCED = 11, /* SG page allocation successful */
172+
BFA_IOIM_SM_SQRETRY = 12, /* sequence recovery retry */
173+
BFA_IOIM_SM_HCB = 13, /* bfa callback complete */
174+
BFA_IOIM_SM_CLEANUP = 14, /* IO cleanup from itnim */
175+
BFA_IOIM_SM_TMSTART = 15, /* IO cleanup from tskim */
176+
BFA_IOIM_SM_TMDONE = 16, /* IO cleanup from tskim */
177+
BFA_IOIM_SM_HWFAIL = 17, /* IOC h/w failure event */
178+
BFA_IOIM_SM_IOTOV = 18, /* ITN offline TOV */
179+
};
180+
181+
struct bfa_ioim_s;
182+
typedef void (*bfa_ioim_sm_t)(struct bfa_ioim_s *, enum bfa_ioim_event);
183+
157184
/*
158185
* BFA IO (initiator mode)
159186
*/
160187
struct bfa_ioim_s {
161188
struct list_head qe; /* queue elememt */
162-
bfa_sm_t sm; /* BFA ioim state machine */
189+
bfa_ioim_sm_t sm; /* BFA ioim state machine */
163190
struct bfa_s *bfa; /* BFA module */
164191
struct bfa_fcpim_s *fcpim; /* parent fcpim module */
165192
struct bfa_itnim_s *itnim; /* i-t-n nexus for this IO */
@@ -186,12 +213,27 @@ struct bfa_ioim_sp_s {
186213
struct bfa_tskim_s *tskim; /* Relevant TM cmd */
187214
};
188215

216+
enum bfa_tskim_event {
217+
BFA_TSKIM_SM_START = 1, /* TM command start */
218+
BFA_TSKIM_SM_DONE = 2, /* TM completion */
219+
BFA_TSKIM_SM_QRESUME = 3, /* resume after qfull */
220+
BFA_TSKIM_SM_HWFAIL = 5, /* IOC h/w failure event */
221+
BFA_TSKIM_SM_HCB = 6, /* BFA callback completion */
222+
BFA_TSKIM_SM_IOS_DONE = 7, /* IO and sub TM completions */
223+
BFA_TSKIM_SM_CLEANUP = 8, /* TM cleanup on ITN offline */
224+
BFA_TSKIM_SM_CLEANUP_DONE = 9, /* TM abort completion */
225+
BFA_TSKIM_SM_UTAG = 10, /* TM completion unknown tag */
226+
};
227+
228+
struct bfa_tskim_s;
229+
typedef void (*bfa_tskim_sm_t)(struct bfa_tskim_s *, enum bfa_tskim_event);
230+
189231
/*
190232
* BFA Task management command (initiator mode)
191233
*/
192234
struct bfa_tskim_s {
193235
struct list_head qe;
194-
bfa_sm_t sm;
236+
bfa_tskim_sm_t sm;
195237
struct bfa_s *bfa; /* BFA module */
196238
struct bfa_fcpim_s *fcpim; /* parent fcpim module */
197239
struct bfa_itnim_s *itnim; /* i-t-n nexus for this IO */
@@ -208,12 +250,30 @@ struct bfa_tskim_s {
208250
enum bfi_tskim_status tsk_status; /* TM status */
209251
};
210252

253+
/*
254+
* itnim state machine event
255+
*/
256+
enum bfa_itnim_event {
257+
BFA_ITNIM_SM_CREATE = 1, /* itnim is created */
258+
BFA_ITNIM_SM_ONLINE = 2, /* itnim is online */
259+
BFA_ITNIM_SM_OFFLINE = 3, /* itnim is offline */
260+
BFA_ITNIM_SM_FWRSP = 4, /* firmware response */
261+
BFA_ITNIM_SM_DELETE = 5, /* deleting an existing itnim */
262+
BFA_ITNIM_SM_CLEANUP = 6, /* IO cleanup completion */
263+
BFA_ITNIM_SM_SLER = 7, /* second level error recovery */
264+
BFA_ITNIM_SM_HWFAIL = 8, /* IOC h/w failure event */
265+
BFA_ITNIM_SM_QRESUME = 9, /* queue space available */
266+
};
267+
268+
struct bfa_itnim_s;
269+
typedef void (*bfa_itnim_sm_t)(struct bfa_itnim_s *, enum bfa_itnim_event);
270+
211271
/*
212272
* BFA i-t-n (initiator mode)
213273
*/
214274
struct bfa_itnim_s {
215275
struct list_head qe; /* queue element */
216-
bfa_sm_t sm; /* i-t-n im BFA state machine */
276+
bfa_itnim_sm_t sm; /* i-t-n im BFA state machine */
217277
struct bfa_s *bfa; /* bfa instance */
218278
struct bfa_rport_s *rport; /* bfa rport */
219279
void *ditn; /* driver i-t-n structure */

0 commit comments

Comments
 (0)