1 | /* SPDX-License-Identifier: GPL-2.0-or-later */ |
2 | /* |
3 | * |
4 | * Linux MegaRAID device driver |
5 | * |
6 | * Copyright (c) 2003-2004 LSI Logic Corporation. |
7 | * |
8 | * FILE : mega_common.h |
9 | * |
10 | * Libaray of common routine used by all low-level megaraid drivers |
11 | */ |
12 | |
13 | #ifndef _MEGA_COMMON_H_ |
14 | #define _MEGA_COMMON_H_ |
15 | |
16 | #include <linux/kernel.h> |
17 | #include <linux/types.h> |
18 | #include <linux/pci.h> |
19 | #include <linux/spinlock.h> |
20 | #include <linux/mutex.h> |
21 | #include <linux/interrupt.h> |
22 | #include <linux/delay.h> |
23 | #include <linux/blkdev.h> |
24 | #include <linux/list.h> |
25 | #include <linux/moduleparam.h> |
26 | #include <linux/dma-mapping.h> |
27 | #include <scsi/scsi.h> |
28 | #include <scsi/scsi_cmnd.h> |
29 | #include <scsi/scsi_device.h> |
30 | #include <scsi/scsi_host.h> |
31 | |
32 | |
33 | #define LSI_MAX_CHANNELS 16 |
34 | #define LSI_MAX_LOGICAL_DRIVES_64LD (64+1) |
35 | |
36 | #define HBA_SIGNATURE_64_BIT 0x299 |
37 | #define PCI_CONF_AMISIG64 0xa4 |
38 | |
39 | #define MEGA_SCSI_INQ_EVPD 1 |
40 | #define MEGA_INVALID_FIELD_IN_CDB 0x24 |
41 | |
42 | |
43 | /** |
44 | * scb_t - scsi command control block |
45 | * @ccb : command control block for individual driver |
46 | * @list : list of control blocks |
47 | * @gp : general purpose field for LLDs |
48 | * @sno : all SCBs have a serial number |
49 | * @scp : associated scsi command |
50 | * @state : current state of scb |
51 | * @dma_dir : direction of data transfer |
52 | * @dma_type : transfer with sg list, buffer, or no data transfer |
53 | * @dev_channel : actual channel on the device |
54 | * @dev_target : actual target on the device |
55 | * @status : completion status |
56 | * |
57 | * This is our central data structure to issue commands the each driver. |
58 | * Driver specific data structures are maintained in the ccb field. |
59 | * scb provides a field 'gp', which can be used by LLD for its own purposes |
60 | * |
61 | * dev_channel and dev_target must be initialized with the actual channel and |
62 | * target on the controller. |
63 | */ |
64 | typedef struct { |
65 | caddr_t ccb; |
66 | struct list_head list; |
67 | unsigned long gp; |
68 | unsigned int sno; |
69 | struct scsi_cmnd *scp; |
70 | uint32_t state; |
71 | uint32_t dma_direction; |
72 | uint32_t dma_type; |
73 | uint16_t dev_channel; |
74 | uint16_t dev_target; |
75 | uint32_t status; |
76 | } scb_t; |
77 | |
78 | /* |
79 | * SCB states as it transitions from one state to another |
80 | */ |
81 | #define SCB_FREE 0x0000 /* on the free list */ |
82 | #define SCB_ACTIVE 0x0001 /* off the free list */ |
83 | #define SCB_PENDQ 0x0002 /* on the pending queue */ |
84 | #define SCB_ISSUED 0x0004 /* issued - owner f/w */ |
85 | #define SCB_ABORT 0x0008 /* Got an abort for this one */ |
86 | #define SCB_RESET 0x0010 /* Got a reset for this one */ |
87 | |
88 | /* |
89 | * DMA types for scb |
90 | */ |
91 | #define MRAID_DMA_NONE 0x0000 /* no data transfer for this command */ |
92 | #define MRAID_DMA_WSG 0x0001 /* data transfer using a sg list */ |
93 | #define MRAID_DMA_WBUF 0x0002 /* data transfer using a contiguous buffer */ |
94 | |
95 | |
96 | /** |
97 | * struct adapter_t - driver's initialization structure |
98 | * @aram dpc_h : tasklet handle |
99 | * @pdev : pci configuration pointer for kernel |
100 | * @host : pointer to host structure of mid-layer |
101 | * @lock : synchronization lock for mid-layer and driver |
102 | * @quiescent : driver is quiescent for now. |
103 | * @outstanding_cmds : number of commands pending in the driver |
104 | * @kscb_list : pointer to the bulk of SCBs pointers for IO |
105 | * @kscb_pool : pool of free scbs for IO |
106 | * @kscb_pool_lock : lock for pool of free scbs |
107 | * @pend_list : pending commands list |
108 | * @pend_list_lock : exclusion lock for pending commands list |
109 | * @completed_list : list of completed commands |
110 | * @completed_list_lock : exclusion lock for list of completed commands |
111 | * @sglen : max sg elements supported |
112 | * @device_ids : to convert kernel device addr to our devices. |
113 | * @raid_device : raid adapter specific pointer |
114 | * @max_channel : maximum channel number supported - inclusive |
115 | * @max_target : max target supported - inclusive |
116 | * @max_lun : max lun supported - inclusive |
117 | * @unique_id : unique identifier for each adapter |
118 | * @irq : IRQ for this adapter |
119 | * @ito : internal timeout value, (-1) means no timeout |
120 | * @ibuf : buffer to issue internal commands |
121 | * @ibuf_dma_h : dma handle for the above buffer |
122 | * @uscb_list : SCB pointers for user cmds, common mgmt module |
123 | * @uscb_pool : pool of SCBs for user commands |
124 | * @uscb_pool_lock : exclusion lock for these SCBs |
125 | * @max_cmds : max outstanding commands |
126 | * @fw_version : firmware version |
127 | * @bios_version : bios version |
128 | * @max_cdb_sz : biggest CDB size supported. |
129 | * @ha : is high availability present - clustering |
130 | * @init_id : initiator ID, the default value should be 7 |
131 | * @max_sectors : max sectors per request |
132 | * @cmd_per_lun : max outstanding commands per LUN |
133 | * @being_detached : set when unloading, no more mgmt calls |
134 | * |
135 | * |
136 | * mraid_setup_device_map() can be called anytime after the device map is |
137 | * available and MRAID_GET_DEVICE_MAP() can be called whenever the mapping is |
138 | * required, usually from LLD's queue entry point. The formar API sets up the |
139 | * MRAID_IS_LOGICAL(adapter_t *, struct scsi_cmnd *) to find out if the |
140 | * device in question is a logical drive. |
141 | * |
142 | * quiescent flag should be set by the driver if it is not accepting more |
143 | * commands |
144 | * |
145 | * NOTE: The fields of this structures are placed to minimize cache misses |
146 | */ |
147 | |
148 | // amount of space required to store the bios and firmware version strings |
149 | #define VERSION_SIZE 16 |
150 | |
151 | typedef struct { |
152 | struct tasklet_struct dpc_h; |
153 | struct pci_dev *pdev; |
154 | struct Scsi_Host *host; |
155 | spinlock_t lock; |
156 | uint8_t quiescent; |
157 | int outstanding_cmds; |
158 | scb_t *kscb_list; |
159 | struct list_head kscb_pool; |
160 | spinlock_t kscb_pool_lock; |
161 | struct list_head pend_list; |
162 | spinlock_t pend_list_lock; |
163 | struct list_head completed_list; |
164 | spinlock_t completed_list_lock; |
165 | uint16_t sglen; |
166 | int device_ids[LSI_MAX_CHANNELS] |
167 | [LSI_MAX_LOGICAL_DRIVES_64LD]; |
168 | caddr_t raid_device; |
169 | uint8_t max_channel; |
170 | uint16_t max_target; |
171 | uint8_t max_lun; |
172 | |
173 | uint32_t unique_id; |
174 | int irq; |
175 | uint8_t ito; |
176 | caddr_t ibuf; |
177 | dma_addr_t ibuf_dma_h; |
178 | scb_t *uscb_list; |
179 | struct list_head uscb_pool; |
180 | spinlock_t uscb_pool_lock; |
181 | int max_cmds; |
182 | uint8_t fw_version[VERSION_SIZE]; |
183 | uint8_t bios_version[VERSION_SIZE]; |
184 | uint8_t max_cdb_sz; |
185 | uint8_t ha; |
186 | uint16_t init_id; |
187 | uint16_t max_sectors; |
188 | uint16_t cmd_per_lun; |
189 | atomic_t being_detached; |
190 | } adapter_t; |
191 | |
192 | #define SCSI_FREE_LIST_LOCK(adapter) (&adapter->kscb_pool_lock) |
193 | #define USER_FREE_LIST_LOCK(adapter) (&adapter->uscb_pool_lock) |
194 | #define PENDING_LIST_LOCK(adapter) (&adapter->pend_list_lock) |
195 | #define COMPLETED_LIST_LOCK(adapter) (&adapter->completed_list_lock) |
196 | |
197 | |
198 | // conversion from scsi command |
199 | #define SCP2HOST(scp) (scp)->device->host // to host |
200 | #define SCP2HOSTDATA(scp) SCP2HOST(scp)->hostdata // to soft state |
201 | #define SCP2CHANNEL(scp) (scp)->device->channel // to channel |
202 | #define SCP2TARGET(scp) (scp)->device->id // to target |
203 | #define SCP2LUN(scp) (u32)(scp)->device->lun // to LUN |
204 | |
205 | // generic macro to convert scsi command and host to controller's soft state |
206 | #define SCSIHOST2ADAP(host) (((caddr_t *)(host->hostdata))[0]) |
207 | #define SCP2ADAPTER(scp) (adapter_t *)SCSIHOST2ADAP(SCP2HOST(scp)) |
208 | |
209 | |
210 | #define MRAID_IS_LOGICAL(adp, scp) \ |
211 | (SCP2CHANNEL(scp) == (adp)->max_channel) ? 1 : 0 |
212 | |
213 | #define MRAID_IS_LOGICAL_SDEV(adp, sdev) \ |
214 | (sdev->channel == (adp)->max_channel) ? 1 : 0 |
215 | |
216 | /** |
217 | * MRAID_GET_DEVICE_MAP - device ids |
218 | * @adp : adapter's soft state |
219 | * @scp : mid-layer scsi command pointer |
220 | * @p_chan : physical channel on the controller |
221 | * @target : target id of the device or logical drive number |
222 | * @islogical : set if the command is for the logical drive |
223 | * |
224 | * Macro to retrieve information about device class, logical or physical and |
225 | * the corresponding physical channel and target or logical drive number |
226 | */ |
227 | #define MRAID_GET_DEVICE_MAP(adp, scp, p_chan, target, islogical) \ |
228 | /* \ |
229 | * Is the request coming for the virtual channel \ |
230 | */ \ |
231 | islogical = MRAID_IS_LOGICAL(adp, scp); \ |
232 | \ |
233 | /* \ |
234 | * Get an index into our table of drive ids mapping \ |
235 | */ \ |
236 | if (islogical) { \ |
237 | p_chan = 0xFF; \ |
238 | target = \ |
239 | (adp)->device_ids[(adp)->max_channel][SCP2TARGET(scp)]; \ |
240 | } \ |
241 | else { \ |
242 | p_chan = ((adp)->device_ids[SCP2CHANNEL(scp)] \ |
243 | [SCP2TARGET(scp)] >> 8) & 0xFF; \ |
244 | target = ((adp)->device_ids[SCP2CHANNEL(scp)] \ |
245 | [SCP2TARGET(scp)] & 0xFF); \ |
246 | } |
247 | |
248 | /* |
249 | * ### Helper routines ### |
250 | */ |
251 | #define LSI_DBGLVL mraid_debug_level // each LLD must define a global |
252 | // mraid_debug_level |
253 | |
254 | #ifdef DEBUG |
255 | #if defined (_ASSERT_PANIC) |
256 | #define ASSERT_ACTION panic |
257 | #else |
258 | #define ASSERT_ACTION printk |
259 | #endif |
260 | |
261 | #define ASSERT(expression) \ |
262 | if (!(expression)) { \ |
263 | ASSERT_ACTION("assertion failed:(%s), file: %s, line: %d:%s\n", \ |
264 | #expression, __FILE__, __LINE__, __func__); \ |
265 | } |
266 | #else |
267 | #define ASSERT(expression) |
268 | #endif |
269 | |
270 | /** |
271 | * struct mraid_pci_blk - structure holds DMA memory block info |
272 | * @vaddr : virtual address to a memory block |
273 | * @dma_addr : DMA handle to a memory block |
274 | * |
275 | * This structure is filled up for the caller. It is the responsibilty of the |
276 | * caller to allocate this array big enough to store addresses for all |
277 | * requested elements |
278 | */ |
279 | struct mraid_pci_blk { |
280 | caddr_t vaddr; |
281 | dma_addr_t dma_addr; |
282 | }; |
283 | |
284 | #endif // _MEGA_COMMON_H_ |
285 | |