| .. | .. | 
|---|
 | 1 | +/* SPDX-License-Identifier: GPL-2.0 */  | 
|---|
| 1 | 2 |  /* | 
|---|
| 2 | 3 |   * 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.  | 
|---|
| 12 | 4 |   */ | 
|---|
| 13 | 5 |   | 
|---|
| 14 | 6 |  #ifndef _NVME_FC_DRIVER_H | 
|---|
| 15 | 7 |  #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 | +  | 
|---|
| 16 | 128 |   | 
|---|
| 17 | 129 |   | 
|---|
| 18 | 130 |  /* | 
|---|
| .. | .. | 
|---|
| 22 | 134 |   * | 
|---|
| 23 | 135 |   * ****************************************************************** | 
|---|
| 24 | 136 |   */ | 
|---|
| 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  | 
|---|
| 32 | 137 |   | 
|---|
| 33 | 138 |   | 
|---|
| 34 | 139 |  /** | 
|---|
| .. | .. | 
|---|
| 54 | 159 |  	u32			port_id; | 
|---|
| 55 | 160 |  	u32			dev_loss_tmo; | 
|---|
| 56 | 161 |  }; | 
|---|
| 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 |  | -  | 
|---|
| 100 | 162 |   | 
|---|
| 101 | 163 |  enum nvmefc_fcp_datadir { | 
|---|
| 102 | 164 |  	NVMEFC_FCP_NODATA,	/* payload_length and sg_cnt will be zero */ | 
|---|
| .. | .. | 
|---|
| 349 | 411 |   *       indicating an FC transport Aborted status. | 
|---|
| 350 | 412 |   *       Entrypoint is Mandatory. | 
|---|
| 351 | 413 |   * | 
|---|
 | 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 | + *  | 
|---|
| 352 | 429 |   * @max_hw_queues:  indicates the maximum number of hw queues the LLDD | 
|---|
| 353 | 430 |   *       supports for cpu affinitization. | 
|---|
| 354 | 431 |   *       Value is Mandatory. Must be at least 1. | 
|---|
| .. | .. | 
|---|
| 383 | 460 |   * @lsrqst_priv_sz: The LLDD sets this field to the amount of additional | 
|---|
| 384 | 461 |   *       memory that it would like fc nvme layer to allocate on the LLDD's | 
|---|
| 385 | 462 |   *       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  | 
|---|
| 387 | 464 |   *       specified by the ls_request->private pointer. | 
|---|
| 388 | 465 |   *       Value is Mandatory. Allowed to be zero. | 
|---|
| 389 | 466 |   * | 
|---|
| .. | .. | 
|---|
| 403 | 480 |  				void **handle); | 
|---|
| 404 | 481 |  	void	(*delete_queue)(struct nvme_fc_local_port *, | 
|---|
| 405 | 482 |  				unsigned int qidx, void *handle); | 
|---|
| 406 |  | -	void	(*poll_queue)(struct nvme_fc_local_port *, void *handle);  | 
|---|
| 407 | 483 |  	int	(*ls_req)(struct nvme_fc_local_port *, | 
|---|
| 408 | 484 |  				struct nvme_fc_remote_port *, | 
|---|
| 409 | 485 |  				struct nvmefc_ls_req *); | 
|---|
| .. | .. | 
|---|
| 418 | 494 |  				struct nvme_fc_remote_port *, | 
|---|
| 419 | 495 |  				void *hw_queue_handle, | 
|---|
| 420 | 496 |  				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);  | 
|---|
| 421 | 500 |   | 
|---|
| 422 | 501 |  	u32	max_hw_queues; | 
|---|
| 423 | 502 |  	u16	max_sgl_segments; | 
|---|
| .. | .. | 
|---|
| 454 | 533 |  int nvme_fc_set_remoteport_devloss(struct nvme_fc_remote_port *remoteport, | 
|---|
| 455 | 534 |  			u32 dev_loss_tmo); | 
|---|
| 456 | 535 |   | 
|---|
 | 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 | +  | 
