1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * Filename: rsxx_priv.h
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * Authors: Joshua Morris <josh.h.morris@us.ibm.com>
6*4882a593Smuzhiyun * Philip Kelleher <pjk1939@linux.vnet.ibm.com>
7*4882a593Smuzhiyun *
8*4882a593Smuzhiyun * (C) Copyright 2013 IBM Corporation
9*4882a593Smuzhiyun */
10*4882a593Smuzhiyun
11*4882a593Smuzhiyun #ifndef __RSXX_PRIV_H__
12*4882a593Smuzhiyun #define __RSXX_PRIV_H__
13*4882a593Smuzhiyun
14*4882a593Smuzhiyun #include <linux/version.h>
15*4882a593Smuzhiyun #include <linux/semaphore.h>
16*4882a593Smuzhiyun
17*4882a593Smuzhiyun #include <linux/fs.h>
18*4882a593Smuzhiyun #include <linux/interrupt.h>
19*4882a593Smuzhiyun #include <linux/mutex.h>
20*4882a593Smuzhiyun #include <linux/pci.h>
21*4882a593Smuzhiyun #include <linux/spinlock.h>
22*4882a593Smuzhiyun #include <linux/sysfs.h>
23*4882a593Smuzhiyun #include <linux/workqueue.h>
24*4882a593Smuzhiyun #include <linux/bio.h>
25*4882a593Smuzhiyun #include <linux/vmalloc.h>
26*4882a593Smuzhiyun #include <linux/timer.h>
27*4882a593Smuzhiyun #include <linux/ioctl.h>
28*4882a593Smuzhiyun #include <linux/delay.h>
29*4882a593Smuzhiyun
30*4882a593Smuzhiyun #include "rsxx.h"
31*4882a593Smuzhiyun #include "rsxx_cfg.h"
32*4882a593Smuzhiyun
33*4882a593Smuzhiyun struct proc_cmd;
34*4882a593Smuzhiyun
35*4882a593Smuzhiyun #define PCI_DEVICE_ID_FS70_FLASH 0x04A9
36*4882a593Smuzhiyun #define PCI_DEVICE_ID_FS80_FLASH 0x04AA
37*4882a593Smuzhiyun
38*4882a593Smuzhiyun #define RS70_PCI_REV_SUPPORTED 4
39*4882a593Smuzhiyun
40*4882a593Smuzhiyun #define DRIVER_NAME "rsxx"
41*4882a593Smuzhiyun #define DRIVER_VERSION "4.0.3.2516"
42*4882a593Smuzhiyun
43*4882a593Smuzhiyun /* Block size is 4096 */
44*4882a593Smuzhiyun #define RSXX_HW_BLK_SHIFT 12
45*4882a593Smuzhiyun #define RSXX_HW_BLK_SIZE (1 << RSXX_HW_BLK_SHIFT)
46*4882a593Smuzhiyun #define RSXX_HW_BLK_MASK (RSXX_HW_BLK_SIZE - 1)
47*4882a593Smuzhiyun
48*4882a593Smuzhiyun #define MAX_CREG_DATA8 32
49*4882a593Smuzhiyun #define LOG_BUF_SIZE8 128
50*4882a593Smuzhiyun
51*4882a593Smuzhiyun #define RSXX_MAX_OUTSTANDING_CMDS 255
52*4882a593Smuzhiyun #define RSXX_CS_IDX_MASK 0xff
53*4882a593Smuzhiyun
54*4882a593Smuzhiyun #define STATUS_BUFFER_SIZE8 4096
55*4882a593Smuzhiyun #define COMMAND_BUFFER_SIZE8 4096
56*4882a593Smuzhiyun
57*4882a593Smuzhiyun #define RSXX_MAX_TARGETS 8
58*4882a593Smuzhiyun
59*4882a593Smuzhiyun struct dma_tracker_list;
60*4882a593Smuzhiyun
61*4882a593Smuzhiyun /* DMA Command/Status Buffer structure */
62*4882a593Smuzhiyun struct rsxx_cs_buffer {
63*4882a593Smuzhiyun dma_addr_t dma_addr;
64*4882a593Smuzhiyun void *buf;
65*4882a593Smuzhiyun u32 idx;
66*4882a593Smuzhiyun };
67*4882a593Smuzhiyun
68*4882a593Smuzhiyun struct rsxx_dma_stats {
69*4882a593Smuzhiyun u32 crc_errors;
70*4882a593Smuzhiyun u32 hard_errors;
71*4882a593Smuzhiyun u32 soft_errors;
72*4882a593Smuzhiyun u32 writes_issued;
73*4882a593Smuzhiyun u32 writes_failed;
74*4882a593Smuzhiyun u32 reads_issued;
75*4882a593Smuzhiyun u32 reads_failed;
76*4882a593Smuzhiyun u32 reads_retried;
77*4882a593Smuzhiyun u32 discards_issued;
78*4882a593Smuzhiyun u32 discards_failed;
79*4882a593Smuzhiyun u32 done_rescheduled;
80*4882a593Smuzhiyun u32 issue_rescheduled;
81*4882a593Smuzhiyun u32 dma_sw_err;
82*4882a593Smuzhiyun u32 dma_hw_fault;
83*4882a593Smuzhiyun u32 dma_cancelled;
84*4882a593Smuzhiyun u32 sw_q_depth; /* Number of DMAs on the SW queue. */
85*4882a593Smuzhiyun atomic_t hw_q_depth; /* Number of DMAs queued to HW. */
86*4882a593Smuzhiyun };
87*4882a593Smuzhiyun
88*4882a593Smuzhiyun struct rsxx_dma_ctrl {
89*4882a593Smuzhiyun struct rsxx_cardinfo *card;
90*4882a593Smuzhiyun int id;
91*4882a593Smuzhiyun void __iomem *regmap;
92*4882a593Smuzhiyun struct rsxx_cs_buffer status;
93*4882a593Smuzhiyun struct rsxx_cs_buffer cmd;
94*4882a593Smuzhiyun u16 e_cnt;
95*4882a593Smuzhiyun spinlock_t queue_lock;
96*4882a593Smuzhiyun struct list_head queue;
97*4882a593Smuzhiyun struct workqueue_struct *issue_wq;
98*4882a593Smuzhiyun struct work_struct issue_dma_work;
99*4882a593Smuzhiyun struct workqueue_struct *done_wq;
100*4882a593Smuzhiyun struct work_struct dma_done_work;
101*4882a593Smuzhiyun struct timer_list activity_timer;
102*4882a593Smuzhiyun struct dma_tracker_list *trackers;
103*4882a593Smuzhiyun struct rsxx_dma_stats stats;
104*4882a593Smuzhiyun struct mutex work_lock;
105*4882a593Smuzhiyun };
106*4882a593Smuzhiyun
107*4882a593Smuzhiyun struct rsxx_cardinfo {
108*4882a593Smuzhiyun struct pci_dev *dev;
109*4882a593Smuzhiyun unsigned int halt;
110*4882a593Smuzhiyun unsigned int eeh_state;
111*4882a593Smuzhiyun
112*4882a593Smuzhiyun void __iomem *regmap;
113*4882a593Smuzhiyun spinlock_t irq_lock;
114*4882a593Smuzhiyun unsigned int isr_mask;
115*4882a593Smuzhiyun unsigned int ier_mask;
116*4882a593Smuzhiyun
117*4882a593Smuzhiyun struct rsxx_card_cfg config;
118*4882a593Smuzhiyun int config_valid;
119*4882a593Smuzhiyun
120*4882a593Smuzhiyun /* Embedded CPU Communication */
121*4882a593Smuzhiyun struct {
122*4882a593Smuzhiyun spinlock_t lock;
123*4882a593Smuzhiyun bool active;
124*4882a593Smuzhiyun struct creg_cmd *active_cmd;
125*4882a593Smuzhiyun struct workqueue_struct *creg_wq;
126*4882a593Smuzhiyun struct work_struct done_work;
127*4882a593Smuzhiyun struct list_head queue;
128*4882a593Smuzhiyun unsigned int q_depth;
129*4882a593Smuzhiyun /* Cache the creg status to prevent ioreads */
130*4882a593Smuzhiyun struct {
131*4882a593Smuzhiyun u32 stat;
132*4882a593Smuzhiyun u32 failed_cancel_timer;
133*4882a593Smuzhiyun u32 creg_timeout;
134*4882a593Smuzhiyun } creg_stats;
135*4882a593Smuzhiyun struct timer_list cmd_timer;
136*4882a593Smuzhiyun struct mutex reset_lock;
137*4882a593Smuzhiyun int reset;
138*4882a593Smuzhiyun } creg_ctrl;
139*4882a593Smuzhiyun
140*4882a593Smuzhiyun struct {
141*4882a593Smuzhiyun char tmp[MAX_CREG_DATA8];
142*4882a593Smuzhiyun char buf[LOG_BUF_SIZE8]; /* terminated */
143*4882a593Smuzhiyun int buf_len;
144*4882a593Smuzhiyun } log;
145*4882a593Smuzhiyun
146*4882a593Smuzhiyun struct workqueue_struct *event_wq;
147*4882a593Smuzhiyun struct work_struct event_work;
148*4882a593Smuzhiyun unsigned int state;
149*4882a593Smuzhiyun u64 size8;
150*4882a593Smuzhiyun
151*4882a593Smuzhiyun /* Lock the device attach/detach function */
152*4882a593Smuzhiyun struct mutex dev_lock;
153*4882a593Smuzhiyun
154*4882a593Smuzhiyun /* Block Device Variables */
155*4882a593Smuzhiyun bool bdev_attached;
156*4882a593Smuzhiyun int disk_id;
157*4882a593Smuzhiyun int major;
158*4882a593Smuzhiyun struct request_queue *queue;
159*4882a593Smuzhiyun struct gendisk *gendisk;
160*4882a593Smuzhiyun struct {
161*4882a593Smuzhiyun /* Used to convert a byte address to a device address. */
162*4882a593Smuzhiyun u64 lower_mask;
163*4882a593Smuzhiyun u64 upper_shift;
164*4882a593Smuzhiyun u64 upper_mask;
165*4882a593Smuzhiyun u64 target_mask;
166*4882a593Smuzhiyun u64 target_shift;
167*4882a593Smuzhiyun } _stripe;
168*4882a593Smuzhiyun unsigned int dma_fault;
169*4882a593Smuzhiyun
170*4882a593Smuzhiyun int scrub_hard;
171*4882a593Smuzhiyun
172*4882a593Smuzhiyun int n_targets;
173*4882a593Smuzhiyun struct rsxx_dma_ctrl *ctrl;
174*4882a593Smuzhiyun
175*4882a593Smuzhiyun struct dentry *debugfs_dir;
176*4882a593Smuzhiyun };
177*4882a593Smuzhiyun
178*4882a593Smuzhiyun enum rsxx_pci_regmap {
179*4882a593Smuzhiyun HWID = 0x00, /* Hardware Identification Register */
180*4882a593Smuzhiyun SCRATCH = 0x04, /* Scratch/Debug Register */
181*4882a593Smuzhiyun RESET = 0x08, /* Reset Register */
182*4882a593Smuzhiyun ISR = 0x10, /* Interrupt Status Register */
183*4882a593Smuzhiyun IER = 0x14, /* Interrupt Enable Register */
184*4882a593Smuzhiyun IPR = 0x18, /* Interrupt Poll Register */
185*4882a593Smuzhiyun CB_ADD_LO = 0x20, /* Command Host Buffer Address [31:0] */
186*4882a593Smuzhiyun CB_ADD_HI = 0x24, /* Command Host Buffer Address [63:32]*/
187*4882a593Smuzhiyun HW_CMD_IDX = 0x28, /* Hardware Processed Command Index */
188*4882a593Smuzhiyun SW_CMD_IDX = 0x2C, /* Software Processed Command Index */
189*4882a593Smuzhiyun SB_ADD_LO = 0x30, /* Status Host Buffer Address [31:0] */
190*4882a593Smuzhiyun SB_ADD_HI = 0x34, /* Status Host Buffer Address [63:32] */
191*4882a593Smuzhiyun HW_STATUS_CNT = 0x38, /* Hardware Status Counter */
192*4882a593Smuzhiyun SW_STATUS_CNT = 0x3C, /* Deprecated */
193*4882a593Smuzhiyun CREG_CMD = 0x40, /* CPU Command Register */
194*4882a593Smuzhiyun CREG_ADD = 0x44, /* CPU Address Register */
195*4882a593Smuzhiyun CREG_CNT = 0x48, /* CPU Count Register */
196*4882a593Smuzhiyun CREG_STAT = 0x4C, /* CPU Status Register */
197*4882a593Smuzhiyun CREG_DATA0 = 0x50, /* CPU Data Registers */
198*4882a593Smuzhiyun CREG_DATA1 = 0x54,
199*4882a593Smuzhiyun CREG_DATA2 = 0x58,
200*4882a593Smuzhiyun CREG_DATA3 = 0x5C,
201*4882a593Smuzhiyun CREG_DATA4 = 0x60,
202*4882a593Smuzhiyun CREG_DATA5 = 0x64,
203*4882a593Smuzhiyun CREG_DATA6 = 0x68,
204*4882a593Smuzhiyun CREG_DATA7 = 0x6c,
205*4882a593Smuzhiyun INTR_COAL = 0x70, /* Interrupt Coalescing Register */
206*4882a593Smuzhiyun HW_ERROR = 0x74, /* Card Error Register */
207*4882a593Smuzhiyun PCI_DEBUG0 = 0x78, /* PCI Debug Registers */
208*4882a593Smuzhiyun PCI_DEBUG1 = 0x7C,
209*4882a593Smuzhiyun PCI_DEBUG2 = 0x80,
210*4882a593Smuzhiyun PCI_DEBUG3 = 0x84,
211*4882a593Smuzhiyun PCI_DEBUG4 = 0x88,
212*4882a593Smuzhiyun PCI_DEBUG5 = 0x8C,
213*4882a593Smuzhiyun PCI_DEBUG6 = 0x90,
214*4882a593Smuzhiyun PCI_DEBUG7 = 0x94,
215*4882a593Smuzhiyun PCI_POWER_THROTTLE = 0x98,
216*4882a593Smuzhiyun PERF_CTRL = 0x9c,
217*4882a593Smuzhiyun PERF_TIMER_LO = 0xa0,
218*4882a593Smuzhiyun PERF_TIMER_HI = 0xa4,
219*4882a593Smuzhiyun PERF_RD512_LO = 0xa8,
220*4882a593Smuzhiyun PERF_RD512_HI = 0xac,
221*4882a593Smuzhiyun PERF_WR512_LO = 0xb0,
222*4882a593Smuzhiyun PERF_WR512_HI = 0xb4,
223*4882a593Smuzhiyun PCI_RECONFIG = 0xb8,
224*4882a593Smuzhiyun };
225*4882a593Smuzhiyun
226*4882a593Smuzhiyun enum rsxx_intr {
227*4882a593Smuzhiyun CR_INTR_DMA0 = 0x00000001,
228*4882a593Smuzhiyun CR_INTR_CREG = 0x00000002,
229*4882a593Smuzhiyun CR_INTR_DMA1 = 0x00000004,
230*4882a593Smuzhiyun CR_INTR_EVENT = 0x00000008,
231*4882a593Smuzhiyun CR_INTR_DMA2 = 0x00000010,
232*4882a593Smuzhiyun CR_INTR_DMA3 = 0x00000020,
233*4882a593Smuzhiyun CR_INTR_DMA4 = 0x00000040,
234*4882a593Smuzhiyun CR_INTR_DMA5 = 0x00000080,
235*4882a593Smuzhiyun CR_INTR_DMA6 = 0x00000100,
236*4882a593Smuzhiyun CR_INTR_DMA7 = 0x00000200,
237*4882a593Smuzhiyun CR_INTR_ALL_C = 0x0000003f,
238*4882a593Smuzhiyun CR_INTR_ALL_G = 0x000003ff,
239*4882a593Smuzhiyun CR_INTR_DMA_ALL = 0x000003f5,
240*4882a593Smuzhiyun CR_INTR_ALL = 0xffffffff,
241*4882a593Smuzhiyun };
242*4882a593Smuzhiyun
CR_INTR_DMA(int N)243*4882a593Smuzhiyun static inline int CR_INTR_DMA(int N)
244*4882a593Smuzhiyun {
245*4882a593Smuzhiyun static const unsigned int _CR_INTR_DMA[] = {
246*4882a593Smuzhiyun CR_INTR_DMA0, CR_INTR_DMA1, CR_INTR_DMA2, CR_INTR_DMA3,
247*4882a593Smuzhiyun CR_INTR_DMA4, CR_INTR_DMA5, CR_INTR_DMA6, CR_INTR_DMA7
248*4882a593Smuzhiyun };
249*4882a593Smuzhiyun return _CR_INTR_DMA[N];
250*4882a593Smuzhiyun }
251*4882a593Smuzhiyun enum rsxx_pci_reset {
252*4882a593Smuzhiyun DMA_QUEUE_RESET = 0x00000001,
253*4882a593Smuzhiyun };
254*4882a593Smuzhiyun
255*4882a593Smuzhiyun enum rsxx_hw_fifo_flush {
256*4882a593Smuzhiyun RSXX_FLUSH_BUSY = 0x00000002,
257*4882a593Smuzhiyun RSXX_FLUSH_TIMEOUT = 0x00000004,
258*4882a593Smuzhiyun };
259*4882a593Smuzhiyun
260*4882a593Smuzhiyun enum rsxx_pci_revision {
261*4882a593Smuzhiyun RSXX_DISCARD_SUPPORT = 2,
262*4882a593Smuzhiyun RSXX_EEH_SUPPORT = 3,
263*4882a593Smuzhiyun };
264*4882a593Smuzhiyun
265*4882a593Smuzhiyun enum rsxx_creg_cmd {
266*4882a593Smuzhiyun CREG_CMD_TAG_MASK = 0x0000FF00,
267*4882a593Smuzhiyun CREG_OP_WRITE = 0x000000C0,
268*4882a593Smuzhiyun CREG_OP_READ = 0x000000E0,
269*4882a593Smuzhiyun };
270*4882a593Smuzhiyun
271*4882a593Smuzhiyun enum rsxx_creg_addr {
272*4882a593Smuzhiyun CREG_ADD_CARD_CMD = 0x80001000,
273*4882a593Smuzhiyun CREG_ADD_CARD_STATE = 0x80001004,
274*4882a593Smuzhiyun CREG_ADD_CARD_SIZE = 0x8000100c,
275*4882a593Smuzhiyun CREG_ADD_CAPABILITIES = 0x80001050,
276*4882a593Smuzhiyun CREG_ADD_LOG = 0x80002000,
277*4882a593Smuzhiyun CREG_ADD_NUM_TARGETS = 0x80003000,
278*4882a593Smuzhiyun CREG_ADD_CRAM = 0xA0000000,
279*4882a593Smuzhiyun CREG_ADD_CONFIG = 0xB0000000,
280*4882a593Smuzhiyun };
281*4882a593Smuzhiyun
282*4882a593Smuzhiyun enum rsxx_creg_card_cmd {
283*4882a593Smuzhiyun CARD_CMD_STARTUP = 1,
284*4882a593Smuzhiyun CARD_CMD_SHUTDOWN = 2,
285*4882a593Smuzhiyun CARD_CMD_LOW_LEVEL_FORMAT = 3,
286*4882a593Smuzhiyun CARD_CMD_FPGA_RECONFIG_BR = 4,
287*4882a593Smuzhiyun CARD_CMD_FPGA_RECONFIG_MAIN = 5,
288*4882a593Smuzhiyun CARD_CMD_BACKUP = 6,
289*4882a593Smuzhiyun CARD_CMD_RESET = 7,
290*4882a593Smuzhiyun CARD_CMD_deprecated = 8,
291*4882a593Smuzhiyun CARD_CMD_UNINITIALIZE = 9,
292*4882a593Smuzhiyun CARD_CMD_DSTROY_EMERGENCY = 10,
293*4882a593Smuzhiyun CARD_CMD_DSTROY_NORMAL = 11,
294*4882a593Smuzhiyun CARD_CMD_DSTROY_EXTENDED = 12,
295*4882a593Smuzhiyun CARD_CMD_DSTROY_ABORT = 13,
296*4882a593Smuzhiyun };
297*4882a593Smuzhiyun
298*4882a593Smuzhiyun enum rsxx_card_state {
299*4882a593Smuzhiyun CARD_STATE_SHUTDOWN = 0x00000001,
300*4882a593Smuzhiyun CARD_STATE_STARTING = 0x00000002,
301*4882a593Smuzhiyun CARD_STATE_FORMATTING = 0x00000004,
302*4882a593Smuzhiyun CARD_STATE_UNINITIALIZED = 0x00000008,
303*4882a593Smuzhiyun CARD_STATE_GOOD = 0x00000010,
304*4882a593Smuzhiyun CARD_STATE_SHUTTING_DOWN = 0x00000020,
305*4882a593Smuzhiyun CARD_STATE_FAULT = 0x00000040,
306*4882a593Smuzhiyun CARD_STATE_RD_ONLY_FAULT = 0x00000080,
307*4882a593Smuzhiyun CARD_STATE_DSTROYING = 0x00000100,
308*4882a593Smuzhiyun };
309*4882a593Smuzhiyun
310*4882a593Smuzhiyun enum rsxx_led {
311*4882a593Smuzhiyun LED_DEFAULT = 0x0,
312*4882a593Smuzhiyun LED_IDENTIFY = 0x1,
313*4882a593Smuzhiyun LED_SOAK = 0x2,
314*4882a593Smuzhiyun };
315*4882a593Smuzhiyun
316*4882a593Smuzhiyun enum rsxx_creg_flash_lock {
317*4882a593Smuzhiyun CREG_FLASH_LOCK = 1,
318*4882a593Smuzhiyun CREG_FLASH_UNLOCK = 2,
319*4882a593Smuzhiyun };
320*4882a593Smuzhiyun
321*4882a593Smuzhiyun enum rsxx_card_capabilities {
322*4882a593Smuzhiyun CARD_CAP_SUBPAGE_WRITES = 0x00000080,
323*4882a593Smuzhiyun };
324*4882a593Smuzhiyun
325*4882a593Smuzhiyun enum rsxx_creg_stat {
326*4882a593Smuzhiyun CREG_STAT_STATUS_MASK = 0x00000003,
327*4882a593Smuzhiyun CREG_STAT_SUCCESS = 0x1,
328*4882a593Smuzhiyun CREG_STAT_ERROR = 0x2,
329*4882a593Smuzhiyun CREG_STAT_CHAR_PENDING = 0x00000004, /* Character I/O pending bit */
330*4882a593Smuzhiyun CREG_STAT_LOG_PENDING = 0x00000008, /* HW log message pending bit */
331*4882a593Smuzhiyun CREG_STAT_TAG_MASK = 0x0000ff00,
332*4882a593Smuzhiyun };
333*4882a593Smuzhiyun
334*4882a593Smuzhiyun enum rsxx_dma_finish {
335*4882a593Smuzhiyun FREE_DMA = 0x0,
336*4882a593Smuzhiyun COMPLETE_DMA = 0x1,
337*4882a593Smuzhiyun };
338*4882a593Smuzhiyun
CREG_DATA(int N)339*4882a593Smuzhiyun static inline unsigned int CREG_DATA(int N)
340*4882a593Smuzhiyun {
341*4882a593Smuzhiyun return CREG_DATA0 + (N << 2);
342*4882a593Smuzhiyun }
343*4882a593Smuzhiyun
344*4882a593Smuzhiyun /*----------------- Convenient Log Wrappers -------------------*/
345*4882a593Smuzhiyun #define CARD_TO_DEV(__CARD) (&(__CARD)->dev->dev)
346*4882a593Smuzhiyun
347*4882a593Smuzhiyun /***** config.c *****/
348*4882a593Smuzhiyun int rsxx_load_config(struct rsxx_cardinfo *card);
349*4882a593Smuzhiyun
350*4882a593Smuzhiyun /***** core.c *****/
351*4882a593Smuzhiyun void rsxx_enable_ier(struct rsxx_cardinfo *card, unsigned int intr);
352*4882a593Smuzhiyun void rsxx_disable_ier(struct rsxx_cardinfo *card, unsigned int intr);
353*4882a593Smuzhiyun void rsxx_enable_ier_and_isr(struct rsxx_cardinfo *card,
354*4882a593Smuzhiyun unsigned int intr);
355*4882a593Smuzhiyun void rsxx_disable_ier_and_isr(struct rsxx_cardinfo *card,
356*4882a593Smuzhiyun unsigned int intr);
357*4882a593Smuzhiyun
358*4882a593Smuzhiyun /***** dev.c *****/
359*4882a593Smuzhiyun int rsxx_attach_dev(struct rsxx_cardinfo *card);
360*4882a593Smuzhiyun void rsxx_detach_dev(struct rsxx_cardinfo *card);
361*4882a593Smuzhiyun int rsxx_setup_dev(struct rsxx_cardinfo *card);
362*4882a593Smuzhiyun void rsxx_destroy_dev(struct rsxx_cardinfo *card);
363*4882a593Smuzhiyun int rsxx_dev_init(void);
364*4882a593Smuzhiyun void rsxx_dev_cleanup(void);
365*4882a593Smuzhiyun
366*4882a593Smuzhiyun /***** dma.c ****/
367*4882a593Smuzhiyun typedef void (*rsxx_dma_cb)(struct rsxx_cardinfo *card,
368*4882a593Smuzhiyun void *cb_data,
369*4882a593Smuzhiyun unsigned int status);
370*4882a593Smuzhiyun int rsxx_dma_setup(struct rsxx_cardinfo *card);
371*4882a593Smuzhiyun void rsxx_dma_destroy(struct rsxx_cardinfo *card);
372*4882a593Smuzhiyun int rsxx_dma_init(void);
373*4882a593Smuzhiyun int rsxx_cleanup_dma_queue(struct rsxx_dma_ctrl *ctrl,
374*4882a593Smuzhiyun struct list_head *q,
375*4882a593Smuzhiyun unsigned int done);
376*4882a593Smuzhiyun int rsxx_dma_cancel(struct rsxx_dma_ctrl *ctrl);
377*4882a593Smuzhiyun void rsxx_dma_cleanup(void);
378*4882a593Smuzhiyun void rsxx_dma_queue_reset(struct rsxx_cardinfo *card);
379*4882a593Smuzhiyun int rsxx_dma_configure(struct rsxx_cardinfo *card);
380*4882a593Smuzhiyun blk_status_t rsxx_dma_queue_bio(struct rsxx_cardinfo *card,
381*4882a593Smuzhiyun struct bio *bio,
382*4882a593Smuzhiyun atomic_t *n_dmas,
383*4882a593Smuzhiyun rsxx_dma_cb cb,
384*4882a593Smuzhiyun void *cb_data);
385*4882a593Smuzhiyun int rsxx_hw_buffers_init(struct pci_dev *dev, struct rsxx_dma_ctrl *ctrl);
386*4882a593Smuzhiyun int rsxx_eeh_save_issued_dmas(struct rsxx_cardinfo *card);
387*4882a593Smuzhiyun int rsxx_eeh_remap_dmas(struct rsxx_cardinfo *card);
388*4882a593Smuzhiyun
389*4882a593Smuzhiyun /***** cregs.c *****/
390*4882a593Smuzhiyun int rsxx_creg_write(struct rsxx_cardinfo *card, u32 addr,
391*4882a593Smuzhiyun unsigned int size8,
392*4882a593Smuzhiyun void *data,
393*4882a593Smuzhiyun int byte_stream);
394*4882a593Smuzhiyun int rsxx_creg_read(struct rsxx_cardinfo *card,
395*4882a593Smuzhiyun u32 addr,
396*4882a593Smuzhiyun unsigned int size8,
397*4882a593Smuzhiyun void *data,
398*4882a593Smuzhiyun int byte_stream);
399*4882a593Smuzhiyun int rsxx_read_hw_log(struct rsxx_cardinfo *card);
400*4882a593Smuzhiyun int rsxx_get_card_state(struct rsxx_cardinfo *card,
401*4882a593Smuzhiyun unsigned int *state);
402*4882a593Smuzhiyun int rsxx_get_card_size8(struct rsxx_cardinfo *card, u64 *size8);
403*4882a593Smuzhiyun int rsxx_get_num_targets(struct rsxx_cardinfo *card,
404*4882a593Smuzhiyun unsigned int *n_targets);
405*4882a593Smuzhiyun int rsxx_get_card_capabilities(struct rsxx_cardinfo *card,
406*4882a593Smuzhiyun u32 *capabilities);
407*4882a593Smuzhiyun int rsxx_issue_card_cmd(struct rsxx_cardinfo *card, u32 cmd);
408*4882a593Smuzhiyun int rsxx_creg_setup(struct rsxx_cardinfo *card);
409*4882a593Smuzhiyun void rsxx_creg_destroy(struct rsxx_cardinfo *card);
410*4882a593Smuzhiyun int rsxx_creg_init(void);
411*4882a593Smuzhiyun void rsxx_creg_cleanup(void);
412*4882a593Smuzhiyun int rsxx_reg_access(struct rsxx_cardinfo *card,
413*4882a593Smuzhiyun struct rsxx_reg_access __user *ucmd,
414*4882a593Smuzhiyun int read);
415*4882a593Smuzhiyun void rsxx_eeh_save_issued_creg(struct rsxx_cardinfo *card);
416*4882a593Smuzhiyun void rsxx_kick_creg_queue(struct rsxx_cardinfo *card);
417*4882a593Smuzhiyun
418*4882a593Smuzhiyun
419*4882a593Smuzhiyun
420*4882a593Smuzhiyun #endif /* __DRIVERS_BLOCK_RSXX_H__ */
421