hc
2024-01-05 071106ecf68c401173c58808b1cf5f68cc50d390
kernel/include/linux/nvme-fc-driver.h
....@@ -1,18 +1,130 @@
1
+/* SPDX-License-Identifier: GPL-2.0 */
12 /*
23 * Copyright (c) 2016, Avago Technologies
3
- *
4
- * This program is free software; you can redistribute it and/or modify it
5
- * under the terms and conditions of the GNU General Public License,
6
- * version 2, as published by the Free Software Foundation.
7
- *
8
- * This program is distributed in the hope it will be useful, but WITHOUT
9
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
10
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
11
- * more details.
124 */
135
146 #ifndef _NVME_FC_DRIVER_H
157 #define _NVME_FC_DRIVER_H 1
8
+
9
+#include <linux/scatterlist.h>
10
+
11
+
12
+/*
13
+ * ********************** FC-NVME LS API ********************
14
+ *
15
+ * Data structures used by both FC-NVME hosts and FC-NVME
16
+ * targets to perform FC-NVME LS requests or transmit
17
+ * responses.
18
+ *
19
+ * ***********************************************************
20
+ */
21
+
22
+/**
23
+ * struct nvmefc_ls_req - Request structure passed from the transport
24
+ * to the LLDD to perform a NVME-FC LS request and obtain
25
+ * a response.
26
+ * Used by nvme-fc transport (host) to send LS's such as
27
+ * Create Association, Create Connection and Disconnect
28
+ * Association.
29
+ * Used by the nvmet-fc transport (controller) to send
30
+ * LS's such as Disconnect Association.
31
+ *
32
+ * Values set by the requestor prior to calling the LLDD ls_req entrypoint:
33
+ * @rqstaddr: pointer to request buffer
34
+ * @rqstdma: PCI DMA address of request buffer
35
+ * @rqstlen: Length, in bytes, of request buffer
36
+ * @rspaddr: pointer to response buffer
37
+ * @rspdma: PCI DMA address of response buffer
38
+ * @rsplen: Length, in bytes, of response buffer
39
+ * @timeout: Maximum amount of time, in seconds, to wait for the LS response.
40
+ * If timeout exceeded, LLDD to abort LS exchange and complete
41
+ * LS request with error status.
42
+ * @private: pointer to memory allocated alongside the ls request structure
43
+ * that is specifically for the LLDD to use while processing the
44
+ * request. The length of the buffer corresponds to the
45
+ * lsrqst_priv_sz value specified in the xxx_template supplied
46
+ * by the LLDD.
47
+ * @done: The callback routine the LLDD is to invoke upon completion of
48
+ * the LS request. req argument is the pointer to the original LS
49
+ * request structure. Status argument must be 0 upon success, a
50
+ * negative errno on failure (example: -ENXIO).
51
+ */
52
+struct nvmefc_ls_req {
53
+ void *rqstaddr;
54
+ dma_addr_t rqstdma;
55
+ u32 rqstlen;
56
+ void *rspaddr;
57
+ dma_addr_t rspdma;
58
+ u32 rsplen;
59
+ u32 timeout;
60
+
61
+ void *private;
62
+
63
+ void (*done)(struct nvmefc_ls_req *req, int status);
64
+
65
+} __aligned(sizeof(u64)); /* alignment for other things alloc'd with */
66
+
67
+
68
+/**
69
+ * struct nvmefc_ls_rsp - Structure passed from the transport to the LLDD
70
+ * to request the transmit the NVME-FC LS response to a
71
+ * NVME-FC LS request. The structure originates in the LLDD
72
+ * and is given to the transport via the xxx_rcv_ls_req()
73
+ * transport routine. As such, the structure represents the
74
+ * FC exchange context for the NVME-FC LS request that was
75
+ * received and which the response is to be sent for.
76
+ * Used by the LLDD to pass the nvmet-fc transport (controller)
77
+ * received LS's such as Create Association, Create Connection
78
+ * and Disconnect Association.
79
+ * Used by the LLDD to pass the nvme-fc transport (host)
80
+ * received LS's such as Disconnect Association or Disconnect
81
+ * Connection.
82
+ *
83
+ * The structure is allocated by the LLDD whenever a LS Request is received
84
+ * from the FC link. The address of the structure is passed to the nvmet-fc
85
+ * or nvme-fc layer via the xxx_rcv_ls_req() transport routines.
86
+ *
87
+ * The address of the structure is to be passed back to the LLDD
88
+ * when the response is to be transmit. The LLDD will use the address to
89
+ * map back to the LLDD exchange structure which maintains information such
90
+ * the remote N_Port that sent the LS as well as any FC exchange context.
91
+ * Upon completion of the LS response transmit, the LLDD will pass the
92
+ * address of the structure back to the transport LS rsp done() routine,
93
+ * allowing the transport release dma resources. Upon completion of
94
+ * the done() routine, no further access to the structure will be made by
95
+ * the transport and the LLDD can de-allocate the structure.
96
+ *
97
+ * Field initialization:
98
+ * At the time of the xxx_rcv_ls_req() call, there is no content that
99
+ * is valid in the structure.
100
+ *
101
+ * When the structure is used for the LLDD->xmt_ls_rsp() call, the
102
+ * transport layer will fully set the fields in order to specify the
103
+ * response payload buffer and its length as well as the done routine
104
+ * to be called upon completion of the transmit. The transport layer
105
+ * will also set a private pointer for its own use in the done routine.
106
+ *
107
+ * Values set by the transport layer prior to calling the LLDD xmt_ls_rsp
108
+ * entrypoint:
109
+ * @rspbuf: pointer to the LS response buffer
110
+ * @rspdma: PCI DMA address of the LS response buffer
111
+ * @rsplen: Length, in bytes, of the LS response buffer
112
+ * @done: The callback routine the LLDD is to invoke upon completion of
113
+ * transmitting the LS response. req argument is the pointer to
114
+ * the original ls request.
115
+ * @nvme_fc_private: pointer to an internal transport-specific structure
116
+ * used as part of the transport done() processing. The LLDD is
117
+ * not to access this pointer.
118
+ */
119
+struct nvmefc_ls_rsp {
120
+ void *rspbuf;
121
+ dma_addr_t rspdma;
122
+ u16 rsplen;
123
+
124
+ void (*done)(struct nvmefc_ls_rsp *rsp);
125
+ void *nvme_fc_private; /* LLDD is not to access !! */
126
+};
127
+
16128
17129
18130 /*
....@@ -22,13 +134,6 @@
22134 *
23135 * ******************************************************************
24136 */
25
-
26
-
27
-
28
-/* FC Port role bitmask - can merge with FC Port Roles in fc transport */
29
-#define FC_PORT_ROLE_NVME_INITIATOR 0x10
30
-#define FC_PORT_ROLE_NVME_TARGET 0x20
31
-#define FC_PORT_ROLE_NVME_DISCOVERY 0x40
32137
33138
34139 /**
....@@ -54,49 +159,6 @@
54159 u32 port_id;
55160 u32 dev_loss_tmo;
56161 };
57
-
58
-
59
-/**
60
- * struct nvmefc_ls_req - Request structure passed from NVME-FC transport
61
- * to LLDD in order to perform a NVME FC-4 LS
62
- * request and obtain a response.
63
- *
64
- * Values set by the NVME-FC layer prior to calling the LLDD ls_req
65
- * entrypoint.
66
- * @rqstaddr: pointer to request buffer
67
- * @rqstdma: PCI DMA address of request buffer
68
- * @rqstlen: Length, in bytes, of request buffer
69
- * @rspaddr: pointer to response buffer
70
- * @rspdma: PCI DMA address of response buffer
71
- * @rsplen: Length, in bytes, of response buffer
72
- * @timeout: Maximum amount of time, in seconds, to wait for the LS response.
73
- * If timeout exceeded, LLDD to abort LS exchange and complete
74
- * LS request with error status.
75
- * @private: pointer to memory allocated alongside the ls request structure
76
- * that is specifically for the LLDD to use while processing the
77
- * request. The length of the buffer corresponds to the
78
- * lsrqst_priv_sz value specified in the nvme_fc_port_template
79
- * supplied by the LLDD.
80
- * @done: The callback routine the LLDD is to invoke upon completion of
81
- * the LS request. req argument is the pointer to the original LS
82
- * request structure. Status argument must be 0 upon success, a
83
- * negative errno on failure (example: -ENXIO).
84
- */
85
-struct nvmefc_ls_req {
86
- void *rqstaddr;
87
- dma_addr_t rqstdma;
88
- u32 rqstlen;
89
- void *rspaddr;
90
- dma_addr_t rspdma;
91
- u32 rsplen;
92
- u32 timeout;
93
-
94
- void *private;
95
-
96
- void (*done)(struct nvmefc_ls_req *req, int status);
97
-
98
-} __aligned(sizeof(u64)); /* alignment for other things alloc'd with */
99
-
100162
101163 enum nvmefc_fcp_datadir {
102164 NVMEFC_FCP_NODATA, /* payload_length and sg_cnt will be zero */
....@@ -349,6 +411,21 @@
349411 * indicating an FC transport Aborted status.
350412 * Entrypoint is Mandatory.
351413 *
414
+ * @xmt_ls_rsp: Called to transmit the response to a FC-NVME FC-4 LS service.
415
+ * The nvmefc_ls_rsp structure is the same LLDD-supplied exchange
416
+ * structure specified in the nvme_fc_rcv_ls_req() call made when
417
+ * the LS request was received. The structure will fully describe
418
+ * the buffers for the response payload and the dma address of the
419
+ * payload. The LLDD is to transmit the response (or return a
420
+ * non-zero errno status), and upon completion of the transmit, call
421
+ * the "done" routine specified in the nvmefc_ls_rsp structure
422
+ * (argument to done is the address of the nvmefc_ls_rsp structure
423
+ * itself). Upon the completion of the done routine, the LLDD shall
424
+ * consider the LS handling complete and the nvmefc_ls_rsp structure
425
+ * may be freed/released.
426
+ * Entrypoint is mandatory if the LLDD calls the nvme_fc_rcv_ls_req()
427
+ * entrypoint.
428
+ *
352429 * @max_hw_queues: indicates the maximum number of hw queues the LLDD
353430 * supports for cpu affinitization.
354431 * Value is Mandatory. Must be at least 1.
....@@ -383,7 +460,7 @@
383460 * @lsrqst_priv_sz: The LLDD sets this field to the amount of additional
384461 * memory that it would like fc nvme layer to allocate on the LLDD's
385462 * behalf whenever a ls request structure is allocated. The additional
386
- * memory area solely for the of the LLDD and its location is
463
+ * memory area is solely for use by the LLDD and its location is
387464 * specified by the ls_request->private pointer.
388465 * Value is Mandatory. Allowed to be zero.
389466 *
....@@ -403,7 +480,6 @@
403480 void **handle);
404481 void (*delete_queue)(struct nvme_fc_local_port *,
405482 unsigned int qidx, void *handle);
406
- void (*poll_queue)(struct nvme_fc_local_port *, void *handle);
407483 int (*ls_req)(struct nvme_fc_local_port *,
408484 struct nvme_fc_remote_port *,
409485 struct nvmefc_ls_req *);
....@@ -418,6 +494,9 @@
418494 struct nvme_fc_remote_port *,
419495 void *hw_queue_handle,
420496 struct nvmefc_fcp_req *);
497
+ int (*xmt_ls_rsp)(struct nvme_fc_local_port *localport,
498
+ struct nvme_fc_remote_port *rport,
499
+ struct nvmefc_ls_rsp *ls_rsp);
421500
422501 u32 max_hw_queues;
423502 u16 max_sgl_segments;
....@@ -454,6 +533,34 @@
454533 int nvme_fc_set_remoteport_devloss(struct nvme_fc_remote_port *remoteport,
455534 u32 dev_loss_tmo);
456535
536
+/*
537
+ * Routine called to pass a NVME-FC LS request, received by the lldd,
538
+ * to the nvme-fc transport.
539
+ *
540
+ * If the return value is zero: the LS was successfully accepted by the
541
+ * transport.
542
+ * If the return value is non-zero: the transport has not accepted the
543
+ * LS. The lldd should ABTS-LS the LS.
544
+ *
545
+ * Note: if the LLDD receives and ABTS for the LS prior to the transport
546
+ * calling the ops->xmt_ls_rsp() routine to transmit a response, the LLDD
547
+ * shall mark the LS as aborted, and when the xmt_ls_rsp() is called: the
548
+ * response shall not be transmit and the struct nvmefc_ls_rsp() done
549
+ * routine shall be called. The LLDD may transmit the ABTS response as
550
+ * soon as the LS was marked or can delay until the xmt_ls_rsp() call is
551
+ * made.
552
+ * Note: if an RCV LS was successfully posted to the transport and the
553
+ * remoteport is then unregistered before xmt_ls_rsp() was called for
554
+ * the lsrsp structure, the transport will still call xmt_ls_rsp()
555
+ * afterward to cleanup the outstanding lsrsp structure. The LLDD should
556
+ * noop the transmission of the rsp and call the lsrsp->done() routine
557
+ * to allow the lsrsp structure to be released.
558
+ */
559
+int nvme_fc_rcv_ls_req(struct nvme_fc_remote_port *remoteport,
560
+ struct nvmefc_ls_rsp *lsrsp,
561
+ void *lsreqbuf, u32 lsreqbuf_len);
562
+
563
+
457564
458565 /*
459566 * *************** LLDD FC-NVME Target/Subsystem API ***************
....@@ -482,55 +589,6 @@
482589 u32 port_id;
483590 };
484591
485
-
486
-/**
487
- * struct nvmefc_tgt_ls_req - Structure used between LLDD and NVMET-FC
488
- * layer to represent the exchange context for
489
- * a FC-NVME Link Service (LS).
490
- *
491
- * The structure is allocated by the LLDD whenever a LS Request is received
492
- * from the FC link. The address of the structure is passed to the nvmet-fc
493
- * layer via the nvmet_fc_rcv_ls_req() call. The address of the structure
494
- * will be passed back to the LLDD when the response is to be transmit.
495
- * The LLDD is to use the address to map back to the LLDD exchange structure
496
- * which maintains information such as the targetport the LS was received
497
- * on, the remote FC NVME initiator that sent the LS, and any FC exchange
498
- * context. Upon completion of the LS response transmit, the address of the
499
- * structure will be passed back to the LS rsp done() routine, allowing the
500
- * nvmet-fc layer to release dma resources. Upon completion of the done()
501
- * routine, no further access will be made by the nvmet-fc layer and the
502
- * LLDD can de-allocate the structure.
503
- *
504
- * Field initialization:
505
- * At the time of the nvmet_fc_rcv_ls_req() call, there is no content that
506
- * is valid in the structure.
507
- *
508
- * When the structure is used for the LLDD->xmt_ls_rsp() call, the nvmet-fc
509
- * layer will fully set the fields in order to specify the response
510
- * payload buffer and its length as well as the done routine to be called
511
- * upon compeletion of the transmit. The nvmet-fc layer will also set a
512
- * private pointer for its own use in the done routine.
513
- *
514
- * Values set by the NVMET-FC layer prior to calling the LLDD xmt_ls_rsp
515
- * entrypoint.
516
- * @rspbuf: pointer to the LS response buffer
517
- * @rspdma: PCI DMA address of the LS response buffer
518
- * @rsplen: Length, in bytes, of the LS response buffer
519
- * @done: The callback routine the LLDD is to invoke upon completion of
520
- * transmitting the LS response. req argument is the pointer to
521
- * the original ls request.
522
- * @nvmet_fc_private: pointer to an internal NVMET-FC layer structure used
523
- * as part of the NVMET-FC processing. The LLDD is not to access
524
- * this pointer.
525
- */
526
-struct nvmefc_tgt_ls_req {
527
- void *rspbuf;
528
- dma_addr_t rspdma;
529
- u16 rsplen;
530
-
531
- void (*done)(struct nvmefc_tgt_ls_req *req);
532
- void *nvmet_fc_private; /* LLDD is not to access !! */
533
-};
534592
535593 /* Operations that NVME-FC layer may request the LLDD to perform for FCP */
536594 enum {
....@@ -614,7 +672,7 @@
614672 * Values set by the LLDD indicating completion status of the FCP operation.
615673 * Must be set prior to calling the done() callback.
616674 * @transferred_length: amount of DATA_OUT payload data received by a
617
- * a WRITEDATA operation. If not a WRITEDATA operation, value must
675
+ * WRITEDATA operation. If not a WRITEDATA operation, value must
618676 * be set to 0. Should equal transfer_length on success.
619677 * @fcp_error: status of the FCP operation. Must be 0 on success; on failure
620678 * must be a NVME_SC_FC_xxxx value.
....@@ -648,22 +706,6 @@
648706 * sends (the last) Read Data sequence followed by the RSP
649707 * sequence in one LLDD operation. Errors during Data
650708 * sequence transmit must not allow RSP sequence to be sent.
651
- */
652
- NVMET_FCTGTFEAT_CMD_IN_ISR = (1 << 1),
653
- /* Bit 2: When 0, the LLDD is calling the cmd rcv handler
654
- * in a non-isr context, allowing the transport to finish
655
- * op completion in the calling context. When 1, the LLDD
656
- * is calling the cmd rcv handler in an ISR context,
657
- * requiring the transport to transition to a workqueue
658
- * for op completion.
659
- */
660
- NVMET_FCTGTFEAT_OPDONE_IN_ISR = (1 << 2),
661
- /* Bit 3: When 0, the LLDD is calling the op done handler
662
- * in a non-isr context, allowing the transport to finish
663
- * op completion in the calling context. When 1, the LLDD
664
- * is calling the op done handler in an ISR context,
665
- * requiring the transport to transition to a workqueue
666
- * for op completion.
667709 */
668710 };
669711
....@@ -722,17 +764,19 @@
722764 * Entrypoint is Mandatory.
723765 *
724766 * @xmt_ls_rsp: Called to transmit the response to a FC-NVME FC-4 LS service.
725
- * The nvmefc_tgt_ls_req structure is the same LLDD-supplied exchange
767
+ * The nvmefc_ls_rsp structure is the same LLDD-supplied exchange
726768 * structure specified in the nvmet_fc_rcv_ls_req() call made when
727
- * the LS request was received. The structure will fully describe
769
+ * the LS request was received. The structure will fully describe
728770 * the buffers for the response payload and the dma address of the
729
- * payload. The LLDD is to transmit the response (or return a non-zero
730
- * errno status), and upon completion of the transmit, call the
731
- * "done" routine specified in the nvmefc_tgt_ls_req structure
732
- * (argument to done is the ls reqwuest structure itself).
733
- * After calling the done routine, the LLDD shall consider the
734
- * LS handling complete and the nvmefc_tgt_ls_req structure may
735
- * be freed/released.
771
+ * payload. The LLDD is to transmit the response (or return a
772
+ * non-zero errno status), and upon completion of the transmit, call
773
+ * the "done" routine specified in the nvmefc_ls_rsp structure
774
+ * (argument to done is the address of the nvmefc_ls_rsp structure
775
+ * itself). Upon the completion of the done() routine, the LLDD shall
776
+ * consider the LS handling complete and the nvmefc_ls_rsp structure
777
+ * may be freed/released.
778
+ * The transport will always call the xmt_ls_rsp() routine for any
779
+ * LS received.
736780 * Entrypoint is Mandatory.
737781 *
738782 * @fcp_op: Called to perform a data transfer or transmit a response.
....@@ -822,6 +866,44 @@
822866 * nvmefc_tgt_fcp_req.
823867 * Entrypoint is Optional.
824868 *
869
+ * @discovery_event: Called by the transport to generate an RSCN
870
+ * change notifications to NVME initiators. The RSCN notifications
871
+ * should cause the initiator to rescan the discovery controller
872
+ * on the targetport.
873
+ *
874
+ * @ls_req: Called to issue a FC-NVME FC-4 LS service request.
875
+ * The nvme_fc_ls_req structure will fully describe the buffers for
876
+ * the request payload and where to place the response payload.
877
+ * The targetport that is to issue the LS request is identified by
878
+ * the targetport argument. The remote port that is to receive the
879
+ * LS request is identified by the hosthandle argument. The nvmet-fc
880
+ * transport is only allowed to issue FC-NVME LS's on behalf of an
881
+ * association that was created prior by a Create Association LS.
882
+ * The hosthandle will originate from the LLDD in the struct
883
+ * nvmefc_ls_rsp structure for the Create Association LS that
884
+ * was delivered to the transport. The transport will save the
885
+ * hosthandle as an attribute of the association. If the LLDD
886
+ * loses connectivity with the remote port, it must call the
887
+ * nvmet_fc_invalidate_host() routine to remove any references to
888
+ * the remote port in the transport.
889
+ * The LLDD is to allocate an exchange, issue the LS request, obtain
890
+ * the LS response, and call the "done" routine specified in the
891
+ * request structure (argument to done is the ls request structure
892
+ * itself).
893
+ * Entrypoint is Optional - but highly recommended.
894
+ *
895
+ * @ls_abort: called to request the LLDD to abort the indicated ls request.
896
+ * The call may return before the abort has completed. After aborting
897
+ * the request, the LLDD must still call the ls request done routine
898
+ * indicating an FC transport Aborted status.
899
+ * Entrypoint is Mandatory if the ls_req entry point is specified.
900
+ *
901
+ * @host_release: called to inform the LLDD that the request to invalidate
902
+ * the host port indicated by the hosthandle has been fully completed.
903
+ * No associations exist with the host port and there will be no
904
+ * further references to hosthandle.
905
+ * Entrypoint is Mandatory if the lldd calls nvmet_fc_invalidate_host().
906
+ *
825907 * @max_hw_queues: indicates the maximum number of hw queues the LLDD
826908 * supports for cpu affinitization.
827909 * Value is Mandatory. Must be at least 1.
....@@ -850,11 +932,19 @@
850932 * area solely for the of the LLDD and its location is specified by
851933 * the targetport->private pointer.
852934 * Value is Mandatory. Allowed to be zero.
935
+ *
936
+ * @lsrqst_priv_sz: The LLDD sets this field to the amount of additional
937
+ * memory that it would like nvmet-fc layer to allocate on the LLDD's
938
+ * behalf whenever a ls request structure is allocated. The additional
939
+ * memory area is solely for use by the LLDD and its location is
940
+ * specified by the ls_request->private pointer.
941
+ * Value is Mandatory. Allowed to be zero.
942
+ *
853943 */
854944 struct nvmet_fc_target_template {
855945 void (*targetport_delete)(struct nvmet_fc_target_port *tgtport);
856946 int (*xmt_ls_rsp)(struct nvmet_fc_target_port *tgtport,
857
- struct nvmefc_tgt_ls_req *tls_req);
947
+ struct nvmefc_ls_rsp *ls_rsp);
858948 int (*fcp_op)(struct nvmet_fc_target_port *tgtport,
859949 struct nvmefc_tgt_fcp_req *fcpreq);
860950 void (*fcp_abort)(struct nvmet_fc_target_port *tgtport,
....@@ -863,6 +953,12 @@
863953 struct nvmefc_tgt_fcp_req *fcpreq);
864954 void (*defer_rcv)(struct nvmet_fc_target_port *tgtport,
865955 struct nvmefc_tgt_fcp_req *fcpreq);
956
+ void (*discovery_event)(struct nvmet_fc_target_port *tgtport);
957
+ int (*ls_req)(struct nvmet_fc_target_port *targetport,
958
+ void *hosthandle, struct nvmefc_ls_req *lsreq);
959
+ void (*ls_abort)(struct nvmet_fc_target_port *targetport,
960
+ void *hosthandle, struct nvmefc_ls_req *lsreq);
961
+ void (*host_release)(void *hosthandle);
866962
867963 u32 max_hw_queues;
868964 u16 max_sgl_segments;
....@@ -871,7 +967,9 @@
871967
872968 u32 target_features;
873969
970
+ /* sizes of additional private data for data structures */
874971 u32 target_priv_sz;
972
+ u32 lsrqst_priv_sz;
875973 };
876974
877975
....@@ -882,10 +980,61 @@
882980
883981 int nvmet_fc_unregister_targetport(struct nvmet_fc_target_port *tgtport);
884982
983
+/*
984
+ * Routine called to pass a NVME-FC LS request, received by the lldd,
985
+ * to the nvmet-fc transport.
986
+ *
987
+ * If the return value is zero: the LS was successfully accepted by the
988
+ * transport.
989
+ * If the return value is non-zero: the transport has not accepted the
990
+ * LS. The lldd should ABTS-LS the LS.
991
+ *
992
+ * Note: if the LLDD receives and ABTS for the LS prior to the transport
993
+ * calling the ops->xmt_ls_rsp() routine to transmit a response, the LLDD
994
+ * shall mark the LS as aborted, and when the xmt_ls_rsp() is called: the
995
+ * response shall not be transmit and the struct nvmefc_ls_rsp() done
996
+ * routine shall be called. The LLDD may transmit the ABTS response as
997
+ * soon as the LS was marked or can delay until the xmt_ls_rsp() call is
998
+ * made.
999
+ * Note: if an RCV LS was successfully posted to the transport and the
1000
+ * targetport is then unregistered before xmt_ls_rsp() was called for
1001
+ * the lsrsp structure, the transport will still call xmt_ls_rsp()
1002
+ * afterward to cleanup the outstanding lsrsp structure. The LLDD should
1003
+ * noop the transmission of the rsp and call the lsrsp->done() routine
1004
+ * to allow the lsrsp structure to be released.
1005
+ */
8851006 int nvmet_fc_rcv_ls_req(struct nvmet_fc_target_port *tgtport,
886
- struct nvmefc_tgt_ls_req *lsreq,
1007
+ void *hosthandle,
1008
+ struct nvmefc_ls_rsp *rsp,
8871009 void *lsreqbuf, u32 lsreqbuf_len);
8881010
1011
+/*
1012
+ * Routine called by the LLDD whenever it has a logout or loss of
1013
+ * connectivity to a NVME-FC host port which there had been active
1014
+ * NVMe controllers for. The host port is indicated by the
1015
+ * hosthandle. The hosthandle is given to the nvmet-fc transport
1016
+ * when a NVME LS was received, typically to create a new association.
1017
+ * The nvmet-fc transport will cache the hostport value with the
1018
+ * association for use in LS requests for the association.
1019
+ * When the LLDD calls this routine, the nvmet-fc transport will
1020
+ * immediately terminate all associations that were created with
1021
+ * the hosthandle host port.
1022
+ * The LLDD, after calling this routine and having control returned,
1023
+ * must assume the transport may subsequently utilize hosthandle as
1024
+ * part of sending LS's to terminate the association. The LLDD
1025
+ * should reject the LS's if they are attempted.
1026
+ * Once the last association has terminated for the hosthandle host
1027
+ * port, the nvmet-fc transport will call the ops->host_release()
1028
+ * callback. As of the callback, the nvmet-fc transport will no
1029
+ * longer reference hosthandle.
1030
+ */
1031
+void nvmet_fc_invalidate_host(struct nvmet_fc_target_port *tgtport,
1032
+ void *hosthandle);
1033
+
1034
+/*
1035
+ * If nvmet_fc_rcv_fcp_req returns non-zero, the transport has not accepted
1036
+ * the FCP cmd. The lldd should ABTS-LS the cmd.
1037
+ */
8891038 int nvmet_fc_rcv_fcp_req(struct nvmet_fc_target_port *tgtport,
8901039 struct nvmefc_tgt_fcp_req *fcpreq,
8911040 void *cmdiubuf, u32 cmdiubuf_len);