|---|
| 457 | 564 |   | 
|---|
| 458 | 565 |  /* | 
|---|
| 459 | 566 |   * ***************  LLDD FC-NVME Target/Subsystem API *************** | 
|---|
| .. | .. | 
|---|
| 482 | 589 |  	u32			port_id; | 
|---|
| 483 | 590 |  }; | 
|---|
| 484 | 591 |   | 
|---|
| 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 |  | -};  | 
|---|
| 534 | 592 |   | 
|---|
| 535 | 593 |  /* Operations that NVME-FC layer may request the LLDD to perform for FCP */ | 
|---|
| 536 | 594 |  enum { | 
|---|
| .. | .. | 
|---|
| 614 | 672 |   * Values set by the LLDD indicating completion status of the FCP operation. | 
|---|
| 615 | 673 |   * Must be set prior to calling the done() callback. | 
|---|
| 616 | 674 |   * @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  | 
|---|
| 618 | 676 |   *            be set to 0. Should equal transfer_length on success. | 
|---|
| 619 | 677 |   * @fcp_error: status of the FCP operation. Must be 0 on success; on failure | 
|---|
| 620 | 678 |   *            must be a NVME_SC_FC_xxxx value. | 
|---|
| .. | .. | 
|---|
| 648 | 706 |  		 * sends (the last) Read Data sequence followed by the RSP | 
|---|
| 649 | 707 |  		 * sequence in one LLDD operation. Errors during Data | 
|---|
| 650 | 708 |  		 * 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.  | 
|---|
| 667 | 709 |  		 */ | 
|---|
| 668 | 710 |  }; | 
|---|
| 669 | 711 |   | 
|---|
| .. | .. | 
|---|
| 722 | 764 |   *       Entrypoint is Mandatory. | 
|---|
| 723 | 765 |   * | 
|---|
| 724 | 766 |   * @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  | 
|---|
| 726 | 768 |   *       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  | 
|---|
| 728 | 770 |   *       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.  | 
|---|
| 736 | 780 |   *       Entrypoint is Mandatory. | 
|---|
| 737 | 781 |   * | 
|---|
| 738 | 782 |   * @fcp_op:  Called to perform a data transfer or transmit a response. | 
|---|
| .. | .. | 
|---|
| 822 | 866 |   *       nvmefc_tgt_fcp_req. | 
|---|
| 823 | 867 |   *       Entrypoint is Optional. | 
|---|
| 824 | 868 |   * | 
|---|
 | 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 | + *  | 
|---|
| 825 | 907 |   * @max_hw_queues:  indicates the maximum number of hw queues the LLDD | 
|---|
| 826 | 908 |   *       supports for cpu affinitization. | 
|---|
| 827 | 909 |   *       Value is Mandatory. Must be at least 1. | 
|---|
| .. | .. | 
|---|
| 850 | 932 |   *       area solely for the of the LLDD and its location is specified by | 
|---|
| 851 | 933 |   *       the targetport->private pointer. | 
|---|
| 852 | 934 |   *       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 | + *  | 
|---|
| 853 | 943 |   */ | 
|---|
| 854 | 944 |  struct nvmet_fc_target_template { | 
|---|
| 855 | 945 |  	void (*targetport_delete)(struct nvmet_fc_target_port *tgtport); | 
|---|
| 856 | 946 |  	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);  | 
|---|
| 858 | 948 |  	int (*fcp_op)(struct nvmet_fc_target_port *tgtport, | 
|---|
| 859 | 949 |  				struct nvmefc_tgt_fcp_req *fcpreq); | 
|---|
| 860 | 950 |  	void (*fcp_abort)(struct nvmet_fc_target_port *tgtport, | 
|---|
| .. | .. | 
|---|
| 863 | 953 |  				struct nvmefc_tgt_fcp_req *fcpreq); | 
|---|
| 864 | 954 |  	void (*defer_rcv)(struct nvmet_fc_target_port *tgtport, | 
|---|
| 865 | 955 |  				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);  | 
|---|
| 866 | 962 |   | 
|---|
| 867 | 963 |  	u32	max_hw_queues; | 
|---|
| 868 | 964 |  	u16	max_sgl_segments; | 
|---|
| .. | .. | 
|---|
| 871 | 967 |   | 
|---|
| 872 | 968 |  	u32	target_features; | 
|---|
| 873 | 969 |   | 
|---|
 | 970 | +	/* sizes of additional private data for data structures */  | 
|---|
| 874 | 971 |  	u32	target_priv_sz; | 
|---|
 | 972 | +	u32	lsrqst_priv_sz;  | 
|---|
| 875 | 973 |  }; | 
|---|
| 876 | 974 |   | 
|---|
| 877 | 975 |   | 
|---|
| .. | .. | 
|---|
| 882 | 980 |   | 
|---|
| 883 | 981 |  int nvmet_fc_unregister_targetport(struct nvmet_fc_target_port *tgtport); | 
|---|
| 884 | 982 |   | 
|---|
 | 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 | + */  | 
|---|
| 885 | 1006 |  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,  | 
|---|
| 887 | 1009 |  			void *lsreqbuf, u32 lsreqbuf_len); | 
|---|
| 888 | 1010 |   | 
|---|
 | 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 | + */  | 
|---|
| 889 | 1038 |  int nvmet_fc_rcv_fcp_req(struct nvmet_fc_target_port *tgtport, | 
|---|
| 890 | 1039 |  			struct nvmefc_tgt_fcp_req *fcpreq, | 
|---|
| 891 | 1040 |  			void *cmdiubuf, u32 cmdiubuf_len); | 
|---|