1  /*******************************************************************
2   * This file is part of the Emulex Linux Device Driver for         *
3   * Fibre Channel Host Bus Adapters.                                *
4   * Copyright (C) 2017-2024 Broadcom. All Rights Reserved. The term *
5   * “Broadcom” refers to Broadcom Inc and/or its subsidiaries.  *
6   * Copyright (C) 2004-2016 Emulex.  All rights reserved.           *
7   * EMULEX and SLI are trademarks of Emulex.                        *
8   * www.broadcom.com                                                *
9   *                                                                 *
10   * This program is free software; you can redistribute it and/or   *
11   * modify it under the terms of version 2 of the GNU General       *
12   * Public License as published by the Free Software Foundation.    *
13   * This program is distributed in the hope that it will be useful. *
14   * ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND          *
15   * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,  *
16   * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT, ARE      *
17   * DISCLAIMED, EXCEPT TO THE EXTENT THAT SUCH DISCLAIMERS ARE HELD *
18   * TO BE LEGALLY INVALID.  See the GNU General Public License for  *
19   * more details, a copy of which can be found in the file COPYING  *
20   * included with this package.                                     *
21   *******************************************************************/
22  
23  #include <asm/byteorder.h>
24  
25  struct lpfc_hba;
26  #define LPFC_FCP_CDB_LEN 16
27  #define LPFC_FCP_CDB_LEN_32 32
28  
29  #define list_remove_head(list, entry, type, member)		\
30  	do {							\
31  	entry = NULL;						\
32  	if (!list_empty(list)) {				\
33  		entry = list_entry((list)->next, type, member);	\
34  		list_del_init(&entry->member);			\
35  	}							\
36  	} while(0)
37  
38  #define list_get_first(list, type, member)			\
39  	(list_empty(list)) ? NULL :				\
40  	list_entry((list)->next, type, member)
41  
42  /* per-port data that is allocated in the FC transport for us */
43  struct lpfc_rport_data {
44  	struct lpfc_nodelist *pnode;	/* Pointer to the node structure. */
45  };
46  
47  struct lpfc_device_id {
48  	struct lpfc_name vport_wwpn;
49  	struct lpfc_name target_wwpn;
50  	uint64_t lun;
51  };
52  
53  struct lpfc_device_data {
54  	struct list_head listentry;
55  	struct lpfc_rport_data *rport_data;
56  	struct lpfc_device_id device_id;
57  	uint8_t priority;
58  	bool oas_enabled;
59  	bool available;
60  };
61  
62  struct fcp_rsp {
63  	uint32_t rspRsvd1;	/* FC Word 0, byte 0:3 */
64  	uint32_t rspRsvd2;	/* FC Word 1, byte 0:3 */
65  
66  	uint8_t rspStatus0;	/* FCP_STATUS byte 0 (reserved) */
67  	uint8_t rspStatus1;	/* FCP_STATUS byte 1 (reserved) */
68  	uint8_t rspStatus2;	/* FCP_STATUS byte 2 field validity */
69  #define RSP_LEN_VALID  0x01	/* bit 0 */
70  #define SNS_LEN_VALID  0x02	/* bit 1 */
71  #define RESID_OVER     0x04	/* bit 2 */
72  #define RESID_UNDER    0x08	/* bit 3 */
73  	uint8_t rspStatus3;	/* FCP_STATUS byte 3 SCSI status byte */
74  
75  	uint32_t rspResId;	/* Residual xfer if residual count field set in
76  				   fcpStatus2 */
77  	/* Received in Big Endian format */
78  	uint32_t rspSnsLen;	/* Length of sense data in fcpSnsInfo */
79  	/* Received in Big Endian format */
80  	uint32_t rspRspLen;	/* Length of FCP response data in fcpRspInfo */
81  	/* Received in Big Endian format */
82  
83  	uint8_t rspInfo0;	/* FCP_RSP_INFO byte 0 (reserved) */
84  	uint8_t rspInfo1;	/* FCP_RSP_INFO byte 1 (reserved) */
85  	uint8_t rspInfo2;	/* FCP_RSP_INFO byte 2 (reserved) */
86  	uint8_t rspInfo3;	/* FCP_RSP_INFO RSP_CODE byte 3 */
87  
88  #define RSP_NO_FAILURE       0x00
89  #define RSP_DATA_BURST_ERR   0x01
90  #define RSP_CMD_FIELD_ERR    0x02
91  #define RSP_RO_MISMATCH_ERR  0x03
92  #define RSP_TM_NOT_SUPPORTED 0x04	/* Task mgmt function not supported */
93  #define RSP_TM_NOT_COMPLETED 0x05	/* Task mgmt function not performed */
94  #define RSP_TM_INVALID_LU    0x09	/* Task mgmt function to invalid LU */
95  
96  	uint32_t rspInfoRsvd;	/* FCP_RSP_INFO bytes 4-7 (reserved) */
97  
98  	uint8_t rspSnsInfo[128];
99  #define SNS_ILLEGAL_REQ 0x05	/* sense key is byte 3 ([2]) */
100  #define SNSCOD_BADCMD 0x20	/* sense code is byte 13 ([12]) */
101  };
102  
103  #define  SIMPLE_Q        0x00
104  #define  HEAD_OF_Q       0x01
105  #define  ORDERED_Q       0x02
106  #define  ACA_Q           0x04
107  #define  UNTAGGED        0x05
108  #define  FCP_ABORT_TASK_SET  0x02	/* Bit 1 */
109  #define  FCP_CLEAR_TASK_SET  0x04	/* bit 2 */
110  #define  FCP_BUS_RESET       0x08	/* bit 3 */
111  #define  FCP_LUN_RESET       0x10	/* bit 4 */
112  #define  FCP_TARGET_RESET    0x20	/* bit 5 */
113  #define  FCP_CLEAR_ACA       0x40	/* bit 6 */
114  #define  FCP_TERMINATE_TASK  0x80	/* bit 7 */
115  #define  WRITE_DATA      0x01	/* Bit 0 */
116  #define  READ_DATA       0x02	/* Bit 1 */
117  
118  struct fcp_cmnd {
119  	struct scsi_lun  fcp_lun;
120  
121  	uint8_t fcpCntl0;	/* FCP_CNTL byte 0 (reserved) */
122  	uint8_t fcpCntl1;	/* FCP_CNTL byte 1 task codes */
123  	uint8_t fcpCntl2;	/* FCP_CTL byte 2 task management codes */
124  	uint8_t fcpCntl3;
125  
126  	uint8_t fcpCdb[LPFC_FCP_CDB_LEN]; /* SRB cdb field is copied here */
127  	__be32 fcpDl;		/* Total transfer length */
128  
129  };
130  struct fcp_cmnd32 {
131  	struct scsi_lun  fcp_lun;
132  
133  	uint8_t fcpCntl0;	/* FCP_CNTL byte 0 (reserved) */
134  	uint8_t fcpCntl1;	/* FCP_CNTL byte 1 task codes */
135  	uint8_t fcpCntl2;	/* FCP_CTL byte 2 task management codes */
136  	uint8_t fcpCntl3;
137  
138  	uint8_t fcpCdb[LPFC_FCP_CDB_LEN_32]; /* SRB cdb field is copied here */
139  	__be32 fcpDl;		/* Total transfer length */
140  
141  };
142  
143  #define LPFC_SCSI_DMA_EXT_SIZE	264
144  #define LPFC_BPL_SIZE		1024
145  #define MDAC_DIRECT_CMD		0x22
146  
147  #define FIND_FIRST_OAS_LUN	0
148  #define NO_MORE_OAS_LUN		-1
149  #define NOT_OAS_ENABLED_LUN	NO_MORE_OAS_LUN
150  
151  #ifndef FC_PORTSPEED_128GBIT
152  #define FC_PORTSPEED_128GBIT	0x2000
153  #endif
154  
155  #ifndef FC_PORTSPEED_256GBIT
156  #define FC_PORTSPEED_256GBIT	0x4000
157  #endif
158  
159  #define TXRDY_PAYLOAD_LEN	12
160  
161  /* For sysfs/debugfs tmp string max len */
162  #define LPFC_MAX_SCSI_INFO_TMP_LEN	79
163  
164