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