hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
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
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
 *
 *            Linux MegaRAID device driver
 *
 * Copyright (c) 2003-2004  LSI Logic Corporation.
 *
 * FILE        : megaraid_mbox.h
 */
 
#ifndef _MEGARAID_H_
#define _MEGARAID_H_
 
 
#include "mega_common.h"
#include "mbox_defs.h"
#include "megaraid_ioctl.h"
 
 
#define MEGARAID_VERSION    "2.20.5.1"
#define MEGARAID_EXT_VERSION    "(Release Date: Thu Nov 16 15:32:35 EST 2006)"
 
 
/*
 * Define some PCI values here until they are put in the kernel
 */
#define PCI_DEVICE_ID_PERC4_DI_DISCOVERY        0x000E
#define PCI_SUBSYS_ID_PERC4_DI_DISCOVERY        0x0123
 
#define PCI_DEVICE_ID_PERC4_SC                0x1960
#define PCI_SUBSYS_ID_PERC4_SC                0x0520
 
#define PCI_DEVICE_ID_PERC4_DC                0x1960
#define PCI_SUBSYS_ID_PERC4_DC                0x0518
 
#define PCI_DEVICE_ID_VERDE                0x0407
 
#define PCI_DEVICE_ID_PERC4_DI_EVERGLADES        0x000F
#define PCI_SUBSYS_ID_PERC4_DI_EVERGLADES        0x014A
 
#define PCI_DEVICE_ID_PERC4E_SI_BIGBEND            0x0013
#define PCI_SUBSYS_ID_PERC4E_SI_BIGBEND            0x016c
 
#define PCI_DEVICE_ID_PERC4E_DI_KOBUK            0x0013
#define PCI_SUBSYS_ID_PERC4E_DI_KOBUK            0x016d
 
#define PCI_DEVICE_ID_PERC4E_DI_CORVETTE        0x0013
#define PCI_SUBSYS_ID_PERC4E_DI_CORVETTE        0x016e
 
#define PCI_DEVICE_ID_PERC4E_DI_EXPEDITION        0x0013
#define PCI_SUBSYS_ID_PERC4E_DI_EXPEDITION        0x016f
 
#define PCI_DEVICE_ID_PERC4E_DI_GUADALUPE        0x0013
#define PCI_SUBSYS_ID_PERC4E_DI_GUADALUPE        0x0170
 
#define PCI_DEVICE_ID_DOBSON                0x0408
 
#define PCI_DEVICE_ID_MEGARAID_SCSI_320_0        0x1960
#define PCI_SUBSYS_ID_MEGARAID_SCSI_320_0        0xA520
 
#define PCI_DEVICE_ID_MEGARAID_SCSI_320_1        0x1960
#define PCI_SUBSYS_ID_MEGARAID_SCSI_320_1        0x0520
 
#define PCI_DEVICE_ID_MEGARAID_SCSI_320_2        0x1960
#define PCI_SUBSYS_ID_MEGARAID_SCSI_320_2        0x0518
 
#define PCI_DEVICE_ID_MEGARAID_I4_133_RAID        0x1960
#define PCI_SUBSYS_ID_MEGARAID_I4_133_RAID        0x0522
 
#define PCI_DEVICE_ID_MEGARAID_SATA_150_4        0x1960
#define PCI_SUBSYS_ID_MEGARAID_SATA_150_4        0x4523
 
#define PCI_DEVICE_ID_MEGARAID_SATA_150_6        0x1960
#define PCI_SUBSYS_ID_MEGARAID_SATA_150_6        0x0523
 
#define PCI_DEVICE_ID_LINDSAY                0x0409
 
#define PCI_DEVICE_ID_INTEL_RAID_SRCS16            0x1960
#define PCI_SUBSYS_ID_INTEL_RAID_SRCS16            0x0523
 
