Skip to content

Commit 21cbb18

Browse files
committed
Merge: scsi: fnic: driver update
MR: https://gitlab.com/redhat/centos-stream/src/kernel/centos-stream-9/-/merge_requests/4430 JIRA: https://issues.redhat.com/browse/RHEL-36420 Bring fnic driver up to date with what's upstream as of v6.9 Signed-off-by: John Meneghini <[email protected]> Approved-by: Ewan D. Milne <[email protected]> Approved-by: Chris Leech <[email protected]> Approved-by: CKI KWF Bot <[email protected]> Merged-by: Lucas Zampieri <[email protected]>
2 parents 2cbf058 + dec9a94 commit 21cbb18

File tree

13 files changed

+1141
-821
lines changed

13 files changed

+1141
-821
lines changed

drivers/scsi/fnic/fnic.h

Lines changed: 70 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939

4040
#define DRV_NAME "fnic"
4141
#define DRV_DESCRIPTION "Cisco FCoE HBA Driver"
42-
#define DRV_VERSION "1.6.0.53"
42+
#define DRV_VERSION "1.7.0.0"
4343
#define PFX DRV_NAME ": "
4444
#define DFX DRV_NAME "%d: "
4545

@@ -48,7 +48,6 @@
4848
#define FNIC_MIN_IO_REQ 256 /* Min IO throttle count */
4949
#define FNIC_MAX_IO_REQ 1024 /* scsi_cmnd tag map entries */
5050
#define FNIC_DFLT_IO_REQ 256 /* Default scsi_cmnd tag map entries */
51-
#define FNIC_IO_LOCKS 64 /* IO locks: power of 2 */
5251
#define FNIC_DFLT_QUEUE_DEPTH 256
5352
#define FNIC_STATS_RATE_LIMIT 4 /* limit rate at which stats are pulled up */
5453

@@ -89,15 +88,28 @@
8988
#define FNIC_DEV_RST_ABTS_PENDING BIT(21)
9089

9190
/*
92-
* Usage of the scsi_cmnd scratchpad.
91+
* fnic private data per SCSI command.
9392
* These fields are locked by the hashed io_req_lock.
9493
*/
95-
#define CMD_SP(Cmnd) ((Cmnd)->SCp.ptr)
96-
#define CMD_STATE(Cmnd) ((Cmnd)->SCp.phase)
97-
#define CMD_ABTS_STATUS(Cmnd) ((Cmnd)->SCp.Message)
98-
#define CMD_LR_STATUS(Cmnd) ((Cmnd)->SCp.have_data_in)
99-
#define CMD_TAG(Cmnd) ((Cmnd)->SCp.sent_command)
100-
#define CMD_FLAGS(Cmnd) ((Cmnd)->SCp.Status)
94+
struct fnic_cmd_priv {
95+
struct fnic_io_req *io_req;
96+
enum fnic_ioreq_state state;
97+
u32 flags;
98+
u16 abts_status;
99+
u16 lr_status;
100+
};
101+
102+
static inline struct fnic_cmd_priv *fnic_priv(struct scsi_cmnd *cmd)
103+
{
104+
return scsi_cmd_priv(cmd);
105+
}
106+
107+
static inline u64 fnic_flags_and_state(struct scsi_cmnd *cmd)
108+
{
109+
struct fnic_cmd_priv *fcmd = fnic_priv(cmd);
110+
111+
return ((u64)fcmd->flags << 32) | fcmd->state;
112+
}
101113

102114
#define FCPIO_INVALID_CODE 0x100 /* hdr_status value unused by firmware */
103115

@@ -108,7 +120,7 @@
108120
#define FNIC_ABT_TERM_DELAY_TIMEOUT 500 /* mSec */
109121

110122
#define FNIC_MAX_FCP_TARGET 256
111-
123+
#define FNIC_PCI_OFFSET 2
112124
/**
113125
* state_flags to identify host state along along with fnic's state
114126
**/
@@ -143,39 +155,56 @@ do { \
143155
} while (0); \
144156
} while (0)
145157

146-
#define FNIC_MAIN_DBG(kern_level, host, fmt, args...) \
158+
#define FNIC_MAIN_DBG(kern_level, host, fnic_num, fmt, args...) \
147159
FNIC_CHECK_LOGGING(FNIC_MAIN_LOGGING, \
148-
shost_printk(kern_level, host, fmt, ##args);)
160+
shost_printk(kern_level, host, \
161+
"fnic<%d>: %s: %d: " fmt, fnic_num,\
162+
__func__, __LINE__, ##args);)
149163

150-
#define FNIC_FCS_DBG(kern_level, host, fmt, args...) \
164+
#define FNIC_FCS_DBG(kern_level, host, fnic_num, fmt, args...) \
151165
FNIC_CHECK_LOGGING(FNIC_FCS_LOGGING, \
152-
shost_printk(kern_level, host, fmt, ##args);)
166+
shost_printk(kern_level, host, \
167+
"fnic<%d>: %s: %d: " fmt, fnic_num,\
168+
__func__, __LINE__, ##args);)
153169

154-
#define FNIC_SCSI_DBG(kern_level, host, fmt, args...) \
170+
#define FNIC_SCSI_DBG(kern_level, host, fnic_num, fmt, args...) \
155171
FNIC_CHECK_LOGGING(FNIC_SCSI_LOGGING, \
156-
shost_printk(kern_level, host, fmt, ##args);)
172+
shost_printk(kern_level, host, \
173+
"fnic<%d>: %s: %d: " fmt, fnic_num,\
174+
__func__, __LINE__, ##args);)
157175

158-
#define FNIC_ISR_DBG(kern_level, host, fmt, args...) \
176+
#define FNIC_ISR_DBG(kern_level, host, fnic_num, fmt, args...) \
159177
FNIC_CHECK_LOGGING(FNIC_ISR_LOGGING, \
160-
shost_printk(kern_level, host, fmt, ##args);)
178+
shost_printk(kern_level, host, \
179+
"fnic<%d>: %s: %d: " fmt, fnic_num,\
180+
__func__, __LINE__, ##args);)
161181

162182
#define FNIC_MAIN_NOTE(kern_level, host, fmt, args...) \
163183
shost_printk(kern_level, host, fmt, ##args)
164184

185+
#define FNIC_WQ_COPY_MAX 64
186+
#define FNIC_WQ_MAX 1
187+
#define FNIC_RQ_MAX 1
188+
#define FNIC_CQ_MAX (FNIC_WQ_COPY_MAX + FNIC_WQ_MAX + FNIC_RQ_MAX)
189+
#define FNIC_DFLT_IO_COMPLETIONS 256
190+
191+
#define FNIC_MQ_CQ_INDEX 2
192+
165193
extern const char *fnic_state_str[];
166194

167195
enum fnic_intx_intr_index {
168196
FNIC_INTX_WQ_RQ_COPYWQ,
169-
FNIC_INTX_ERR,
197+
FNIC_INTX_DUMMY,
170198
FNIC_INTX_NOTIFY,
199+
FNIC_INTX_ERR,
171200
FNIC_INTX_INTR_MAX,
172201
};
173202

174203
enum fnic_msix_intr_index {
175204
FNIC_MSIX_RQ,
176205
FNIC_MSIX_WQ,
177206
FNIC_MSIX_WQ_COPY,
178-
FNIC_MSIX_ERR_NOTIFY,
207+
FNIC_MSIX_ERR_NOTIFY = FNIC_MSIX_WQ_COPY + FNIC_WQ_COPY_MAX,
179208
FNIC_MSIX_INTR_MAX,
180209
};
181210

@@ -184,6 +213,7 @@ struct fnic_msix_entry {
184213
char devname[IFNAMSIZ + 11];
185214
irqreturn_t (*isr)(int, void *);
186215
void *devid;
216+
int irq_num;
187217
};
188218

189219
enum fnic_state {
@@ -193,12 +223,6 @@ enum fnic_state {
193223
FNIC_IN_ETH_TRANS_FC_MODE,
194224
};
195225

196-
#define FNIC_WQ_COPY_MAX 1
197-
#define FNIC_WQ_MAX 1
198-
#define FNIC_RQ_MAX 1
199-
#define FNIC_CQ_MAX (FNIC_WQ_COPY_MAX + FNIC_WQ_MAX + FNIC_RQ_MAX)
200-
#define FNIC_DFLT_IO_COMPLETIONS 256
201-
202226
struct mempool;
203227

204228
enum fnic_evt {
@@ -213,8 +237,16 @@ struct fnic_event {
213237
enum fnic_evt event;
214238
};
215239

240+
struct fnic_cpy_wq {
241+
unsigned long hw_lock_flags;
242+
u16 active_ioreq_count;
243+
u16 ioreq_table_size;
244+
____cacheline_aligned struct fnic_io_req **io_req_table;
245+
};
246+
216247
/* Per-instance private data structure */
217248
struct fnic {
249+
int fnic_num;
218250
struct fc_lport *lport;
219251
struct fcoe_ctlr ctlr; /* FIP FCoE controller structure */
220252
struct vnic_dev_bar bar0;
@@ -235,6 +267,9 @@ struct fnic {
235267
unsigned int wq_count;
236268
unsigned int cq_count;
237269

270+
struct mutex sgreset_mutex;
271+
spinlock_t sgreset_lock; /* lock for sgreset */
272+
struct scsi_cmnd *sgreset_sc;
238273
struct dentry *fnic_stats_debugfs_host;
239274
struct dentry *fnic_stats_debugfs_file;
240275
struct dentry *fnic_reset_debugfs_file;
@@ -278,10 +313,11 @@ struct fnic {
278313
struct fnic_host_tag *tags;
279314
mempool_t *io_req_pool;
280315
mempool_t *io_sgl_pool[FNIC_SGL_NUM_CACHES];
281-
spinlock_t io_req_lock[FNIC_IO_LOCKS]; /* locks for scsi cmnds */
282316

317+
unsigned int copy_wq_base;
283318
struct work_struct link_work;
284319
struct work_struct frame_work;
320+
struct work_struct flush_work;
285321
struct sk_buff_head frame_queue;
286322
struct sk_buff_head tx_queue;
287323

@@ -298,7 +334,9 @@ struct fnic {
298334
/*** FIP related data members -- end ***/
299335

300336
/* copy work queue cache line section */
301-
____cacheline_aligned struct vnic_wq_copy wq_copy[FNIC_WQ_COPY_MAX];
337+
____cacheline_aligned struct vnic_wq_copy hw_copy_wq[FNIC_WQ_COPY_MAX];
338+
____cacheline_aligned struct fnic_cpy_wq sw_copy_wq[FNIC_WQ_COPY_MAX];
339+
302340
/* completion queue cache line section */
303341
____cacheline_aligned struct vnic_cq cq[FNIC_CQ_MAX];
304342

@@ -326,6 +364,7 @@ extern struct device_attribute *fnic_attrs[];
326364

327365
void fnic_clear_intr_mode(struct fnic *fnic);
328366
int fnic_set_intr_mode(struct fnic *fnic);
367+
int fnic_set_intr_mode_msix(struct fnic *fnic);
329368
void fnic_free_intr(struct fnic *fnic);
330369
int fnic_request_intr(struct fnic *fnic);
331370

@@ -337,7 +376,7 @@ void fnic_handle_event(struct work_struct *work);
337376
int fnic_rq_cmpl_handler(struct fnic *fnic, int);
338377
int fnic_alloc_rq_frame(struct vnic_rq *rq);
339378
void fnic_free_rq_buf(struct vnic_rq *rq, struct vnic_rq_buf *buf);
340-
void fnic_flush_tx(struct fnic *);
379+
void fnic_flush_tx(struct work_struct *work);
341380
void fnic_eth_send(struct fcoe_ctlr *, struct sk_buff *skb);
342381
void fnic_set_port_id(struct fc_lport *, u32, struct fc_frame *);
343382
void fnic_update_mac(struct fc_lport *, u8 *new);
@@ -352,15 +391,15 @@ void fnic_scsi_cleanup(struct fc_lport *);
352391
void fnic_scsi_abort_io(struct fc_lport *);
353392
void fnic_empty_scsi_cleanup(struct fc_lport *);
354393
void fnic_exch_mgr_reset(struct fc_lport *, u32, u32);
355-
int fnic_wq_copy_cmpl_handler(struct fnic *fnic, int);
394+
int fnic_wq_copy_cmpl_handler(struct fnic *fnic, int copy_work_to_do, unsigned int cq_index);
356395
int fnic_wq_cmpl_handler(struct fnic *fnic, int);
357396
int fnic_flogi_reg_handler(struct fnic *fnic, u32);
358397
void fnic_wq_copy_cleanup_handler(struct vnic_wq_copy *wq,
359398
struct fcpio_host_req *desc);
360399
int fnic_fw_reset_handler(struct fnic *fnic);
361400
void fnic_terminate_rport_io(struct fc_rport *);
362401
const char *fnic_state_to_str(unsigned int state);
363-
402+
void fnic_mq_map_queues_cpus(struct Scsi_Host *host);
364403
void fnic_log_q_error(struct fnic *fnic);
365404
void fnic_handle_link_event(struct fnic *fnic);
366405

drivers/scsi/fnic/fnic_attrs.c

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,22 +26,21 @@ static ssize_t fnic_show_state(struct device *dev,
2626
struct fc_lport *lp = shost_priv(class_to_shost(dev));
2727
struct fnic *fnic = lport_priv(lp);
2828

29-
return snprintf(buf, PAGE_SIZE, "%s\n", fnic_state_str[fnic->state]);
29+
return sysfs_emit(buf, "%s\n", fnic_state_str[fnic->state]);
3030
}
3131

3232
static ssize_t fnic_show_drv_version(struct device *dev,
3333
struct device_attribute *attr, char *buf)
3434
{
35-
return snprintf(buf, PAGE_SIZE, "%s\n", DRV_VERSION);
35+
return sysfs_emit(buf, "%s\n", DRV_VERSION);
3636
}
3737

3838
static ssize_t fnic_show_link_state(struct device *dev,
3939
struct device_attribute *attr, char *buf)
4040
{
4141
struct fc_lport *lp = shost_priv(class_to_shost(dev));
4242

43-
return snprintf(buf, PAGE_SIZE, "%s\n", (lp->link_up)
44-
? "Link Up" : "Link Down");
43+
return sysfs_emit(buf, "%s\n", (lp->link_up) ? "Link Up" : "Link Down");
4544
}
4645

4746
static DEVICE_ATTR(fnic_state, S_IRUGO, fnic_show_state, NULL);

drivers/scsi/fnic/fnic_debugfs.c

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,10 @@ int fnic_debugfs_init(void)
6666
fc_trc_flag->fnic_trace = 2;
6767
fc_trc_flag->fc_trace = 3;
6868
fc_trc_flag->fc_clear = 4;
69+
return 0;
6970
}
7071

71-
return 0;
72+
return -ENOMEM;
7273
}
7374

7475
/*
@@ -86,8 +87,7 @@ void fnic_debugfs_terminate(void)
8687
debugfs_remove(fnic_trace_debugfs_root);
8788
fnic_trace_debugfs_root = NULL;
8889

89-
if (fc_trc_flag)
90-
vfree(fc_trc_flag);
90+
vfree(fc_trc_flag);
9191
}
9292

9393
/*
@@ -216,25 +216,21 @@ static int fnic_trace_debugfs_open(struct inode *inode,
216216
return -ENOMEM;
217217

218218
if (*rdata_ptr == fc_trc_flag->fnic_trace) {
219-
fnic_dbg_prt->buffer = vmalloc(array3_size(3, trace_max_pages,
219+
fnic_dbg_prt->buffer = vzalloc(array3_size(3, trace_max_pages,
220220
PAGE_SIZE));
221221
if (!fnic_dbg_prt->buffer) {
222222
kfree(fnic_dbg_prt);
223223
return -ENOMEM;
224224
}
225-
memset((void *)fnic_dbg_prt->buffer, 0,
226-
3 * (trace_max_pages * PAGE_SIZE));
227225
fnic_dbg_prt->buffer_len = fnic_get_trace_data(fnic_dbg_prt);
228226
} else {
229227
fnic_dbg_prt->buffer =
230-
vmalloc(array3_size(3, fnic_fc_trace_max_pages,
228+
vzalloc(array3_size(3, fnic_fc_trace_max_pages,
231229
PAGE_SIZE));
232230
if (!fnic_dbg_prt->buffer) {
233231
kfree(fnic_dbg_prt);
234232
return -ENOMEM;
235233
}
236-
memset((void *)fnic_dbg_prt->buffer, 0,
237-
3 * (fnic_fc_trace_max_pages * PAGE_SIZE));
238234
fnic_dbg_prt->buffer_len =
239235
fnic_fc_trace_get_data(fnic_dbg_prt, *rdata_ptr);
240236
}

0 commit comments

Comments
 (0)