1
2
3
4
5
6
7
8
9
10
11
12
13
14
15#ifndef _BNX2I_H_
16#define _BNX2I_H_
17
18#include <linux/module.h>
19#include <linux/moduleparam.h>
20
21#include <linux/errno.h>
22#include <linux/pci.h>
23#include <linux/spinlock.h>
24#include <linux/interrupt.h>
25#include <linux/sched.h>
26#include <linux/in.h>
27#include <linux/kfifo.h>
28#include <linux/netdevice.h>
29#include <linux/completion.h>
30
31#include <scsi/scsi_cmnd.h>
32#include <scsi/scsi_device.h>
33#include <scsi/scsi_eh.h>
34#include <scsi/scsi_host.h>
35#include <scsi/scsi.h>
36#include <scsi/iscsi_proto.h>
37#include <scsi/libiscsi.h>
38#include <scsi/scsi_transport_iscsi.h>
39
40#include "../../net/cnic_if.h"
41#include "57xx_iscsi_hsi.h"
42#include "57xx_iscsi_constants.h"
43
44#define BNX2_ISCSI_DRIVER_NAME "bnx2i"
45
46#define BNX2I_MAX_ADAPTERS 8
47
48#define ISCSI_MAX_CONNS_PER_HBA 128
49#define ISCSI_MAX_SESS_PER_HBA ISCSI_MAX_CONNS_PER_HBA
50#define ISCSI_MAX_CMDS_PER_SESS 128
51
52
53#define ISCSI_MAX_CMDS_PER_HBA_5708 (28 * (ISCSI_MAX_CMDS_PER_SESS - 1))
54#define ISCSI_MAX_CMDS_PER_HBA_5709 (128 * (ISCSI_MAX_CMDS_PER_SESS - 1))
55#define ISCSI_MAX_CMDS_PER_HBA_57710 (256 * (ISCSI_MAX_CMDS_PER_SESS - 1))
56
57#define ISCSI_MAX_BDS_PER_CMD 32
58
59#define MAX_PAGES_PER_CTRL_STRUCT_POOL 8
60#define BNX2I_RESERVED_SLOW_PATH_CMD_SLOTS 4
61
62#define BNX2I_5771X_DBELL_PAGE_SIZE 128
63
64
65#define MAX_BD_LENGTH 65535
66#define BD_SPLIT_SIZE 32768
67
68
69#define BNX2I_SQ_WQES_MIN 16
70#define BNX2I_570X_SQ_WQES_MAX 128
71#define BNX2I_5770X_SQ_WQES_MAX 512
72#define BNX2I_570X_SQ_WQES_DEFAULT 128
73#define BNX2I_5770X_SQ_WQES_DEFAULT 256
74
75#define BNX2I_570X_CQ_WQES_MAX 128
76#define BNX2I_5770X_CQ_WQES_MAX 512
77
78#define BNX2I_RQ_WQES_MIN 16
79#define BNX2I_RQ_WQES_MAX 32
80#define BNX2I_RQ_WQES_DEFAULT 16
81
82
83#define BNX2I_CCELLS_MIN 16
84#define BNX2I_CCELLS_MAX 96
85#define BNX2I_CCELLS_DEFAULT 64
86
87#define ITT_INVALID_SIGNATURE 0xFFFF
88
89#define ISCSI_CMD_CLEANUP_TIMEOUT 100
90
91#define BNX2I_CONN_CTX_BUF_SIZE 16384
92
93#define BNX2I_SQ_WQE_SIZE 64
94#define BNX2I_RQ_WQE_SIZE 256
95#define BNX2I_CQE_SIZE 64
96
97#define MB_KERNEL_CTX_SHIFT 8
98#define MB_KERNEL_CTX_SIZE (1 << MB_KERNEL_CTX_SHIFT)
99
100#define CTX_SHIFT 7
101#define GET_CID_NUM(cid_addr) ((cid_addr) >> CTX_SHIFT)
102
103#define CTX_OFFSET 0x10000
104#define MAX_CID_CNT 0x4000
105
106#define BNX2I_570X_PAGE_SIZE_DEFAULT 4096
107
108
109#define BNX2_MQ_CONFIG2 0x00003d00
110#define BNX2_MQ_CONFIG2_CONT_SZ (0x7L<<4)
111#define BNX2_MQ_CONFIG2_FIRST_L4L5 (0x1fL<<8)
112
113
114#define BNX2X_DOORBELL_PCI_BAR 2
115#define BNX2X_MAX_CQS 8
116
117#define CNIC_ARM_CQE 1
118#define CNIC_DISARM_CQE 0
119
120#define REG_RD(__hba, offset) \
121 readl(__hba->regview + offset)
122#define REG_WR(__hba, offset, val) \
123 writel(val, __hba->regview + offset)
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150struct generic_pdu_resc {
151 char *req_buf;
152 dma_addr_t req_dma_addr;
153 u32 req_buf_size;
154 char *req_wr_ptr;
155 struct iscsi_hdr resp_hdr;
156 char *resp_buf;
157 dma_addr_t resp_dma_addr;
158 u32 resp_buf_size;
159 char *resp_wr_ptr;
160 char *req_bd_tbl;
161 dma_addr_t req_bd_dma;
162 char *resp_bd_tbl;
163 dma_addr_t resp_bd_dma;
164};
165
166
167
168
169
170
171
172
173
174
175
176
177struct bd_resc_page {
178 struct list_head link;
179 u32 max_ptrs;
180 u32 num_valid;
181 void *page[1];
182};
183
184
185
186
187
188
189
190
191
192
193
194struct io_bdt {
195 struct iscsi_bd *bd_tbl;
196 dma_addr_t bd_tbl_dma;
197 u16 bd_valid;
198};
199
200
201
202
203
204
205
206
207
208
209struct bnx2i_cmd {
210 struct iscsi_hdr hdr;
211 struct bnx2i_conn *conn;
212 struct scsi_cmnd *scsi_cmd;
213 struct scatterlist *sg;
214 struct io_bdt io_tbl;
215 dma_addr_t bd_tbl_dma;
216 struct bnx2i_cmd_request req;
217};
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234struct bnx2i_conn {
235 struct iscsi_cls_conn *cls_conn;
236 struct bnx2i_hba *hba;
237 struct completion cmd_cleanup_cmpl;
238
239 u32 iscsi_conn_cid;
240#define BNX2I_CID_RESERVED 0x5AFF
241 u32 fw_cid;
242
243 struct timer_list poll_timer;
244
245
246
247 struct bnx2i_endpoint *ep;
248
249
250
251
252 struct generic_pdu_resc gen_pdu;
253 u64 violation_notified;
254};
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271struct iscsi_cid_queue {
272 void *cid_que_base;
273 u32 *cid_que;
274 u32 cid_q_prod_idx;
275 u32 cid_q_cons_idx;
276 u32 cid_q_max_idx;
277 u32 cid_free_cnt;
278 struct bnx2i_conn **conn_cid_tbl;
279};
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337struct bnx2i_hba {
338 struct list_head link;
339 struct cnic_dev *cnic;
340 struct pci_dev *pcidev;
341 struct net_device *netdev;
342 void __iomem *regview;
343
344 u32 age;
345 unsigned long cnic_dev_type;
346 #define BNX2I_NX2_DEV_5706 0x0
347 #define BNX2I_NX2_DEV_5708 0x1
348 #define BNX2I_NX2_DEV_5709 0x2
349 #define BNX2I_NX2_DEV_57710 0x3
350 u32 mail_queue_access;
351 #define BNX2I_MQ_KERNEL_MODE 0x0
352 #define BNX2I_MQ_KERNEL_BYPASS_MODE 0x1
353 #define BNX2I_MQ_BIN_MODE 0x2
354 unsigned long reg_with_cnic;
355 #define BNX2I_CNIC_REGISTERED 1
356
357 unsigned long adapter_state;
358 #define ADAPTER_STATE_UP 0
359 #define ADAPTER_STATE_GOING_DOWN 1
360 #define ADAPTER_STATE_LINK_DOWN 2
361 #define ADAPTER_STATE_INIT_FAILED 31
362 unsigned int mtu_supported;
363 #define BNX2I_MAX_MTU_SUPPORTED 1500
364
365 struct Scsi_Host *shost;
366
367 u32 max_sqes;
368 u32 max_rqes;
369 u32 max_cqes;
370 u32 num_ccell;
371
372 int ofld_conns_active;
373 wait_queue_head_t eh_wait;
374
375 int max_active_conns;
376 struct iscsi_cid_queue cid_que;
377
378 rwlock_t ep_rdwr_lock;
379 struct list_head ep_ofld_list;
380 struct list_head ep_active_list;
381 struct list_head ep_destroy_list;
382
383
384
385
386 char *mp_bd_tbl;
387 dma_addr_t mp_bd_dma;
388 char *dummy_buffer;
389 dma_addr_t dummy_buf_dma;
390
391 spinlock_t lock;
392 struct mutex net_dev_lock;
393
394 int hba_shutdown_tmo;
395 int conn_teardown_tmo;
396 int conn_ctx_destroy_tmo;
397
398
399
400 u16 pci_did;
401 u16 pci_vid;
402 u16 pci_sdid;
403 u16 pci_svid;
404 u16 pci_func;
405 u16 pci_devno;
406
407
408
409
410
411 u32 num_wqe_sent;
412 u32 num_cqe_rcvd;
413 u32 num_intr_claimed;
414 u32 link_changed_count;
415 u32 ipaddr_changed_count;
416 u32 num_sess_opened;
417 u32 num_conn_opened;
418 unsigned int ctx_ccell_tasks;
419};
420
421
422
423
424
425
426
427
428
429struct sqe {
430 u8 sqe_byte[BNX2I_SQ_WQE_SIZE];
431};
432
433struct rqe {
434 u8 rqe_byte[BNX2I_RQ_WQE_SIZE];
435};
436
437struct cqe {
438 u8 cqe_byte[BNX2I_CQE_SIZE];
439};
440
441
442enum {
443#if defined(__LITTLE_ENDIAN)
444 CNIC_EVENT_COAL_INDEX = 0x0,
445 CNIC_SEND_DOORBELL = 0x4,
446 CNIC_EVENT_CQ_ARM = 0x7,
447 CNIC_RECV_DOORBELL = 0x8
448#elif defined(__BIG_ENDIAN)
449 CNIC_EVENT_COAL_INDEX = 0x2,
450 CNIC_SEND_DOORBELL = 0x6,
451 CNIC_EVENT_CQ_ARM = 0x4,
452 CNIC_RECV_DOORBELL = 0xa
453#endif
454};
455
456
457
458
459
460struct bnx2x_iscsi_cq_pend_cmpl {
461
462 u16 ustrom_prod;
463
464 u16 pend_cntr;
465};
466
467
468struct bnx2i_5771x_cq_db {
469 struct bnx2x_iscsi_cq_pend_cmpl qp_pend_cmpl[BNX2X_MAX_CQS];
470
471 u16 itt[BNX2X_MAX_CQS];
472 ;
473 u16 sqn[BNX2X_MAX_CQS];
474 u32 reserved[4] ;
475};
476
477
478struct bnx2i_5771x_sq_rq_db {
479 u16 prod_idx;
480 u8 reserved0[14];
481};
482
483
484struct bnx2i_5771x_dbell_hdr {
485 u8 header;
486
487#define B577XX_DOORBELL_HDR_RX (0x1<<0)
488#define B577XX_DOORBELL_HDR_RX_SHIFT 0
489
490#define B577XX_DOORBELL_HDR_DB_TYPE (0x1<<1)
491#define B577XX_DOORBELL_HDR_DB_TYPE_SHIFT 1
492
493#define B577XX_DOORBELL_HDR_DPM_SIZE (0x3<<2)
494#define B577XX_DOORBELL_HDR_DPM_SIZE_SHIFT 2
495
496#define B577XX_DOORBELL_HDR_CONN_TYPE (0xF<<4)
497#define B577XX_DOORBELL_HDR_CONN_TYPE_SHIFT 4
498};
499
500struct bnx2i_5771x_dbell {
501 struct bnx2i_5771x_dbell_hdr dbell;
502 u8 pad[3];
503
504};
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559struct qp_info {
560 void __iomem *ctx_base;
561#define DPM_TRIGER_TYPE 0x40
562
563#define BNX2I_570x_QUE_DB_SIZE 0
564#define BNX2I_5771x_QUE_DB_SIZE 16
565 struct sqe *sq_virt;
566 dma_addr_t sq_phys;
567 u32 sq_mem_size;
568
569 struct sqe *sq_prod_qe;
570 struct sqe *sq_cons_qe;
571 struct sqe *sq_first_qe;
572 struct sqe *sq_last_qe;
573 u16 sq_prod_idx;
574 u16 sq_cons_idx;
575 u32 sqe_left;
576
577 void *sq_pgtbl_virt;
578 dma_addr_t sq_pgtbl_phys;
579 u32 sq_pgtbl_size;
580
581 struct cqe *cq_virt;
582 dma_addr_t cq_phys;
583 u32 cq_mem_size;
584
585 struct cqe *cq_prod_qe;
586 struct cqe *cq_cons_qe;
587 struct cqe *cq_first_qe;
588 struct cqe *cq_last_qe;
589 u16 cq_prod_idx;
590 u16 cq_cons_idx;
591 u32 cqe_left;
592 u32 cqe_size;
593 u32 cqe_exp_seq_sn;
594
595 void *cq_pgtbl_virt;
596 dma_addr_t cq_pgtbl_phys;
597 u32 cq_pgtbl_size;
598
599 struct rqe *rq_virt;
600 dma_addr_t rq_phys;
601 u32 rq_mem_size;
602
603 struct rqe *rq_prod_qe;
604 struct rqe *rq_cons_qe;
605 struct rqe *rq_first_qe;
606 struct rqe *rq_last_qe;
607 u16 rq_prod_idx;
608 u16 rq_cons_idx;
609 u32 rqe_left;
610
611 void *rq_pgtbl_virt;
612 dma_addr_t rq_pgtbl_phys;
613 u32 rq_pgtbl_size;
614};
615
616
617
618
619
620
621struct ep_handles {
622 u32 fw_cid;
623 u32 drv_iscsi_cid;
624 u16 pg_cid;
625 u16 rsvd;
626};
627
628
629enum {
630 EP_STATE_IDLE = 0x0,
631 EP_STATE_PG_OFLD_START = 0x1,
632 EP_STATE_PG_OFLD_COMPL = 0x2,
633 EP_STATE_OFLD_START = 0x4,
634 EP_STATE_OFLD_COMPL = 0x8,
635 EP_STATE_CONNECT_START = 0x10,
636 EP_STATE_CONNECT_COMPL = 0x20,
637 EP_STATE_ULP_UPDATE_START = 0x40,
638 EP_STATE_ULP_UPDATE_COMPL = 0x80,
639 EP_STATE_DISCONN_START = 0x100,
640 EP_STATE_DISCONN_COMPL = 0x200,
641 EP_STATE_CLEANUP_START = 0x400,
642 EP_STATE_CLEANUP_CMPL = 0x800,
643 EP_STATE_TCP_FIN_RCVD = 0x1000,
644 EP_STATE_TCP_RST_RCVD = 0x2000,
645 EP_STATE_LOGOUT_SENT = 0x4000,
646 EP_STATE_LOGOUT_RESP_RCVD = 0x8000,
647 EP_STATE_PG_OFLD_FAILED = 0x1000000,
648 EP_STATE_ULP_UPDATE_FAILED = 0x2000000,
649 EP_STATE_CLEANUP_FAILED = 0x4000000,
650 EP_STATE_OFLD_FAILED = 0x8000000,
651 EP_STATE_CONNECT_FAILED = 0x10000000,
652 EP_STATE_DISCONN_TIMEDOUT = 0x20000000,
653 EP_STATE_OFLD_FAILED_CID_BUSY = 0x80000000,
654};
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678struct bnx2i_endpoint {
679 struct list_head link;
680 struct bnx2i_hba *hba;
681 struct bnx2i_conn *conn;
682 struct iscsi_endpoint *cls_ep;
683 struct cnic_sock *cm_sk;
684 u32 hba_age;
685 u32 state;
686 unsigned long timestamp;
687 int num_active_cmds;
688
689 struct qp_info qp;
690 struct ep_handles ids;
691 #define ep_iscsi_cid ids.drv_iscsi_cid
692 #define ep_cid ids.fw_cid
693 #define ep_pg_cid ids.pg_cid
694 struct timer_list ofld_timer;
695 wait_queue_head_t ofld_wait;
696};
697
698
699
700
701extern unsigned int error_mask1, error_mask2;
702extern u64 iscsi_error_mask;
703extern unsigned int en_tcp_dack;
704extern unsigned int event_coal_div;
705extern unsigned int event_coal_min;
706
707extern struct scsi_transport_template *bnx2i_scsi_xport_template;
708extern struct iscsi_transport bnx2i_iscsi_transport;
709extern struct cnic_ulp_ops bnx2i_cnic_cb;
710
711extern unsigned int sq_size;
712extern unsigned int rq_size;
713
714extern struct device_attribute *bnx2i_dev_attributes[];
715
716
717
718
719
720
721extern void bnx2i_identify_device(struct bnx2i_hba *hba);
722
723extern void bnx2i_ulp_init(struct cnic_dev *dev);
724extern void bnx2i_ulp_exit(struct cnic_dev *dev);
725extern void bnx2i_start(void *handle);
726extern void bnx2i_stop(void *handle);
727extern struct bnx2i_hba *get_adapter_list_head(void);
728
729struct bnx2i_conn *bnx2i_get_conn_from_id(struct bnx2i_hba *hba,
730 u16 iscsi_cid);
731
732int bnx2i_alloc_ep_pool(void);
733void bnx2i_release_ep_pool(void);
734struct bnx2i_endpoint *bnx2i_ep_ofld_list_next(struct bnx2i_hba *hba);
735struct bnx2i_endpoint *bnx2i_ep_destroy_list_next(struct bnx2i_hba *hba);
736
737struct bnx2i_hba *bnx2i_find_hba_for_cnic(struct cnic_dev *cnic);
738
739struct bnx2i_hba *bnx2i_alloc_hba(struct cnic_dev *cnic);
740void bnx2i_free_hba(struct bnx2i_hba *hba);
741
742void bnx2i_get_rq_buf(struct bnx2i_conn *conn, char *ptr, int len);
743void bnx2i_put_rq_buf(struct bnx2i_conn *conn, int count);
744
745void bnx2i_iscsi_unmap_sg_list(struct bnx2i_cmd *cmd);
746
747void bnx2i_drop_session(struct iscsi_cls_session *session);
748
749extern int bnx2i_send_fw_iscsi_init_msg(struct bnx2i_hba *hba);
750extern int bnx2i_send_iscsi_login(struct bnx2i_conn *conn,
751 struct iscsi_task *mtask);
752extern int bnx2i_send_iscsi_tmf(struct bnx2i_conn *conn,
753 struct iscsi_task *mtask);
754extern int bnx2i_send_iscsi_scsicmd(struct bnx2i_conn *conn,
755 struct bnx2i_cmd *cmnd);
756extern int bnx2i_send_iscsi_nopout(struct bnx2i_conn *conn,
757 struct iscsi_task *mtask,
758 char *datap, int data_len, int unsol);
759extern int bnx2i_send_iscsi_logout(struct bnx2i_conn *conn,
760 struct iscsi_task *mtask);
761extern void bnx2i_send_cmd_cleanup_req(struct bnx2i_hba *hba,
762 struct bnx2i_cmd *cmd);
763extern int bnx2i_send_conn_ofld_req(struct bnx2i_hba *hba,
764 struct bnx2i_endpoint *ep);
765extern void bnx2i_update_iscsi_conn(struct iscsi_conn *conn);
766extern int bnx2i_send_conn_destroy(struct bnx2i_hba *hba,
767 struct bnx2i_endpoint *ep);
768
769extern int bnx2i_alloc_qp_resc(struct bnx2i_hba *hba,
770 struct bnx2i_endpoint *ep);
771extern void bnx2i_free_qp_resc(struct bnx2i_hba *hba,
772 struct bnx2i_endpoint *ep);
773extern void bnx2i_ep_ofld_timer(unsigned long data);
774extern struct bnx2i_endpoint *bnx2i_find_ep_in_ofld_list(
775 struct bnx2i_hba *hba, u32 iscsi_cid);
776extern struct bnx2i_endpoint *bnx2i_find_ep_in_destroy_list(
777 struct bnx2i_hba *hba, u32 iscsi_cid);
778
779extern int bnx2i_map_ep_dbell_regs(struct bnx2i_endpoint *ep);
780extern void bnx2i_arm_cq_event_coalescing(struct bnx2i_endpoint *ep, u8 action);
781
782extern int bnx2i_hw_ep_disconnect(struct bnx2i_endpoint *bnx2i_ep);
783
784
785extern void bnx2i_print_pend_cmd_queue(struct bnx2i_conn *conn);
786extern void bnx2i_print_active_cmd_queue(struct bnx2i_conn *conn);
787extern void bnx2i_print_xmit_pdu_queue(struct bnx2i_conn *conn);
788extern void bnx2i_print_recv_state(struct bnx2i_conn *conn);
789
790#endif
791