#define PCI_DEVICE_ID_INTEL_RAID_SRCU41L_LAKE_SHETEK    0x1960
#define PCI_SUBSYS_ID_INTEL_RAID_SRCU41L_LAKE_SHETEK    0x0520
 
#define PCI_SUBSYS_ID_PERC3_QC                0x0471
#define PCI_SUBSYS_ID_PERC3_DC                0x0493
#define PCI_SUBSYS_ID_PERC3_SC                0x0475
#define PCI_SUBSYS_ID_CERC_ATA100_4CH            0x0511
 
 
#define MBOX_MAX_SCSI_CMDS    128    // number of cmds reserved for kernel
#define MBOX_MAX_USER_CMDS    32    // number of cmds for applications
#define MBOX_DEF_CMD_PER_LUN    64    // default commands per lun
#define MBOX_DEFAULT_SG_SIZE    26    // default sg size supported by all fw
#define MBOX_MAX_SG_SIZE    32    // maximum scatter-gather list size
#define MBOX_MAX_SECTORS    128    // maximum sectors per IO
#define MBOX_TIMEOUT        30    // timeout value for internal cmds
#define MBOX_BUSY_WAIT        10    // max usec to wait for busy mailbox
#define MBOX_RESET_WAIT        180    // wait these many seconds in reset
#define MBOX_RESET_EXT_WAIT    120    // extended wait reset
#define MBOX_SYNC_WAIT_CNT    0xFFFF    // wait loop index for synchronous mode
 
#define MBOX_SYNC_DELAY_200    200    // 200 micro-seconds
 
/*
 * maximum transfer that can happen through the firmware commands issued
 * internnaly from the driver.
 */
#define MBOX_IBUF_SIZE        4096
 
 
/**
 * mbox_ccb_t - command control block specific to mailbox based controllers
 * @raw_mbox        : raw mailbox pointer
 * @mbox        : mailbox
 * @mbox64        : extended mailbox
 * @mbox_dma_h        : mailbox dma address
 * @sgl64        : 64-bit scatter-gather list
 * @sgl32        : 32-bit scatter-gather list
 * @sgl_dma_h        : dma handle for the scatter-gather list
 * @pthru        : passthru structure
 * @pthru_dma_h        : dma handle for the passthru structure
 * @epthru        : extended passthru structure
 * @epthru_dma_h    : dma handle for extended passthru structure
 * @buf_dma_h        : dma handle for buffers w/o sg list
 *
 * command control block specific to the mailbox based controllers
 */
typedef struct {
   uint8_t            *raw_mbox;
   mbox_t            *mbox;
   mbox64_t        *mbox64;
   dma_addr_t        mbox_dma_h;
   mbox_sgl64        *sgl64;
   mbox_sgl32        *sgl32;
   dma_addr_t        sgl_dma_h;
   mraid_passthru_t    *pthru;
   dma_addr_t        pthru_dma_h;
   mraid_epassthru_t    *epthru;
   dma_addr_t        epthru_dma_h;
   dma_addr_t        buf_dma_h;
} mbox_ccb_t;
 
 
/**
 * mraid_device_t - adapter soft state structure for mailbox controllers
 * @una_mbox64            : 64-bit mbox - unaligned
 * @una_mbox64_dma        : mbox dma addr - unaligned
 * @mbox            : 32-bit mbox - aligned
 * @mbox64            : 64-bit mbox - aligned
 * @mbox_dma            : mbox dma addr - aligned
 * @mailbox_lock        : exclusion lock for the mailbox
 * @baseport            : base port of hba memory
 * @baseaddr            : mapped addr of hba memory
 * @mbox_pool            : pool of mailboxes
 * @mbox_pool_handle        : handle for the mailbox pool memory
 * @epthru_pool            : a pool for extended passthru commands
 * @epthru_pool_handle        : handle to the pool above
 * @sg_pool            : pool of scatter-gather lists for this driver
 * @sg_pool_handle        : handle to the pool above
 * @ccb_list            : list of our command control blocks
 * @uccb_list            : list of cmd control blocks for mgmt module
 * @umbox64            : array of mailbox for user commands (cmm)
 * @pdrv_state            : array for state of each physical drive.
 * @last_disp            : flag used to show device scanning
 * @hw_error            : set if FW not responding
 * @fast_load            : If set, skip physical device scanning
 * @channel_class        : channel class, RAID or SCSI
 * @sysfs_mtx            : mutex to serialize access to sysfs res.
 * @sysfs_uioc            : management packet to issue FW calls from sysfs
 * @sysfs_mbox64        : mailbox packet to issue FW calls from sysfs
 * @sysfs_buffer        : data buffer for FW commands issued from sysfs
 * @sysfs_buffer_dma        : DMA buffer for FW commands issued from sysfs
 * @sysfs_wait_q        : wait queue for sysfs operations
 * @random_del_supported    : set if the random deletion is supported
 * @curr_ldmap            : current LDID map
 *
 * Initialization structure for mailbox controllers: memory based and IO based
 * All the fields in this structure are LLD specific and may be discovered at
 * init() or start() time.
 *
 * NOTE: The fields of this structures are placed to minimize cache misses
 */
#define MAX_LD_EXTENDED64    64
typedef struct {
   mbox64_t            *una_mbox64;
   dma_addr_t            una_mbox64_dma;
   mbox_t                *mbox;
   mbox64_t            *mbox64;
   dma_addr_t            mbox_dma;
   spinlock_t            mailbox_lock;
   unsigned long            baseport;
   void __iomem *            baseaddr;
   struct mraid_pci_blk        mbox_pool[MBOX_MAX_SCSI_CMDS];
   struct dma_pool            *mbox_pool_handle;
   struct mraid_pci_blk        epthru_pool[MBOX_MAX_SCSI_CMDS];
   struct dma_pool            *epthru_pool_handle;
   struct mraid_pci_blk        sg_pool[MBOX_MAX_SCSI_CMDS];
   struct dma_pool            *sg_pool_handle;
   mbox_ccb_t            ccb_list[MBOX_MAX_SCSI_CMDS];
   mbox_ccb_t            uccb_list[MBOX_MAX_USER_CMDS];
   mbox64_t            umbox64[MBOX_MAX_USER_CMDS];
 
   uint8_t                pdrv_state[MBOX_MAX_PHYSICAL_DRIVES];
   uint32_t            last_disp;
   int                hw_error;
   int                fast_load;
   uint8_t                channel_class;
   struct mutex            sysfs_mtx;
   uioc_t                *sysfs_uioc;
   mbox64_t            *sysfs_mbox64;
   caddr_t                sysfs_buffer;
   dma_addr_t            sysfs_buffer_dma;
   wait_queue_head_t        sysfs_wait_q;
   int                random_del_supported;
   uint16_t            curr_ldmap[MAX_LD_EXTENDED64];
} mraid_device_t;
 
// route to raid device from adapter
#define ADAP2RAIDDEV(adp)    ((mraid_device_t *)((adp)->raid_device))
 
#define MAILBOX_LOCK(rdev)    (&(rdev)->mailbox_lock)
 
// Find out if this channel is a RAID or SCSI
#define IS_RAID_CH(rdev, ch)    (((rdev)->channel_class >> (ch)) & 0x01)
 
 
#define RDINDOOR(rdev)        readl((rdev)->baseaddr + 0x20)
#define RDOUTDOOR(rdev)        readl((rdev)->baseaddr + 0x2C)
#define WRINDOOR(rdev, value)    writel(value, (rdev)->baseaddr + 0x20)
#define WROUTDOOR(rdev, value)    writel(value, (rdev)->baseaddr + 0x2C)
 
#endif // _MEGARAID_H_
 
// vim: set ts=8 sw=8 tw=78: