xref: /openbmc/linux/drivers/scsi/zorro_esp.c (revision 3109e5ae0311e937d49a5325134e50b742ac5f4a)
1*3109e5aeSMichael Schmitz // SPDX-License-Identifier: GPL-2.0
2*3109e5aeSMichael Schmitz /*
3*3109e5aeSMichael Schmitz  * ESP front-end for Amiga ZORRO SCSI systems.
4*3109e5aeSMichael Schmitz  *
5*3109e5aeSMichael Schmitz  * Copyright (C) 1996 Jesper Skov (jskov@cygnus.co.uk)
6*3109e5aeSMichael Schmitz  *
7*3109e5aeSMichael Schmitz  * Copyright (C) 2011,2018 Michael Schmitz (schmitz@debian.org) for
8*3109e5aeSMichael Schmitz  *               migration to ESP SCSI core
9*3109e5aeSMichael Schmitz  *
10*3109e5aeSMichael Schmitz  * Copyright (C) 2013 Tuomas Vainikka (tuomas.vainikka@aalto.fi) for
11*3109e5aeSMichael Schmitz  *               Blizzard 1230 DMA and probe function fixes
12*3109e5aeSMichael Schmitz  *
13*3109e5aeSMichael Schmitz  * Copyright (C) 2017 Finn Thain for PIO code from Mac ESP driver adapted here
14*3109e5aeSMichael Schmitz  */
15*3109e5aeSMichael Schmitz /*
16*3109e5aeSMichael Schmitz  * ZORRO bus code from:
17*3109e5aeSMichael Schmitz  */
18*3109e5aeSMichael Schmitz /*
19*3109e5aeSMichael Schmitz  * Detection routine for the NCR53c710 based Amiga SCSI Controllers for Linux.
20*3109e5aeSMichael Schmitz  *		Amiga MacroSystemUS WarpEngine SCSI controller.
21*3109e5aeSMichael Schmitz  *		Amiga Technologies/DKB A4091 SCSI controller.
22*3109e5aeSMichael Schmitz  *
23*3109e5aeSMichael Schmitz  * Written 1997 by Alan Hourihane <alanh@fairlite.demon.co.uk>
24*3109e5aeSMichael Schmitz  * plus modifications of the 53c7xx.c driver to support the Amiga.
25*3109e5aeSMichael Schmitz  *
26*3109e5aeSMichael Schmitz  * Rewritten to use 53c700.c by Kars de Jong <jongk@linux-m68k.org>
27*3109e5aeSMichael Schmitz  */
28*3109e5aeSMichael Schmitz 
29*3109e5aeSMichael Schmitz #define pr_fmt(fmt)        KBUILD_MODNAME ": " fmt
30*3109e5aeSMichael Schmitz 
31*3109e5aeSMichael Schmitz #include <linux/module.h>
32*3109e5aeSMichael Schmitz #include <linux/init.h>
33*3109e5aeSMichael Schmitz #include <linux/interrupt.h>
34*3109e5aeSMichael Schmitz #include <linux/dma-mapping.h>
35*3109e5aeSMichael Schmitz #include <linux/scatterlist.h>
36*3109e5aeSMichael Schmitz #include <linux/delay.h>
37*3109e5aeSMichael Schmitz #include <linux/zorro.h>
38*3109e5aeSMichael Schmitz #include <linux/slab.h>
39*3109e5aeSMichael Schmitz 
40*3109e5aeSMichael Schmitz #include <asm/page.h>
41*3109e5aeSMichael Schmitz #include <asm/pgtable.h>
42*3109e5aeSMichael Schmitz #include <asm/cacheflush.h>
43*3109e5aeSMichael Schmitz #include <asm/amigahw.h>
44*3109e5aeSMichael Schmitz #include <asm/amigaints.h>
45*3109e5aeSMichael Schmitz 
46*3109e5aeSMichael Schmitz #include <scsi/scsi_host.h>
47*3109e5aeSMichael Schmitz #include <scsi/scsi_transport_spi.h>
48*3109e5aeSMichael Schmitz #include <scsi/scsi_device.h>
49*3109e5aeSMichael Schmitz #include <scsi/scsi_tcq.h>
50*3109e5aeSMichael Schmitz 
51*3109e5aeSMichael Schmitz #include "esp_scsi.h"
52*3109e5aeSMichael Schmitz 
53*3109e5aeSMichael Schmitz MODULE_AUTHOR("Michael Schmitz <schmitz@debian.org>");
54*3109e5aeSMichael Schmitz MODULE_DESCRIPTION("Amiga Zorro NCR5C9x (ESP) driver");
55*3109e5aeSMichael Schmitz MODULE_LICENSE("GPL");
56*3109e5aeSMichael Schmitz 
57*3109e5aeSMichael Schmitz /* per-board register layout definitions */
58*3109e5aeSMichael Schmitz 
59*3109e5aeSMichael Schmitz /* Blizzard 1230 DMA interface */
60*3109e5aeSMichael Schmitz 
61*3109e5aeSMichael Schmitz struct blz1230_dma_registers {
62*3109e5aeSMichael Schmitz 	unsigned char dma_addr;		/* DMA address      [0x0000] */
63*3109e5aeSMichael Schmitz 	unsigned char dmapad2[0x7fff];
64*3109e5aeSMichael Schmitz 	unsigned char dma_latch;	/* DMA latch        [0x8000] */
65*3109e5aeSMichael Schmitz };
66*3109e5aeSMichael Schmitz 
67*3109e5aeSMichael Schmitz /* Blizzard 1230II DMA interface */
68*3109e5aeSMichael Schmitz 
69*3109e5aeSMichael Schmitz struct blz1230II_dma_registers {
70*3109e5aeSMichael Schmitz 	unsigned char dma_addr;		/* DMA address      [0x0000] */
71*3109e5aeSMichael Schmitz 	unsigned char dmapad2[0xf];
72*3109e5aeSMichael Schmitz 	unsigned char dma_latch;	/* DMA latch        [0x0010] */
73*3109e5aeSMichael Schmitz };
74*3109e5aeSMichael Schmitz 
75*3109e5aeSMichael Schmitz /* Blizzard 2060 DMA interface */
76*3109e5aeSMichael Schmitz 
77*3109e5aeSMichael Schmitz struct blz2060_dma_registers {
78*3109e5aeSMichael Schmitz 	unsigned char dma_led_ctrl;	/* DMA led control   [0x000] */
79*3109e5aeSMichael Schmitz 	unsigned char dmapad1[0x0f];
80*3109e5aeSMichael Schmitz 	unsigned char dma_addr0;	/* DMA address (MSB) [0x010] */
81*3109e5aeSMichael Schmitz 	unsigned char dmapad2[0x03];
82*3109e5aeSMichael Schmitz 	unsigned char dma_addr1;	/* DMA address       [0x014] */
83*3109e5aeSMichael Schmitz 	unsigned char dmapad3[0x03];
84*3109e5aeSMichael Schmitz 	unsigned char dma_addr2;	/* DMA address       [0x018] */
85*3109e5aeSMichael Schmitz 	unsigned char dmapad4[0x03];
86*3109e5aeSMichael Schmitz 	unsigned char dma_addr3;	/* DMA address (LSB) [0x01c] */
87*3109e5aeSMichael Schmitz };
88*3109e5aeSMichael Schmitz 
89*3109e5aeSMichael Schmitz /* DMA control bits */
90*3109e5aeSMichael Schmitz #define DMA_WRITE 0x80000000
91*3109e5aeSMichael Schmitz 
92*3109e5aeSMichael Schmitz /* Cyberstorm DMA interface */
93*3109e5aeSMichael Schmitz 
94*3109e5aeSMichael Schmitz struct cyber_dma_registers {
95*3109e5aeSMichael Schmitz 	unsigned char dma_addr0;	/* DMA address (MSB) [0x000] */
96*3109e5aeSMichael Schmitz 	unsigned char dmapad1[1];
97*3109e5aeSMichael Schmitz 	unsigned char dma_addr1;	/* DMA address       [0x002] */
98*3109e5aeSMichael Schmitz 	unsigned char dmapad2[1];
99*3109e5aeSMichael Schmitz 	unsigned char dma_addr2;	/* DMA address       [0x004] */
100*3109e5aeSMichael Schmitz 	unsigned char dmapad3[1];
101*3109e5aeSMichael Schmitz 	unsigned char dma_addr3;	/* DMA address (LSB) [0x006] */
102*3109e5aeSMichael Schmitz 	unsigned char dmapad4[0x3fb];
103*3109e5aeSMichael Schmitz 	unsigned char cond_reg;		/* DMA cond    (ro)  [0x402] */
104*3109e5aeSMichael Schmitz #define ctrl_reg  cond_reg		/* DMA control (wo)  [0x402] */
105*3109e5aeSMichael Schmitz };
106*3109e5aeSMichael Schmitz 
107*3109e5aeSMichael Schmitz /* DMA control bits */
108*3109e5aeSMichael Schmitz #define CYBER_DMA_WRITE  0x40	/* DMA direction. 1 = write */
109*3109e5aeSMichael Schmitz #define CYBER_DMA_Z3     0x20	/* 16 (Z2) or 32 (CHIP/Z3) bit DMA transfer */
110*3109e5aeSMichael Schmitz 
111*3109e5aeSMichael Schmitz /* DMA status bits */
112*3109e5aeSMichael Schmitz #define CYBER_DMA_HNDL_INTR 0x80	/* DMA IRQ pending? */
113*3109e5aeSMichael Schmitz 
114*3109e5aeSMichael Schmitz /* The CyberStorm II DMA interface */
115*3109e5aeSMichael Schmitz struct cyberII_dma_registers {
116*3109e5aeSMichael Schmitz 	unsigned char cond_reg;		/* DMA cond    (ro)  [0x000] */
117*3109e5aeSMichael Schmitz #define ctrl_reg  cond_reg		/* DMA control (wo)  [0x000] */
118*3109e5aeSMichael Schmitz 	unsigned char dmapad4[0x3f];
119*3109e5aeSMichael Schmitz 	unsigned char dma_addr0;	/* DMA address (MSB) [0x040] */
120*3109e5aeSMichael Schmitz 	unsigned char dmapad1[3];
121*3109e5aeSMichael Schmitz 	unsigned char dma_addr1;	/* DMA address       [0x044] */
122*3109e5aeSMichael Schmitz 	unsigned char dmapad2[3];
123*3109e5aeSMichael Schmitz 	unsigned char dma_addr2;	/* DMA address       [0x048] */
124*3109e5aeSMichael Schmitz 	unsigned char dmapad3[3];
125*3109e5aeSMichael Schmitz 	unsigned char dma_addr3;	/* DMA address (LSB) [0x04c] */
126*3109e5aeSMichael Schmitz };
127*3109e5aeSMichael Schmitz 
128*3109e5aeSMichael Schmitz /* Fastlane DMA interface */
129*3109e5aeSMichael Schmitz 
130*3109e5aeSMichael Schmitz struct fastlane_dma_registers {
131*3109e5aeSMichael Schmitz 	unsigned char cond_reg;		/* DMA status  (ro) [0x0000] */
132*3109e5aeSMichael Schmitz #define ctrl_reg  cond_reg		/* DMA control (wo) [0x0000] */
133*3109e5aeSMichael Schmitz 	char dmapad1[0x3f];
134*3109e5aeSMichael Schmitz 	unsigned char clear_strobe;	/* DMA clear   (wo) [0x0040] */
135*3109e5aeSMichael Schmitz };
136*3109e5aeSMichael Schmitz 
137*3109e5aeSMichael Schmitz /*
138*3109e5aeSMichael Schmitz  * The controller registers can be found in the Z2 config area at these
139*3109e5aeSMichael Schmitz  * offsets:
140*3109e5aeSMichael Schmitz  */
141*3109e5aeSMichael Schmitz #define FASTLANE_ESP_ADDR	0x1000001
142*3109e5aeSMichael Schmitz 
143*3109e5aeSMichael Schmitz /* DMA status bits */
144*3109e5aeSMichael Schmitz #define FASTLANE_DMA_MINT	0x80
145*3109e5aeSMichael Schmitz #define FASTLANE_DMA_IACT	0x40
146*3109e5aeSMichael Schmitz #define FASTLANE_DMA_CREQ	0x20
147*3109e5aeSMichael Schmitz 
148*3109e5aeSMichael Schmitz /* DMA control bits */
149*3109e5aeSMichael Schmitz #define FASTLANE_DMA_FCODE	0xa0
150*3109e5aeSMichael Schmitz #define FASTLANE_DMA_MASK	0xf3
151*3109e5aeSMichael Schmitz #define FASTLANE_DMA_WRITE	0x08	/* 1 = write */
152*3109e5aeSMichael Schmitz #define FASTLANE_DMA_ENABLE	0x04	/* Enable DMA */
153*3109e5aeSMichael Schmitz #define FASTLANE_DMA_EDI	0x02	/* Enable DMA IRQ ? */
154*3109e5aeSMichael Schmitz #define FASTLANE_DMA_ESI	0x01	/* Enable SCSI IRQ */
155*3109e5aeSMichael Schmitz 
156*3109e5aeSMichael Schmitz /*
157*3109e5aeSMichael Schmitz  * private data used for driver
158*3109e5aeSMichael Schmitz  */
159*3109e5aeSMichael Schmitz struct zorro_esp_priv {
160*3109e5aeSMichael Schmitz 	struct esp *esp;		/* our ESP instance - for Scsi_host* */
161*3109e5aeSMichael Schmitz 	void __iomem *board_base;	/* virtual address (Zorro III board) */
162*3109e5aeSMichael Schmitz 	int error;			/* PIO error flag */
163*3109e5aeSMichael Schmitz 	int zorro3;			/* board is Zorro III */
164*3109e5aeSMichael Schmitz 	unsigned char ctrl_data;	/* shadow copy of ctrl_reg */
165*3109e5aeSMichael Schmitz };
166*3109e5aeSMichael Schmitz 
167*3109e5aeSMichael Schmitz /*
168*3109e5aeSMichael Schmitz  * On all implementations except for the Oktagon, padding between ESP
169*3109e5aeSMichael Schmitz  * registers is three bytes.
170*3109e5aeSMichael Schmitz  * On Oktagon, it is one byte - use a different accessor there.
171*3109e5aeSMichael Schmitz  *
172*3109e5aeSMichael Schmitz  * Oktagon needs PDMA - currently unsupported!
173*3109e5aeSMichael Schmitz  */
174*3109e5aeSMichael Schmitz 
175*3109e5aeSMichael Schmitz static void zorro_esp_write8(struct esp *esp, u8 val, unsigned long reg)
176*3109e5aeSMichael Schmitz {
177*3109e5aeSMichael Schmitz 	writeb(val, esp->regs + (reg * 4UL));
178*3109e5aeSMichael Schmitz }
179*3109e5aeSMichael Schmitz 
180*3109e5aeSMichael Schmitz static u8 zorro_esp_read8(struct esp *esp, unsigned long reg)
181*3109e5aeSMichael Schmitz {
182*3109e5aeSMichael Schmitz 	return readb(esp->regs + (reg * 4UL));
183*3109e5aeSMichael Schmitz }
184*3109e5aeSMichael Schmitz 
185*3109e5aeSMichael Schmitz static dma_addr_t zorro_esp_map_single(struct esp *esp, void *buf,
186*3109e5aeSMichael Schmitz 				      size_t sz, int dir)
187*3109e5aeSMichael Schmitz {
188*3109e5aeSMichael Schmitz 	return dma_map_single(esp->dev, buf, sz, dir);
189*3109e5aeSMichael Schmitz }
190*3109e5aeSMichael Schmitz 
191*3109e5aeSMichael Schmitz static int zorro_esp_map_sg(struct esp *esp, struct scatterlist *sg,
192*3109e5aeSMichael Schmitz 				  int num_sg, int dir)
193*3109e5aeSMichael Schmitz {
194*3109e5aeSMichael Schmitz 	return dma_map_sg(esp->dev, sg, num_sg, dir);
195*3109e5aeSMichael Schmitz }
196*3109e5aeSMichael Schmitz 
197*3109e5aeSMichael Schmitz static void zorro_esp_unmap_single(struct esp *esp, dma_addr_t addr,
198*3109e5aeSMichael Schmitz 				  size_t sz, int dir)
199*3109e5aeSMichael Schmitz {
200*3109e5aeSMichael Schmitz 	dma_unmap_single(esp->dev, addr, sz, dir);
201*3109e5aeSMichael Schmitz }
202*3109e5aeSMichael Schmitz 
203*3109e5aeSMichael Schmitz static void zorro_esp_unmap_sg(struct esp *esp, struct scatterlist *sg,
204*3109e5aeSMichael Schmitz 			      int num_sg, int dir)
205*3109e5aeSMichael Schmitz {
206*3109e5aeSMichael Schmitz 	dma_unmap_sg(esp->dev, sg, num_sg, dir);
207*3109e5aeSMichael Schmitz }
208*3109e5aeSMichael Schmitz 
209*3109e5aeSMichael Schmitz static int zorro_esp_irq_pending(struct esp *esp)
210*3109e5aeSMichael Schmitz {
211*3109e5aeSMichael Schmitz 	/* check ESP status register; DMA has no status reg. */
212*3109e5aeSMichael Schmitz 	if (zorro_esp_read8(esp, ESP_STATUS) & ESP_STAT_INTR)
213*3109e5aeSMichael Schmitz 		return 1;
214*3109e5aeSMichael Schmitz 
215*3109e5aeSMichael Schmitz 	return 0;
216*3109e5aeSMichael Schmitz }
217*3109e5aeSMichael Schmitz 
218*3109e5aeSMichael Schmitz static int cyber_esp_irq_pending(struct esp *esp)
219*3109e5aeSMichael Schmitz {
220*3109e5aeSMichael Schmitz 	struct cyber_dma_registers __iomem *dregs = esp->dma_regs;
221*3109e5aeSMichael Schmitz 	unsigned char dma_status = readb(&dregs->cond_reg);
222*3109e5aeSMichael Schmitz 
223*3109e5aeSMichael Schmitz 	/* It's important to check the DMA IRQ bit in the correct way! */
224*3109e5aeSMichael Schmitz 	return ((zorro_esp_read8(esp, ESP_STATUS) & ESP_STAT_INTR) &&
225*3109e5aeSMichael Schmitz 		(dma_status & CYBER_DMA_HNDL_INTR));
226*3109e5aeSMichael Schmitz }
227*3109e5aeSMichael Schmitz 
228*3109e5aeSMichael Schmitz static int fastlane_esp_irq_pending(struct esp *esp)
229*3109e5aeSMichael Schmitz {
230*3109e5aeSMichael Schmitz 	struct fastlane_dma_registers __iomem *dregs = esp->dma_regs;
231*3109e5aeSMichael Schmitz 	unsigned char dma_status;
232*3109e5aeSMichael Schmitz 
233*3109e5aeSMichael Schmitz 	dma_status = readb(&dregs->cond_reg);
234*3109e5aeSMichael Schmitz 
235*3109e5aeSMichael Schmitz 	if (dma_status & FASTLANE_DMA_IACT)
236*3109e5aeSMichael Schmitz 		return 0;	/* not our IRQ */
237*3109e5aeSMichael Schmitz 
238*3109e5aeSMichael Schmitz 	/* Return non-zero if ESP requested IRQ */
239*3109e5aeSMichael Schmitz 	return (
240*3109e5aeSMichael Schmitz 	   (dma_status & FASTLANE_DMA_CREQ) &&
241*3109e5aeSMichael Schmitz 	   (!(dma_status & FASTLANE_DMA_MINT)) &&
242*3109e5aeSMichael Schmitz 	   (zorro_esp_read8(esp, ESP_STATUS) & ESP_STAT_INTR));
243*3109e5aeSMichael Schmitz }
244*3109e5aeSMichael Schmitz 
245*3109e5aeSMichael Schmitz static u32 zorro_esp_dma_length_limit(struct esp *esp, u32 dma_addr,
246*3109e5aeSMichael Schmitz 					u32 dma_len)
247*3109e5aeSMichael Schmitz {
248*3109e5aeSMichael Schmitz 	return dma_len > 0xFFFFFF ? 0xFFFFFF : dma_len;
249*3109e5aeSMichael Schmitz }
250*3109e5aeSMichael Schmitz 
251*3109e5aeSMichael Schmitz static void zorro_esp_reset_dma(struct esp *esp)
252*3109e5aeSMichael Schmitz {
253*3109e5aeSMichael Schmitz 	/* nothing to do here */
254*3109e5aeSMichael Schmitz }
255*3109e5aeSMichael Schmitz 
256*3109e5aeSMichael Schmitz static void zorro_esp_dma_drain(struct esp *esp)
257*3109e5aeSMichael Schmitz {
258*3109e5aeSMichael Schmitz 	/* nothing to do here */
259*3109e5aeSMichael Schmitz }
260*3109e5aeSMichael Schmitz 
261*3109e5aeSMichael Schmitz static void zorro_esp_dma_invalidate(struct esp *esp)
262*3109e5aeSMichael Schmitz {
263*3109e5aeSMichael Schmitz 	/* nothing to do here */
264*3109e5aeSMichael Schmitz }
265*3109e5aeSMichael Schmitz 
266*3109e5aeSMichael Schmitz static void fastlane_esp_dma_invalidate(struct esp *esp)
267*3109e5aeSMichael Schmitz {
268*3109e5aeSMichael Schmitz 	struct zorro_esp_priv *zep = dev_get_drvdata(esp->dev);
269*3109e5aeSMichael Schmitz 	struct fastlane_dma_registers __iomem *dregs = esp->dma_regs;
270*3109e5aeSMichael Schmitz 	unsigned char *ctrl_data = &zep->ctrl_data;
271*3109e5aeSMichael Schmitz 
272*3109e5aeSMichael Schmitz 	*ctrl_data = (*ctrl_data & FASTLANE_DMA_MASK);
273*3109e5aeSMichael Schmitz 	writeb(0, &dregs->clear_strobe);
274*3109e5aeSMichael Schmitz 	z_writel(0, zep->board_base);
275*3109e5aeSMichael Schmitz }
276*3109e5aeSMichael Schmitz 
277*3109e5aeSMichael Schmitz /*
278*3109e5aeSMichael Schmitz  * Programmed IO routines follow.
279*3109e5aeSMichael Schmitz  */
280*3109e5aeSMichael Schmitz 
281*3109e5aeSMichael Schmitz static inline unsigned int zorro_esp_wait_for_fifo(struct esp *esp)
282*3109e5aeSMichael Schmitz {
283*3109e5aeSMichael Schmitz 	int i = 500000;
284*3109e5aeSMichael Schmitz 
285*3109e5aeSMichael Schmitz 	do {
286*3109e5aeSMichael Schmitz 		unsigned int fbytes = zorro_esp_read8(esp, ESP_FFLAGS)
287*3109e5aeSMichael Schmitz 							& ESP_FF_FBYTES;
288*3109e5aeSMichael Schmitz 
289*3109e5aeSMichael Schmitz 		if (fbytes)
290*3109e5aeSMichael Schmitz 			return fbytes;
291*3109e5aeSMichael Schmitz 
292*3109e5aeSMichael Schmitz 		udelay(2);
293*3109e5aeSMichael Schmitz 	} while (--i);
294*3109e5aeSMichael Schmitz 
295*3109e5aeSMichael Schmitz 	pr_err("FIFO is empty (sreg %02x)\n",
296*3109e5aeSMichael Schmitz 	       zorro_esp_read8(esp, ESP_STATUS));
297*3109e5aeSMichael Schmitz 	return 0;
298*3109e5aeSMichael Schmitz }
299*3109e5aeSMichael Schmitz 
300*3109e5aeSMichael Schmitz static inline int zorro_esp_wait_for_intr(struct esp *esp)
301*3109e5aeSMichael Schmitz {
302*3109e5aeSMichael Schmitz 	struct zorro_esp_priv *zep = dev_get_drvdata(esp->dev);
303*3109e5aeSMichael Schmitz 	int i = 500000;
304*3109e5aeSMichael Schmitz 
305*3109e5aeSMichael Schmitz 	do {
306*3109e5aeSMichael Schmitz 		esp->sreg = zorro_esp_read8(esp, ESP_STATUS);
307*3109e5aeSMichael Schmitz 		if (esp->sreg & ESP_STAT_INTR)
308*3109e5aeSMichael Schmitz 			return 0;
309*3109e5aeSMichael Schmitz 
310*3109e5aeSMichael Schmitz 		udelay(2);
311*3109e5aeSMichael Schmitz 	} while (--i);
312*3109e5aeSMichael Schmitz 
313*3109e5aeSMichael Schmitz 	pr_err("IRQ timeout (sreg %02x)\n", esp->sreg);
314*3109e5aeSMichael Schmitz 	zep->error = 1;
315*3109e5aeSMichael Schmitz 	return 1;
316*3109e5aeSMichael Schmitz }
317*3109e5aeSMichael Schmitz 
318*3109e5aeSMichael Schmitz /*
319*3109e5aeSMichael Schmitz  * PIO macros as used in mac_esp.c.
320*3109e5aeSMichael Schmitz  * Note that addr and fifo arguments are local-scope variables declared
321*3109e5aeSMichael Schmitz  * in zorro_esp_send_pio_cmd(), the macros are only used in that function,
322*3109e5aeSMichael Schmitz  * and addr and fifo are referenced in each use of the macros so there
323*3109e5aeSMichael Schmitz  * is no need to pass them as macro parameters.
324*3109e5aeSMichael Schmitz  */
325*3109e5aeSMichael Schmitz #define ZORRO_ESP_PIO_LOOP(operands, reg1) \
326*3109e5aeSMichael Schmitz 	asm volatile ( \
327*3109e5aeSMichael Schmitz 	     "1:     moveb " operands "\n" \
328*3109e5aeSMichael Schmitz 	     "       subqw #1,%1       \n" \
329*3109e5aeSMichael Schmitz 	     "       jbne 1b           \n" \
330*3109e5aeSMichael Schmitz 	     : "+a" (addr), "+r" (reg1) \
331*3109e5aeSMichael Schmitz 	     : "a" (fifo));
332*3109e5aeSMichael Schmitz 
333*3109e5aeSMichael Schmitz #define ZORRO_ESP_PIO_FILL(operands, reg1) \
334*3109e5aeSMichael Schmitz 	asm volatile ( \
335*3109e5aeSMichael Schmitz 	     "       moveb " operands "\n" \
336*3109e5aeSMichael Schmitz 	     "       moveb " operands "\n" \
337*3109e5aeSMichael Schmitz 	     "       moveb " operands "\n" \
338*3109e5aeSMichael Schmitz 	     "       moveb " operands "\n" \
339*3109e5aeSMichael Schmitz 	     "       moveb " operands "\n" \
340*3109e5aeSMichael Schmitz 	     "       moveb " operands "\n" \
341*3109e5aeSMichael Schmitz 	     "       moveb " operands "\n" \
342*3109e5aeSMichael Schmitz 	     "       moveb " operands "\n" \
343*3109e5aeSMichael Schmitz 	     "       moveb " operands "\n" \
344*3109e5aeSMichael Schmitz 	     "       moveb " operands "\n" \
345*3109e5aeSMichael Schmitz 	     "       moveb " operands "\n" \
346*3109e5aeSMichael Schmitz 	     "       moveb " operands "\n" \
347*3109e5aeSMichael Schmitz 	     "       moveb " operands "\n" \
348*3109e5aeSMichael Schmitz 	     "       moveb " operands "\n" \
349*3109e5aeSMichael Schmitz 	     "       moveb " operands "\n" \
350*3109e5aeSMichael Schmitz 	     "       moveb " operands "\n" \
351*3109e5aeSMichael Schmitz 	     "       subqw #8,%1       \n" \
352*3109e5aeSMichael Schmitz 	     "       subqw #8,%1       \n" \
353*3109e5aeSMichael Schmitz 	     : "+a" (addr), "+r" (reg1) \
354*3109e5aeSMichael Schmitz 	     : "a" (fifo));
355*3109e5aeSMichael Schmitz 
356*3109e5aeSMichael Schmitz #define ZORRO_ESP_FIFO_SIZE 16
357*3109e5aeSMichael Schmitz 
358*3109e5aeSMichael Schmitz static void zorro_esp_send_pio_cmd(struct esp *esp, u32 addr, u32 esp_count,
359*3109e5aeSMichael Schmitz 				 u32 dma_count, int write, u8 cmd)
360*3109e5aeSMichael Schmitz {
361*3109e5aeSMichael Schmitz 	struct zorro_esp_priv *zep = dev_get_drvdata(esp->dev);
362*3109e5aeSMichael Schmitz 	u8 __iomem *fifo = esp->regs + ESP_FDATA * 16;
363*3109e5aeSMichael Schmitz 	u8 phase = esp->sreg & ESP_STAT_PMASK;
364*3109e5aeSMichael Schmitz 
365*3109e5aeSMichael Schmitz 	cmd &= ~ESP_CMD_DMA;
366*3109e5aeSMichael Schmitz 
367*3109e5aeSMichael Schmitz 	if (write) {
368*3109e5aeSMichael Schmitz 		u8 *dst = (u8 *)addr;
369*3109e5aeSMichael Schmitz 		u8 mask = ~(phase == ESP_MIP ? ESP_INTR_FDONE : ESP_INTR_BSERV);
370*3109e5aeSMichael Schmitz 
371*3109e5aeSMichael Schmitz 		scsi_esp_cmd(esp, cmd);
372*3109e5aeSMichael Schmitz 
373*3109e5aeSMichael Schmitz 		while (1) {
374*3109e5aeSMichael Schmitz 			if (!zorro_esp_wait_for_fifo(esp))
375*3109e5aeSMichael Schmitz 				break;
376*3109e5aeSMichael Schmitz 
377*3109e5aeSMichael Schmitz 			*dst++ = zorro_esp_read8(esp, ESP_FDATA);
378*3109e5aeSMichael Schmitz 			--esp_count;
379*3109e5aeSMichael Schmitz 
380*3109e5aeSMichael Schmitz 			if (!esp_count)
381*3109e5aeSMichael Schmitz 				break;
382*3109e5aeSMichael Schmitz 
383*3109e5aeSMichael Schmitz 			if (zorro_esp_wait_for_intr(esp))
384*3109e5aeSMichael Schmitz 				break;
385*3109e5aeSMichael Schmitz 
386*3109e5aeSMichael Schmitz 			if ((esp->sreg & ESP_STAT_PMASK) != phase)
387*3109e5aeSMichael Schmitz 				break;
388*3109e5aeSMichael Schmitz 
389*3109e5aeSMichael Schmitz 			esp->ireg = zorro_esp_read8(esp, ESP_INTRPT);
390*3109e5aeSMichael Schmitz 			if (esp->ireg & mask) {
391*3109e5aeSMichael Schmitz 				zep->error = 1;
392*3109e5aeSMichael Schmitz 				break;
393*3109e5aeSMichael Schmitz 			}
394*3109e5aeSMichael Schmitz 
395*3109e5aeSMichael Schmitz 			if (phase == ESP_MIP)
396*3109e5aeSMichael Schmitz 				scsi_esp_cmd(esp, ESP_CMD_MOK);
397*3109e5aeSMichael Schmitz 
398*3109e5aeSMichael Schmitz 			scsi_esp_cmd(esp, ESP_CMD_TI);
399*3109e5aeSMichael Schmitz 		}
400*3109e5aeSMichael Schmitz 	} else {	/* unused, as long as we only handle MIP here */
401*3109e5aeSMichael Schmitz 		scsi_esp_cmd(esp, ESP_CMD_FLUSH);
402*3109e5aeSMichael Schmitz 
403*3109e5aeSMichael Schmitz 		if (esp_count >= ZORRO_ESP_FIFO_SIZE)
404*3109e5aeSMichael Schmitz 			ZORRO_ESP_PIO_FILL("%0@+,%2@", esp_count)
405*3109e5aeSMichael Schmitz 		else
406*3109e5aeSMichael Schmitz 			ZORRO_ESP_PIO_LOOP("%0@+,%2@", esp_count)
407*3109e5aeSMichael Schmitz 
408*3109e5aeSMichael Schmitz 		scsi_esp_cmd(esp, cmd);
409*3109e5aeSMichael Schmitz 
410*3109e5aeSMichael Schmitz 		while (esp_count) {
411*3109e5aeSMichael Schmitz 			unsigned int n;
412*3109e5aeSMichael Schmitz 
413*3109e5aeSMichael Schmitz 			if (zorro_esp_wait_for_intr(esp))
414*3109e5aeSMichael Schmitz 				break;
415*3109e5aeSMichael Schmitz 
416*3109e5aeSMichael Schmitz 			if ((esp->sreg & ESP_STAT_PMASK) != phase)
417*3109e5aeSMichael Schmitz 				break;
418*3109e5aeSMichael Schmitz 
419*3109e5aeSMichael Schmitz 			esp->ireg = zorro_esp_read8(esp, ESP_INTRPT);
420*3109e5aeSMichael Schmitz 			if (esp->ireg & ~ESP_INTR_BSERV) {
421*3109e5aeSMichael Schmitz 				zep->error = 1;
422*3109e5aeSMichael Schmitz 				break;
423*3109e5aeSMichael Schmitz 			}
424*3109e5aeSMichael Schmitz 
425*3109e5aeSMichael Schmitz 			n = ZORRO_ESP_FIFO_SIZE -
426*3109e5aeSMichael Schmitz 			    (zorro_esp_read8(esp, ESP_FFLAGS) & ESP_FF_FBYTES);
427*3109e5aeSMichael Schmitz 			if (n > esp_count)
428*3109e5aeSMichael Schmitz 				n = esp_count;
429*3109e5aeSMichael Schmitz 
430*3109e5aeSMichael Schmitz 			if (n == ZORRO_ESP_FIFO_SIZE)
431*3109e5aeSMichael Schmitz 				ZORRO_ESP_PIO_FILL("%0@+,%2@", esp_count)
432*3109e5aeSMichael Schmitz 			else {
433*3109e5aeSMichael Schmitz 				esp_count -= n;
434*3109e5aeSMichael Schmitz 				ZORRO_ESP_PIO_LOOP("%0@+,%2@", n)
435*3109e5aeSMichael Schmitz 			}
436*3109e5aeSMichael Schmitz 
437*3109e5aeSMichael Schmitz 			scsi_esp_cmd(esp, ESP_CMD_TI);
438*3109e5aeSMichael Schmitz 		}
439*3109e5aeSMichael Schmitz 	}
440*3109e5aeSMichael Schmitz }
441*3109e5aeSMichael Schmitz 
442*3109e5aeSMichael Schmitz /* Blizzard 1230/60 SCSI-IV DMA */
443*3109e5aeSMichael Schmitz 
444*3109e5aeSMichael Schmitz static void zorro_esp_send_blz1230_dma_cmd(struct esp *esp, u32 addr,
445*3109e5aeSMichael Schmitz 			u32 esp_count, u32 dma_count, int write, u8 cmd)
446*3109e5aeSMichael Schmitz {
447*3109e5aeSMichael Schmitz 	struct zorro_esp_priv *zep = dev_get_drvdata(esp->dev);
448*3109e5aeSMichael Schmitz 	struct blz1230_dma_registers __iomem *dregs = esp->dma_regs;
449*3109e5aeSMichael Schmitz 	u8 phase = esp->sreg & ESP_STAT_PMASK;
450*3109e5aeSMichael Schmitz 
451*3109e5aeSMichael Schmitz 	zep->error = 0;
452*3109e5aeSMichael Schmitz 	/*
453*3109e5aeSMichael Schmitz 	 * Use PIO if transferring message bytes to esp->command_block_dma.
454*3109e5aeSMichael Schmitz 	 * PIO requires a virtual address, so substitute esp->command_block
455*3109e5aeSMichael Schmitz 	 * for addr.
456*3109e5aeSMichael Schmitz 	 */
457*3109e5aeSMichael Schmitz 	if (phase == ESP_MIP && addr == esp->command_block_dma) {
458*3109e5aeSMichael Schmitz 		zorro_esp_send_pio_cmd(esp, (u32) esp->command_block,
459*3109e5aeSMichael Schmitz 					esp_count, dma_count, write, cmd);
460*3109e5aeSMichael Schmitz 		return;
461*3109e5aeSMichael Schmitz 	}
462*3109e5aeSMichael Schmitz 
463*3109e5aeSMichael Schmitz 	if (write)
464*3109e5aeSMichael Schmitz 		/* DMA receive */
465*3109e5aeSMichael Schmitz 		dma_sync_single_for_device(esp->dev, addr, esp_count,
466*3109e5aeSMichael Schmitz 				DMA_FROM_DEVICE);
467*3109e5aeSMichael Schmitz 	else
468*3109e5aeSMichael Schmitz 		/* DMA send */
469*3109e5aeSMichael Schmitz 		dma_sync_single_for_device(esp->dev, addr, esp_count,
470*3109e5aeSMichael Schmitz 				DMA_TO_DEVICE);
471*3109e5aeSMichael Schmitz 
472*3109e5aeSMichael Schmitz 	addr >>= 1;
473*3109e5aeSMichael Schmitz 	if (write)
474*3109e5aeSMichael Schmitz 		addr &= ~(DMA_WRITE);
475*3109e5aeSMichael Schmitz 	else
476*3109e5aeSMichael Schmitz 		addr |= DMA_WRITE;
477*3109e5aeSMichael Schmitz 
478*3109e5aeSMichael Schmitz 	writeb((addr >> 24) & 0xff, &dregs->dma_latch);
479*3109e5aeSMichael Schmitz 	writeb((addr >> 24) & 0xff, &dregs->dma_addr);
480*3109e5aeSMichael Schmitz 	writeb((addr >> 16) & 0xff, &dregs->dma_addr);
481*3109e5aeSMichael Schmitz 	writeb((addr >>  8) & 0xff, &dregs->dma_addr);
482*3109e5aeSMichael Schmitz 	writeb(addr & 0xff, &dregs->dma_addr);
483*3109e5aeSMichael Schmitz 
484*3109e5aeSMichael Schmitz 	scsi_esp_cmd(esp, ESP_CMD_DMA);
485*3109e5aeSMichael Schmitz 	zorro_esp_write8(esp, (esp_count >> 0) & 0xff, ESP_TCLOW);
486*3109e5aeSMichael Schmitz 	zorro_esp_write8(esp, (esp_count >> 8) & 0xff, ESP_TCMED);
487*3109e5aeSMichael Schmitz 	zorro_esp_write8(esp, (esp_count >> 16) & 0xff, ESP_TCHI);
488*3109e5aeSMichael Schmitz 
489*3109e5aeSMichael Schmitz 	scsi_esp_cmd(esp, cmd);
490*3109e5aeSMichael Schmitz }
491*3109e5aeSMichael Schmitz 
492*3109e5aeSMichael Schmitz /* Blizzard 1230-II DMA */
493*3109e5aeSMichael Schmitz 
494*3109e5aeSMichael Schmitz static void zorro_esp_send_blz1230II_dma_cmd(struct esp *esp, u32 addr,
495*3109e5aeSMichael Schmitz 			u32 esp_count, u32 dma_count, int write, u8 cmd)
496*3109e5aeSMichael Schmitz {
497*3109e5aeSMichael Schmitz 	struct zorro_esp_priv *zep = dev_get_drvdata(esp->dev);
498*3109e5aeSMichael Schmitz 	struct blz1230II_dma_registers __iomem *dregs = esp->dma_regs;
499*3109e5aeSMichael Schmitz 	u8 phase = esp->sreg & ESP_STAT_PMASK;
500*3109e5aeSMichael Schmitz 
501*3109e5aeSMichael Schmitz 	zep->error = 0;
502*3109e5aeSMichael Schmitz 	/* Use PIO if transferring message bytes to esp->command_block_dma */
503*3109e5aeSMichael Schmitz 	if (phase == ESP_MIP && addr == esp->command_block_dma) {
504*3109e5aeSMichael Schmitz 		zorro_esp_send_pio_cmd(esp, (u32) esp->command_block,
505*3109e5aeSMichael Schmitz 					esp_count, dma_count, write, cmd);
506*3109e5aeSMichael Schmitz 		return;
507*3109e5aeSMichael Schmitz 	}
508*3109e5aeSMichael Schmitz 
509*3109e5aeSMichael Schmitz 	if (write)
510*3109e5aeSMichael Schmitz 		/* DMA receive */
511*3109e5aeSMichael Schmitz 		dma_sync_single_for_device(esp->dev, addr, esp_count,
512*3109e5aeSMichael Schmitz 				DMA_FROM_DEVICE);
513*3109e5aeSMichael Schmitz 	else
514*3109e5aeSMichael Schmitz 		/* DMA send */
515*3109e5aeSMichael Schmitz 		dma_sync_single_for_device(esp->dev, addr, esp_count,
516*3109e5aeSMichael Schmitz 				DMA_TO_DEVICE);
517*3109e5aeSMichael Schmitz 
518*3109e5aeSMichael Schmitz 	addr >>= 1;
519*3109e5aeSMichael Schmitz 	if (write)
520*3109e5aeSMichael Schmitz 		addr &= ~(DMA_WRITE);
521*3109e5aeSMichael Schmitz 	else
522*3109e5aeSMichael Schmitz 		addr |= DMA_WRITE;
523*3109e5aeSMichael Schmitz 
524*3109e5aeSMichael Schmitz 	writeb((addr >> 24) & 0xff, &dregs->dma_latch);
525*3109e5aeSMichael Schmitz 	writeb((addr >> 16) & 0xff, &dregs->dma_addr);
526*3109e5aeSMichael Schmitz 	writeb((addr >>  8) & 0xff, &dregs->dma_addr);
527*3109e5aeSMichael Schmitz 	writeb(addr & 0xff, &dregs->dma_addr);
528*3109e5aeSMichael Schmitz 
529*3109e5aeSMichael Schmitz 	scsi_esp_cmd(esp, ESP_CMD_DMA);
530*3109e5aeSMichael Schmitz 	zorro_esp_write8(esp, (esp_count >> 0) & 0xff, ESP_TCLOW);
531*3109e5aeSMichael Schmitz 	zorro_esp_write8(esp, (esp_count >> 8) & 0xff, ESP_TCMED);
532*3109e5aeSMichael Schmitz 	zorro_esp_write8(esp, (esp_count >> 16) & 0xff, ESP_TCHI);
533*3109e5aeSMichael Schmitz 
534*3109e5aeSMichael Schmitz 	scsi_esp_cmd(esp, cmd);
535*3109e5aeSMichael Schmitz }
536*3109e5aeSMichael Schmitz 
537*3109e5aeSMichael Schmitz /* Blizzard 2060 DMA */
538*3109e5aeSMichael Schmitz 
539*3109e5aeSMichael Schmitz static void zorro_esp_send_blz2060_dma_cmd(struct esp *esp, u32 addr,
540*3109e5aeSMichael Schmitz 			u32 esp_count, u32 dma_count, int write, u8 cmd)
541*3109e5aeSMichael Schmitz {
542*3109e5aeSMichael Schmitz 	struct zorro_esp_priv *zep = dev_get_drvdata(esp->dev);
543*3109e5aeSMichael Schmitz 	struct blz2060_dma_registers __iomem *dregs = esp->dma_regs;
544*3109e5aeSMichael Schmitz 	u8 phase = esp->sreg & ESP_STAT_PMASK;
545*3109e5aeSMichael Schmitz 
546*3109e5aeSMichael Schmitz 	zep->error = 0;
547*3109e5aeSMichael Schmitz 	/* Use PIO if transferring message bytes to esp->command_block_dma */
548*3109e5aeSMichael Schmitz 	if (phase == ESP_MIP && addr == esp->command_block_dma) {
549*3109e5aeSMichael Schmitz 		zorro_esp_send_pio_cmd(esp, (u32) esp->command_block,
550*3109e5aeSMichael Schmitz 					esp_count, dma_count, write, cmd);
551*3109e5aeSMichael Schmitz 		return;
552*3109e5aeSMichael Schmitz 	}
553*3109e5aeSMichael Schmitz 
554*3109e5aeSMichael Schmitz 	if (write)
555*3109e5aeSMichael Schmitz 		/* DMA receive */
556*3109e5aeSMichael Schmitz 		dma_sync_single_for_device(esp->dev, addr, esp_count,
557*3109e5aeSMichael Schmitz 				DMA_FROM_DEVICE);
558*3109e5aeSMichael Schmitz 	else
559*3109e5aeSMichael Schmitz 		/* DMA send */
560*3109e5aeSMichael Schmitz 		dma_sync_single_for_device(esp->dev, addr, esp_count,
561*3109e5aeSMichael Schmitz 				DMA_TO_DEVICE);
562*3109e5aeSMichael Schmitz 
563*3109e5aeSMichael Schmitz 	addr >>= 1;
564*3109e5aeSMichael Schmitz 	if (write)
565*3109e5aeSMichael Schmitz 		addr &= ~(DMA_WRITE);
566*3109e5aeSMichael Schmitz 	else
567*3109e5aeSMichael Schmitz 		addr |= DMA_WRITE;
568*3109e5aeSMichael Schmitz 
569*3109e5aeSMichael Schmitz 	writeb(addr & 0xff, &dregs->dma_addr3);
570*3109e5aeSMichael Schmitz 	writeb((addr >>  8) & 0xff, &dregs->dma_addr2);
571*3109e5aeSMichael Schmitz 	writeb((addr >> 16) & 0xff, &dregs->dma_addr1);
572*3109e5aeSMichael Schmitz 	writeb((addr >> 24) & 0xff, &dregs->dma_addr0);
573*3109e5aeSMichael Schmitz 
574*3109e5aeSMichael Schmitz 	scsi_esp_cmd(esp, ESP_CMD_DMA);
575*3109e5aeSMichael Schmitz 	zorro_esp_write8(esp, (esp_count >> 0) & 0xff, ESP_TCLOW);
576*3109e5aeSMichael Schmitz 	zorro_esp_write8(esp, (esp_count >> 8) & 0xff, ESP_TCMED);
577*3109e5aeSMichael Schmitz 	zorro_esp_write8(esp, (esp_count >> 16) & 0xff, ESP_TCHI);
578*3109e5aeSMichael Schmitz 
579*3109e5aeSMichael Schmitz 	scsi_esp_cmd(esp, cmd);
580*3109e5aeSMichael Schmitz }
581*3109e5aeSMichael Schmitz 
582*3109e5aeSMichael Schmitz /* Cyberstorm I DMA */
583*3109e5aeSMichael Schmitz 
584*3109e5aeSMichael Schmitz static void zorro_esp_send_cyber_dma_cmd(struct esp *esp, u32 addr,
585*3109e5aeSMichael Schmitz 			u32 esp_count, u32 dma_count, int write, u8 cmd)
586*3109e5aeSMichael Schmitz {
587*3109e5aeSMichael Schmitz 	struct zorro_esp_priv *zep = dev_get_drvdata(esp->dev);
588*3109e5aeSMichael Schmitz 	struct cyber_dma_registers __iomem *dregs = esp->dma_regs;
589*3109e5aeSMichael Schmitz 	u8 phase = esp->sreg & ESP_STAT_PMASK;
590*3109e5aeSMichael Schmitz 	unsigned char *ctrl_data = &zep->ctrl_data;
591*3109e5aeSMichael Schmitz 
592*3109e5aeSMichael Schmitz 	zep->error = 0;
593*3109e5aeSMichael Schmitz 	/* Use PIO if transferring message bytes to esp->command_block_dma */
594*3109e5aeSMichael Schmitz 	if (phase == ESP_MIP && addr == esp->command_block_dma) {
595*3109e5aeSMichael Schmitz 		zorro_esp_send_pio_cmd(esp, (u32) esp->command_block,
596*3109e5aeSMichael Schmitz 					esp_count, dma_count, write, cmd);
597*3109e5aeSMichael Schmitz 		return;
598*3109e5aeSMichael Schmitz 	}
599*3109e5aeSMichael Schmitz 
600*3109e5aeSMichael Schmitz 	zorro_esp_write8(esp, (esp_count >> 0) & 0xff, ESP_TCLOW);
601*3109e5aeSMichael Schmitz 	zorro_esp_write8(esp, (esp_count >> 8) & 0xff, ESP_TCMED);
602*3109e5aeSMichael Schmitz 	zorro_esp_write8(esp, (esp_count >> 16) & 0xff, ESP_TCHI);
603*3109e5aeSMichael Schmitz 
604*3109e5aeSMichael Schmitz 	if (write) {
605*3109e5aeSMichael Schmitz 		/* DMA receive */
606*3109e5aeSMichael Schmitz 		dma_sync_single_for_device(esp->dev, addr, esp_count,
607*3109e5aeSMichael Schmitz 				DMA_FROM_DEVICE);
608*3109e5aeSMichael Schmitz 		addr &= ~(1);
609*3109e5aeSMichael Schmitz 	} else {
610*3109e5aeSMichael Schmitz 		/* DMA send */
611*3109e5aeSMichael Schmitz 		dma_sync_single_for_device(esp->dev, addr, esp_count,
612*3109e5aeSMichael Schmitz 				DMA_TO_DEVICE);
613*3109e5aeSMichael Schmitz 		addr |= 1;
614*3109e5aeSMichael Schmitz 	}
615*3109e5aeSMichael Schmitz 
616*3109e5aeSMichael Schmitz 	writeb((addr >> 24) & 0xff, &dregs->dma_addr0);
617*3109e5aeSMichael Schmitz 	writeb((addr >> 16) & 0xff, &dregs->dma_addr1);
618*3109e5aeSMichael Schmitz 	writeb((addr >>  8) & 0xff, &dregs->dma_addr2);
619*3109e5aeSMichael Schmitz 	writeb(addr & 0xff, &dregs->dma_addr3);
620*3109e5aeSMichael Schmitz 
621*3109e5aeSMichael Schmitz 	if (write)
622*3109e5aeSMichael Schmitz 		*ctrl_data &= ~(CYBER_DMA_WRITE);
623*3109e5aeSMichael Schmitz 	else
624*3109e5aeSMichael Schmitz 		*ctrl_data |= CYBER_DMA_WRITE;
625*3109e5aeSMichael Schmitz 
626*3109e5aeSMichael Schmitz 	*ctrl_data &= ~(CYBER_DMA_Z3);	/* Z2, do 16 bit DMA */
627*3109e5aeSMichael Schmitz 
628*3109e5aeSMichael Schmitz 	writeb(*ctrl_data, &dregs->ctrl_reg);
629*3109e5aeSMichael Schmitz 
630*3109e5aeSMichael Schmitz 	scsi_esp_cmd(esp, cmd);
631*3109e5aeSMichael Schmitz }
632*3109e5aeSMichael Schmitz 
633*3109e5aeSMichael Schmitz /* Cyberstorm II DMA */
634*3109e5aeSMichael Schmitz 
635*3109e5aeSMichael Schmitz static void zorro_esp_send_cyberII_dma_cmd(struct esp *esp, u32 addr,
636*3109e5aeSMichael Schmitz 			u32 esp_count, u32 dma_count, int write, u8 cmd)
637*3109e5aeSMichael Schmitz {
638*3109e5aeSMichael Schmitz 	struct zorro_esp_priv *zep = dev_get_drvdata(esp->dev);
639*3109e5aeSMichael Schmitz 	struct cyberII_dma_registers __iomem *dregs = esp->dma_regs;
640*3109e5aeSMichael Schmitz 	u8 phase = esp->sreg & ESP_STAT_PMASK;
641*3109e5aeSMichael Schmitz 
642*3109e5aeSMichael Schmitz 	zep->error = 0;
643*3109e5aeSMichael Schmitz 	/* Use PIO if transferring message bytes to esp->command_block_dma */
644*3109e5aeSMichael Schmitz 	if (phase == ESP_MIP && addr == esp->command_block_dma) {
645*3109e5aeSMichael Schmitz 		zorro_esp_send_pio_cmd(esp, (u32) esp->command_block,
646*3109e5aeSMichael Schmitz 					esp_count, dma_count, write, cmd);
647*3109e5aeSMichael Schmitz 		return;
648*3109e5aeSMichael Schmitz 	}
649*3109e5aeSMichael Schmitz 
650*3109e5aeSMichael Schmitz 	zorro_esp_write8(esp, (esp_count >> 0) & 0xff, ESP_TCLOW);
651*3109e5aeSMichael Schmitz 	zorro_esp_write8(esp, (esp_count >> 8) & 0xff, ESP_TCMED);
652*3109e5aeSMichael Schmitz 	zorro_esp_write8(esp, (esp_count >> 16) & 0xff, ESP_TCHI);
653*3109e5aeSMichael Schmitz 
654*3109e5aeSMichael Schmitz 	if (write) {
655*3109e5aeSMichael Schmitz 		/* DMA receive */
656*3109e5aeSMichael Schmitz 		dma_sync_single_for_device(esp->dev, addr, esp_count,
657*3109e5aeSMichael Schmitz 				DMA_FROM_DEVICE);
658*3109e5aeSMichael Schmitz 		addr &= ~(1);
659*3109e5aeSMichael Schmitz 	} else {
660*3109e5aeSMichael Schmitz 		/* DMA send */
661*3109e5aeSMichael Schmitz 		dma_sync_single_for_device(esp->dev, addr, esp_count,
662*3109e5aeSMichael Schmitz 				DMA_TO_DEVICE);
663*3109e5aeSMichael Schmitz 		addr |= 1;
664*3109e5aeSMichael Schmitz 	}
665*3109e5aeSMichael Schmitz 
666*3109e5aeSMichael Schmitz 	writeb((addr >> 24) & 0xff, &dregs->dma_addr0);
667*3109e5aeSMichael Schmitz 	writeb((addr >> 16) & 0xff, &dregs->dma_addr1);
668*3109e5aeSMichael Schmitz 	writeb((addr >>  8) & 0xff, &dregs->dma_addr2);
669*3109e5aeSMichael Schmitz 	writeb(addr & 0xff, &dregs->dma_addr3);
670*3109e5aeSMichael Schmitz 
671*3109e5aeSMichael Schmitz 	scsi_esp_cmd(esp, cmd);
672*3109e5aeSMichael Schmitz }
673*3109e5aeSMichael Schmitz 
674*3109e5aeSMichael Schmitz /* Fastlane DMA */
675*3109e5aeSMichael Schmitz 
676*3109e5aeSMichael Schmitz static void zorro_esp_send_fastlane_dma_cmd(struct esp *esp, u32 addr,
677*3109e5aeSMichael Schmitz 			u32 esp_count, u32 dma_count, int write, u8 cmd)
678*3109e5aeSMichael Schmitz {
679*3109e5aeSMichael Schmitz 	struct zorro_esp_priv *zep = dev_get_drvdata(esp->dev);
680*3109e5aeSMichael Schmitz 	struct fastlane_dma_registers __iomem *dregs = esp->dma_regs;
681*3109e5aeSMichael Schmitz 	u8 phase = esp->sreg & ESP_STAT_PMASK;
682*3109e5aeSMichael Schmitz 	unsigned char *ctrl_data = &zep->ctrl_data;
683*3109e5aeSMichael Schmitz 
684*3109e5aeSMichael Schmitz 	zep->error = 0;
685*3109e5aeSMichael Schmitz 	/* Use PIO if transferring message bytes to esp->command_block_dma */
686*3109e5aeSMichael Schmitz 	if (phase == ESP_MIP && addr == esp->command_block_dma) {
687*3109e5aeSMichael Schmitz 		zorro_esp_send_pio_cmd(esp, (u32) esp->command_block,
688*3109e5aeSMichael Schmitz 					esp_count, dma_count, write, cmd);
689*3109e5aeSMichael Schmitz 		return;
690*3109e5aeSMichael Schmitz 	}
691*3109e5aeSMichael Schmitz 
692*3109e5aeSMichael Schmitz 	zorro_esp_write8(esp, (esp_count >> 0) & 0xff, ESP_TCLOW);
693*3109e5aeSMichael Schmitz 	zorro_esp_write8(esp, (esp_count >> 8) & 0xff, ESP_TCMED);
694*3109e5aeSMichael Schmitz 	zorro_esp_write8(esp, (esp_count >> 16) & 0xff, ESP_TCHI);
695*3109e5aeSMichael Schmitz 
696*3109e5aeSMichael Schmitz 	if (write) {
697*3109e5aeSMichael Schmitz 		/* DMA receive */
698*3109e5aeSMichael Schmitz 		dma_sync_single_for_device(esp->dev, addr, esp_count,
699*3109e5aeSMichael Schmitz 				DMA_FROM_DEVICE);
700*3109e5aeSMichael Schmitz 		addr &= ~(1);
701*3109e5aeSMichael Schmitz 	} else {
702*3109e5aeSMichael Schmitz 		/* DMA send */
703*3109e5aeSMichael Schmitz 		dma_sync_single_for_device(esp->dev, addr, esp_count,
704*3109e5aeSMichael Schmitz 				DMA_TO_DEVICE);
705*3109e5aeSMichael Schmitz 		addr |= 1;
706*3109e5aeSMichael Schmitz 	}
707*3109e5aeSMichael Schmitz 
708*3109e5aeSMichael Schmitz 	writeb(0, &dregs->clear_strobe);
709*3109e5aeSMichael Schmitz 	z_writel(addr, ((addr & 0x00ffffff) + zep->board_base));
710*3109e5aeSMichael Schmitz 
711*3109e5aeSMichael Schmitz 	if (write) {
712*3109e5aeSMichael Schmitz 		*ctrl_data = (*ctrl_data & FASTLANE_DMA_MASK) |
713*3109e5aeSMichael Schmitz 				FASTLANE_DMA_ENABLE;
714*3109e5aeSMichael Schmitz 	} else {
715*3109e5aeSMichael Schmitz 		*ctrl_data = ((*ctrl_data & FASTLANE_DMA_MASK) |
716*3109e5aeSMichael Schmitz 				FASTLANE_DMA_ENABLE |
717*3109e5aeSMichael Schmitz 				FASTLANE_DMA_WRITE);
718*3109e5aeSMichael Schmitz 	}
719*3109e5aeSMichael Schmitz 
720*3109e5aeSMichael Schmitz 	writeb(*ctrl_data, &dregs->ctrl_reg);
721*3109e5aeSMichael Schmitz 
722*3109e5aeSMichael Schmitz 	scsi_esp_cmd(esp, cmd);
723*3109e5aeSMichael Schmitz }
724*3109e5aeSMichael Schmitz 
725*3109e5aeSMichael Schmitz static int zorro_esp_dma_error(struct esp *esp)
726*3109e5aeSMichael Schmitz {
727*3109e5aeSMichael Schmitz 	struct zorro_esp_priv *zep = dev_get_drvdata(esp->dev);
728*3109e5aeSMichael Schmitz 
729*3109e5aeSMichael Schmitz 	/* check for error in case we've been doing PIO */
730*3109e5aeSMichael Schmitz 	if (zep->error == 1)
731*3109e5aeSMichael Schmitz 		return 1;
732*3109e5aeSMichael Schmitz 
733*3109e5aeSMichael Schmitz 	/* do nothing - there seems to be no way to check for DMA errors */
734*3109e5aeSMichael Schmitz 	return 0;
735*3109e5aeSMichael Schmitz }
736*3109e5aeSMichael Schmitz 
737*3109e5aeSMichael Schmitz /* per-board ESP driver ops */
738*3109e5aeSMichael Schmitz 
739*3109e5aeSMichael Schmitz static const struct esp_driver_ops blz1230_esp_ops = {
740*3109e5aeSMichael Schmitz 	.esp_write8		= zorro_esp_write8,
741*3109e5aeSMichael Schmitz 	.esp_read8		= zorro_esp_read8,
742*3109e5aeSMichael Schmitz 	.map_single		= zorro_esp_map_single,
743*3109e5aeSMichael Schmitz 	.map_sg			= zorro_esp_map_sg,
744*3109e5aeSMichael Schmitz 	.unmap_single		= zorro_esp_unmap_single,
745*3109e5aeSMichael Schmitz 	.unmap_sg		= zorro_esp_unmap_sg,
746*3109e5aeSMichael Schmitz 	.irq_pending		= zorro_esp_irq_pending,
747*3109e5aeSMichael Schmitz 	.dma_length_limit	= zorro_esp_dma_length_limit,
748*3109e5aeSMichael Schmitz 	.reset_dma		= zorro_esp_reset_dma,
749*3109e5aeSMichael Schmitz 	.dma_drain		= zorro_esp_dma_drain,
750*3109e5aeSMichael Schmitz 	.dma_invalidate		= zorro_esp_dma_invalidate,
751*3109e5aeSMichael Schmitz 	.send_dma_cmd		= zorro_esp_send_blz1230_dma_cmd,
752*3109e5aeSMichael Schmitz 	.dma_error		= zorro_esp_dma_error,
753*3109e5aeSMichael Schmitz };
754*3109e5aeSMichael Schmitz 
755*3109e5aeSMichael Schmitz static const struct esp_driver_ops blz1230II_esp_ops = {
756*3109e5aeSMichael Schmitz 	.esp_write8		= zorro_esp_write8,
757*3109e5aeSMichael Schmitz 	.esp_read8		= zorro_esp_read8,
758*3109e5aeSMichael Schmitz 	.map_single		= zorro_esp_map_single,
759*3109e5aeSMichael Schmitz 	.map_sg			= zorro_esp_map_sg,
760*3109e5aeSMichael Schmitz 	.unmap_single		= zorro_esp_unmap_single,
761*3109e5aeSMichael Schmitz 	.unmap_sg		= zorro_esp_unmap_sg,
762*3109e5aeSMichael Schmitz 	.irq_pending		= zorro_esp_irq_pending,
763*3109e5aeSMichael Schmitz 	.dma_length_limit	= zorro_esp_dma_length_limit,
764*3109e5aeSMichael Schmitz 	.reset_dma		= zorro_esp_reset_dma,
765*3109e5aeSMichael Schmitz 	.dma_drain		= zorro_esp_dma_drain,
766*3109e5aeSMichael Schmitz 	.dma_invalidate		= zorro_esp_dma_invalidate,
767*3109e5aeSMichael Schmitz 	.send_dma_cmd		= zorro_esp_send_blz1230II_dma_cmd,
768*3109e5aeSMichael Schmitz 	.dma_error		= zorro_esp_dma_error,
769*3109e5aeSMichael Schmitz };
770*3109e5aeSMichael Schmitz 
771*3109e5aeSMichael Schmitz static const struct esp_driver_ops blz2060_esp_ops = {
772*3109e5aeSMichael Schmitz 	.esp_write8		= zorro_esp_write8,
773*3109e5aeSMichael Schmitz 	.esp_read8		= zorro_esp_read8,
774*3109e5aeSMichael Schmitz 	.map_single		= zorro_esp_map_single,
775*3109e5aeSMichael Schmitz 	.map_sg			= zorro_esp_map_sg,
776*3109e5aeSMichael Schmitz 	.unmap_single		= zorro_esp_unmap_single,
777*3109e5aeSMichael Schmitz 	.unmap_sg		= zorro_esp_unmap_sg,
778*3109e5aeSMichael Schmitz 	.irq_pending		= zorro_esp_irq_pending,
779*3109e5aeSMichael Schmitz 	.dma_length_limit	= zorro_esp_dma_length_limit,
780*3109e5aeSMichael Schmitz 	.reset_dma		= zorro_esp_reset_dma,
781*3109e5aeSMichael Schmitz 	.dma_drain		= zorro_esp_dma_drain,
782*3109e5aeSMichael Schmitz 	.dma_invalidate		= zorro_esp_dma_invalidate,
783*3109e5aeSMichael Schmitz 	.send_dma_cmd		= zorro_esp_send_blz2060_dma_cmd,
784*3109e5aeSMichael Schmitz 	.dma_error		= zorro_esp_dma_error,
785*3109e5aeSMichael Schmitz };
786*3109e5aeSMichael Schmitz 
787*3109e5aeSMichael Schmitz static const struct esp_driver_ops cyber_esp_ops = {
788*3109e5aeSMichael Schmitz 	.esp_write8		= zorro_esp_write8,
789*3109e5aeSMichael Schmitz 	.esp_read8		= zorro_esp_read8,
790*3109e5aeSMichael Schmitz 	.map_single		= zorro_esp_map_single,
791*3109e5aeSMichael Schmitz 	.map_sg			= zorro_esp_map_sg,
792*3109e5aeSMichael Schmitz 	.unmap_single		= zorro_esp_unmap_single,
793*3109e5aeSMichael Schmitz 	.unmap_sg		= zorro_esp_unmap_sg,
794*3109e5aeSMichael Schmitz 	.irq_pending		= cyber_esp_irq_pending,
795*3109e5aeSMichael Schmitz 	.dma_length_limit	= zorro_esp_dma_length_limit,
796*3109e5aeSMichael Schmitz 	.reset_dma		= zorro_esp_reset_dma,
797*3109e5aeSMichael Schmitz 	.dma_drain		= zorro_esp_dma_drain,
798*3109e5aeSMichael Schmitz 	.dma_invalidate		= zorro_esp_dma_invalidate,
799*3109e5aeSMichael Schmitz 	.send_dma_cmd		= zorro_esp_send_cyber_dma_cmd,
800*3109e5aeSMichael Schmitz 	.dma_error		= zorro_esp_dma_error,
801*3109e5aeSMichael Schmitz };
802*3109e5aeSMichael Schmitz 
803*3109e5aeSMichael Schmitz static const struct esp_driver_ops cyberII_esp_ops = {
804*3109e5aeSMichael Schmitz 	.esp_write8		= zorro_esp_write8,
805*3109e5aeSMichael Schmitz 	.esp_read8		= zorro_esp_read8,
806*3109e5aeSMichael Schmitz 	.map_single		= zorro_esp_map_single,
807*3109e5aeSMichael Schmitz 	.map_sg			= zorro_esp_map_sg,
808*3109e5aeSMichael Schmitz 	.unmap_single		= zorro_esp_unmap_single,
809*3109e5aeSMichael Schmitz 	.unmap_sg		= zorro_esp_unmap_sg,
810*3109e5aeSMichael Schmitz 	.irq_pending		= zorro_esp_irq_pending,
811*3109e5aeSMichael Schmitz 	.dma_length_limit	= zorro_esp_dma_length_limit,
812*3109e5aeSMichael Schmitz 	.reset_dma		= zorro_esp_reset_dma,
813*3109e5aeSMichael Schmitz 	.dma_drain		= zorro_esp_dma_drain,
814*3109e5aeSMichael Schmitz 	.dma_invalidate		= zorro_esp_dma_invalidate,
815*3109e5aeSMichael Schmitz 	.send_dma_cmd		= zorro_esp_send_cyberII_dma_cmd,
816*3109e5aeSMichael Schmitz 	.dma_error		= zorro_esp_dma_error,
817*3109e5aeSMichael Schmitz };
818*3109e5aeSMichael Schmitz 
819*3109e5aeSMichael Schmitz static const struct esp_driver_ops fastlane_esp_ops = {
820*3109e5aeSMichael Schmitz 	.esp_write8		= zorro_esp_write8,
821*3109e5aeSMichael Schmitz 	.esp_read8		= zorro_esp_read8,
822*3109e5aeSMichael Schmitz 	.map_single		= zorro_esp_map_single,
823*3109e5aeSMichael Schmitz 	.map_sg			= zorro_esp_map_sg,
824*3109e5aeSMichael Schmitz 	.unmap_single		= zorro_esp_unmap_single,
825*3109e5aeSMichael Schmitz 	.unmap_sg		= zorro_esp_unmap_sg,
826*3109e5aeSMichael Schmitz 	.irq_pending		= fastlane_esp_irq_pending,
827*3109e5aeSMichael Schmitz 	.dma_length_limit	= zorro_esp_dma_length_limit,
828*3109e5aeSMichael Schmitz 	.reset_dma		= zorro_esp_reset_dma,
829*3109e5aeSMichael Schmitz 	.dma_drain		= zorro_esp_dma_drain,
830*3109e5aeSMichael Schmitz 	.dma_invalidate		= fastlane_esp_dma_invalidate,
831*3109e5aeSMichael Schmitz 	.send_dma_cmd		= zorro_esp_send_fastlane_dma_cmd,
832*3109e5aeSMichael Schmitz 	.dma_error		= zorro_esp_dma_error,
833*3109e5aeSMichael Schmitz };
834*3109e5aeSMichael Schmitz 
835*3109e5aeSMichael Schmitz /* Zorro driver config data */
836*3109e5aeSMichael Schmitz 
837*3109e5aeSMichael Schmitz struct zorro_driver_data {
838*3109e5aeSMichael Schmitz 	const char *name;
839*3109e5aeSMichael Schmitz 	unsigned long offset;
840*3109e5aeSMichael Schmitz 	unsigned long dma_offset;
841*3109e5aeSMichael Schmitz 	int absolute;	/* offset is absolute address */
842*3109e5aeSMichael Schmitz 	int scsi_option;
843*3109e5aeSMichael Schmitz 	const struct esp_driver_ops *esp_ops;
844*3109e5aeSMichael Schmitz };
845*3109e5aeSMichael Schmitz 
846*3109e5aeSMichael Schmitz /* board types */
847*3109e5aeSMichael Schmitz 
848*3109e5aeSMichael Schmitz enum {
849*3109e5aeSMichael Schmitz 	ZORRO_BLZ1230,
850*3109e5aeSMichael Schmitz 	ZORRO_BLZ1230II,
851*3109e5aeSMichael Schmitz 	ZORRO_BLZ2060,
852*3109e5aeSMichael Schmitz 	ZORRO_CYBER,
853*3109e5aeSMichael Schmitz 	ZORRO_CYBERII,
854*3109e5aeSMichael Schmitz 	ZORRO_FASTLANE,
855*3109e5aeSMichael Schmitz };
856*3109e5aeSMichael Schmitz 
857*3109e5aeSMichael Schmitz /* per-board config data */
858*3109e5aeSMichael Schmitz 
859*3109e5aeSMichael Schmitz static const struct zorro_driver_data zorro_esp_boards[] = {
860*3109e5aeSMichael Schmitz 	[ZORRO_BLZ1230] = {
861*3109e5aeSMichael Schmitz 				.name		= "Blizzard 1230",
862*3109e5aeSMichael Schmitz 				.offset		= 0x8000,
863*3109e5aeSMichael Schmitz 				.dma_offset	= 0x10000,
864*3109e5aeSMichael Schmitz 				.scsi_option	= 1,
865*3109e5aeSMichael Schmitz 				.esp_ops	= &blz1230_esp_ops,
866*3109e5aeSMichael Schmitz 	},
867*3109e5aeSMichael Schmitz 	[ZORRO_BLZ1230II] = {
868*3109e5aeSMichael Schmitz 				.name		= "Blizzard 1230II",
869*3109e5aeSMichael Schmitz 				.offset		= 0x10000,
870*3109e5aeSMichael Schmitz 				.dma_offset	= 0x10021,
871*3109e5aeSMichael Schmitz 				.scsi_option	= 1,
872*3109e5aeSMichael Schmitz 				.esp_ops	= &blz1230II_esp_ops,
873*3109e5aeSMichael Schmitz 	},
874*3109e5aeSMichael Schmitz 	[ZORRO_BLZ2060] = {
875*3109e5aeSMichael Schmitz 				.name		= "Blizzard 2060",
876*3109e5aeSMichael Schmitz 				.offset		= 0x1ff00,
877*3109e5aeSMichael Schmitz 				.dma_offset	= 0x1ffe0,
878*3109e5aeSMichael Schmitz 				.esp_ops	= &blz2060_esp_ops,
879*3109e5aeSMichael Schmitz 	},
880*3109e5aeSMichael Schmitz 	[ZORRO_CYBER] = {
881*3109e5aeSMichael Schmitz 				.name		= "CyberStormI",
882*3109e5aeSMichael Schmitz 				.offset		= 0xf400,
883*3109e5aeSMichael Schmitz 				.dma_offset	= 0xf800,
884*3109e5aeSMichael Schmitz 				.esp_ops	= &cyber_esp_ops,
885*3109e5aeSMichael Schmitz 	},
886*3109e5aeSMichael Schmitz 	[ZORRO_CYBERII] = {
887*3109e5aeSMichael Schmitz 				.name		= "CyberStormII",
888*3109e5aeSMichael Schmitz 				.offset		= 0x1ff03,
889*3109e5aeSMichael Schmitz 				.dma_offset	= 0x1ff43,
890*3109e5aeSMichael Schmitz 				.scsi_option	= 1,
891*3109e5aeSMichael Schmitz 				.esp_ops	= &cyberII_esp_ops,
892*3109e5aeSMichael Schmitz 	},
893*3109e5aeSMichael Schmitz 	[ZORRO_FASTLANE] = {
894*3109e5aeSMichael Schmitz 				.name		= "Fastlane",
895*3109e5aeSMichael Schmitz 				.offset		= 0x1000001,
896*3109e5aeSMichael Schmitz 				.dma_offset	= 0x1000041,
897*3109e5aeSMichael Schmitz 				.esp_ops	= &fastlane_esp_ops,
898*3109e5aeSMichael Schmitz 	},
899*3109e5aeSMichael Schmitz };
900*3109e5aeSMichael Schmitz 
901*3109e5aeSMichael Schmitz static const struct zorro_device_id zorro_esp_zorro_tbl[] = {
902*3109e5aeSMichael Schmitz 	{	/* Blizzard 1230 IV */
903*3109e5aeSMichael Schmitz 		.id = ZORRO_ID(PHASE5, 0x11, 0),
904*3109e5aeSMichael Schmitz 		.driver_data = ZORRO_BLZ1230,
905*3109e5aeSMichael Schmitz 	},
906*3109e5aeSMichael Schmitz 	{	/* Blizzard 1230 II (Zorro II) or Fastlane (Zorro III) */
907*3109e5aeSMichael Schmitz 		.id = ZORRO_ID(PHASE5, 0x0B, 0),
908*3109e5aeSMichael Schmitz 		.driver_data = ZORRO_BLZ1230II,
909*3109e5aeSMichael Schmitz 	},
910*3109e5aeSMichael Schmitz 	{	/* Blizzard 2060 */
911*3109e5aeSMichael Schmitz 		.id = ZORRO_ID(PHASE5, 0x18, 0),
912*3109e5aeSMichael Schmitz 		.driver_data = ZORRO_BLZ2060,
913*3109e5aeSMichael Schmitz 	},
914*3109e5aeSMichael Schmitz 	{	/* Cyberstorm */
915*3109e5aeSMichael Schmitz 		.id = ZORRO_ID(PHASE5, 0x0C, 0),
916*3109e5aeSMichael Schmitz 		.driver_data = ZORRO_CYBER,
917*3109e5aeSMichael Schmitz 	},
918*3109e5aeSMichael Schmitz 	{	/* Cyberstorm II */
919*3109e5aeSMichael Schmitz 		.id = ZORRO_ID(PHASE5, 0x19, 0),
920*3109e5aeSMichael Schmitz 		.driver_data = ZORRO_CYBERII,
921*3109e5aeSMichael Schmitz 	},
922*3109e5aeSMichael Schmitz 	{ 0 }
923*3109e5aeSMichael Schmitz };
924*3109e5aeSMichael Schmitz MODULE_DEVICE_TABLE(zorro, zorro_esp_zorro_tbl);
925*3109e5aeSMichael Schmitz 
926*3109e5aeSMichael Schmitz static int zorro_esp_probe(struct zorro_dev *z,
927*3109e5aeSMichael Schmitz 				       const struct zorro_device_id *ent)
928*3109e5aeSMichael Schmitz {
929*3109e5aeSMichael Schmitz 	struct scsi_host_template *tpnt = &scsi_esp_template;
930*3109e5aeSMichael Schmitz 	struct Scsi_Host *host;
931*3109e5aeSMichael Schmitz 	struct esp *esp;
932*3109e5aeSMichael Schmitz 	const struct zorro_driver_data *zdd;
933*3109e5aeSMichael Schmitz 	struct zorro_esp_priv *zep;
934*3109e5aeSMichael Schmitz 	unsigned long board, ioaddr, dmaaddr;
935*3109e5aeSMichael Schmitz 	int err;
936*3109e5aeSMichael Schmitz 
937*3109e5aeSMichael Schmitz 	board = zorro_resource_start(z);
938*3109e5aeSMichael Schmitz 	zdd = &zorro_esp_boards[ent->driver_data];
939*3109e5aeSMichael Schmitz 
940*3109e5aeSMichael Schmitz 	pr_info("%s found at address 0x%lx.\n", zdd->name, board);
941*3109e5aeSMichael Schmitz 
942*3109e5aeSMichael Schmitz 	zep = kzalloc(sizeof(*zep), GFP_KERNEL);
943*3109e5aeSMichael Schmitz 	if (!zep) {
944*3109e5aeSMichael Schmitz 		pr_err("Can't allocate device private data!\n");
945*3109e5aeSMichael Schmitz 		return -ENOMEM;
946*3109e5aeSMichael Schmitz 	}
947*3109e5aeSMichael Schmitz 
948*3109e5aeSMichael Schmitz 	/* let's figure out whether we have a Zorro II or Zorro III board */
949*3109e5aeSMichael Schmitz 	if ((z->rom.er_Type & ERT_TYPEMASK) == ERT_ZORROIII) {
950*3109e5aeSMichael Schmitz 		if (board > 0xffffff)
951*3109e5aeSMichael Schmitz 			zep->zorro3 = 1;
952*3109e5aeSMichael Schmitz 	} else {
953*3109e5aeSMichael Schmitz 		/*
954*3109e5aeSMichael Schmitz 		 * Even though most of these boards identify as Zorro II,
955*3109e5aeSMichael Schmitz 		 * they are in fact CPU expansion slot boards and have full
956*3109e5aeSMichael Schmitz 		 * access to all of memory. Fix up DMA bitmask here.
957*3109e5aeSMichael Schmitz 		 */
958*3109e5aeSMichael Schmitz 		z->dev.coherent_dma_mask = DMA_BIT_MASK(32);
959*3109e5aeSMichael Schmitz 	}
960*3109e5aeSMichael Schmitz 
961*3109e5aeSMichael Schmitz 	/*
962*3109e5aeSMichael Schmitz 	 * If Zorro III and ID matches Fastlane, our device table entry
963*3109e5aeSMichael Schmitz 	 * contains data for the Blizzard 1230 II board which does share the
964*3109e5aeSMichael Schmitz 	 * same ID. Fix up device table entry here.
965*3109e5aeSMichael Schmitz 	 * TODO: Some Cyberstom060 boards also share this ID but would need
966*3109e5aeSMichael Schmitz 	 * to use the Cyberstorm I driver data ... we catch this by checking
967*3109e5aeSMichael Schmitz 	 * for presence of ESP chip later, but don't try to fix up yet.
968*3109e5aeSMichael Schmitz 	 */
969*3109e5aeSMichael Schmitz 	if (zep->zorro3 && ent->driver_data == ZORRO_BLZ1230II) {
970*3109e5aeSMichael Schmitz 		pr_info("%s at address 0x%lx is Fastlane Z3, fixing data!\n",
971*3109e5aeSMichael Schmitz 			zdd->name, board);
972*3109e5aeSMichael Schmitz 		zdd = &zorro_esp_boards[ZORRO_FASTLANE];
973*3109e5aeSMichael Schmitz 	}
974*3109e5aeSMichael Schmitz 
975*3109e5aeSMichael Schmitz 	if (zdd->absolute) {
976*3109e5aeSMichael Schmitz 		ioaddr  = zdd->offset;
977*3109e5aeSMichael Schmitz 		dmaaddr = zdd->dma_offset;
978*3109e5aeSMichael Schmitz 	} else {
979*3109e5aeSMichael Schmitz 		ioaddr  = board + zdd->offset;
980*3109e5aeSMichael Schmitz 		dmaaddr = board + zdd->dma_offset;
981*3109e5aeSMichael Schmitz 	}
982*3109e5aeSMichael Schmitz 
983*3109e5aeSMichael Schmitz 	if (!zorro_request_device(z, zdd->name)) {
984*3109e5aeSMichael Schmitz 		pr_err("cannot reserve region 0x%lx, abort\n",
985*3109e5aeSMichael Schmitz 		       board);
986*3109e5aeSMichael Schmitz 		err = -EBUSY;
987*3109e5aeSMichael Schmitz 		goto fail_free_zep;
988*3109e5aeSMichael Schmitz 	}
989*3109e5aeSMichael Schmitz 
990*3109e5aeSMichael Schmitz 	host = scsi_host_alloc(tpnt, sizeof(struct esp));
991*3109e5aeSMichael Schmitz 
992*3109e5aeSMichael Schmitz 	if (!host) {
993*3109e5aeSMichael Schmitz 		pr_err("No host detected; board configuration problem?\n");
994*3109e5aeSMichael Schmitz 		err = -ENOMEM;
995*3109e5aeSMichael Schmitz 		goto fail_release_device;
996*3109e5aeSMichael Schmitz 	}
997*3109e5aeSMichael Schmitz 
998*3109e5aeSMichael Schmitz 	host->base		= ioaddr;
999*3109e5aeSMichael Schmitz 	host->this_id		= 7;
1000*3109e5aeSMichael Schmitz 
1001*3109e5aeSMichael Schmitz 	esp			= shost_priv(host);
1002*3109e5aeSMichael Schmitz 	esp->host		= host;
1003*3109e5aeSMichael Schmitz 	esp->dev		= &z->dev;
1004*3109e5aeSMichael Schmitz 
1005*3109e5aeSMichael Schmitz 	esp->scsi_id		= host->this_id;
1006*3109e5aeSMichael Schmitz 	esp->scsi_id_mask	= (1 << esp->scsi_id);
1007*3109e5aeSMichael Schmitz 
1008*3109e5aeSMichael Schmitz 	esp->cfreq = 40000000;
1009*3109e5aeSMichael Schmitz 
1010*3109e5aeSMichael Schmitz 	zep->esp = esp;
1011*3109e5aeSMichael Schmitz 
1012*3109e5aeSMichael Schmitz 	dev_set_drvdata(esp->dev, zep);
1013*3109e5aeSMichael Schmitz 
1014*3109e5aeSMichael Schmitz 	/* additional setup required for Fastlane */
1015*3109e5aeSMichael Schmitz 	if (zep->zorro3 && ent->driver_data == ZORRO_BLZ1230II) {
1016*3109e5aeSMichael Schmitz 		/* map full address space up to ESP base for DMA */
1017*3109e5aeSMichael Schmitz 		zep->board_base = ioremap_nocache(board,
1018*3109e5aeSMichael Schmitz 						FASTLANE_ESP_ADDR-1);
1019*3109e5aeSMichael Schmitz 		if (!zep->board_base) {
1020*3109e5aeSMichael Schmitz 			pr_err("Cannot allocate board address space\n");
1021*3109e5aeSMichael Schmitz 			err = -ENOMEM;
1022*3109e5aeSMichael Schmitz 			goto fail_free_host;
1023*3109e5aeSMichael Schmitz 		}
1024*3109e5aeSMichael Schmitz 		/* initialize DMA control shadow register */
1025*3109e5aeSMichael Schmitz 		zep->ctrl_data = (FASTLANE_DMA_FCODE |
1026*3109e5aeSMichael Schmitz 				  FASTLANE_DMA_EDI | FASTLANE_DMA_ESI);
1027*3109e5aeSMichael Schmitz 	}
1028*3109e5aeSMichael Schmitz 
1029*3109e5aeSMichael Schmitz 	esp->ops = zdd->esp_ops;
1030*3109e5aeSMichael Schmitz 
1031*3109e5aeSMichael Schmitz 	if (ioaddr > 0xffffff)
1032*3109e5aeSMichael Schmitz 		esp->regs = ioremap_nocache(ioaddr, 0x20);
1033*3109e5aeSMichael Schmitz 	else
1034*3109e5aeSMichael Schmitz 		/* ZorroII address space remapped nocache by early startup */
1035*3109e5aeSMichael Schmitz 		esp->regs = ZTWO_VADDR(ioaddr);
1036*3109e5aeSMichael Schmitz 
1037*3109e5aeSMichael Schmitz 	if (!esp->regs) {
1038*3109e5aeSMichael Schmitz 		err = -ENOMEM;
1039*3109e5aeSMichael Schmitz 		goto fail_unmap_fastlane;
1040*3109e5aeSMichael Schmitz 	}
1041*3109e5aeSMichael Schmitz 
1042*3109e5aeSMichael Schmitz 	/* Check whether a Blizzard 12x0 or CyberstormII really has SCSI */
1043*3109e5aeSMichael Schmitz 	if (zdd->scsi_option) {
1044*3109e5aeSMichael Schmitz 		zorro_esp_write8(esp, (ESP_CONFIG1_PENABLE | 7), ESP_CFG1);
1045*3109e5aeSMichael Schmitz 		if (zorro_esp_read8(esp, ESP_CFG1) != (ESP_CONFIG1_PENABLE|7)) {
1046*3109e5aeSMichael Schmitz 			err = -ENODEV;
1047*3109e5aeSMichael Schmitz 			goto fail_unmap_regs;
1048*3109e5aeSMichael Schmitz 		}
1049*3109e5aeSMichael Schmitz 	}
1050*3109e5aeSMichael Schmitz 
1051*3109e5aeSMichael Schmitz 	if (zep->zorro3) {
1052*3109e5aeSMichael Schmitz 		/*
1053*3109e5aeSMichael Schmitz 		 * Only Fastlane Z3 for now - add switch for correct struct
1054*3109e5aeSMichael Schmitz 		 * dma_registers size if adding any more
1055*3109e5aeSMichael Schmitz 		 */
1056*3109e5aeSMichael Schmitz 		esp->dma_regs = ioremap_nocache(dmaaddr,
1057*3109e5aeSMichael Schmitz 				sizeof(struct fastlane_dma_registers));
1058*3109e5aeSMichael Schmitz 	} else
1059*3109e5aeSMichael Schmitz 		/* ZorroII address space remapped nocache by early startup */
1060*3109e5aeSMichael Schmitz 		esp->dma_regs = ZTWO_VADDR(dmaaddr);
1061*3109e5aeSMichael Schmitz 
1062*3109e5aeSMichael Schmitz 	if (!esp->dma_regs) {
1063*3109e5aeSMichael Schmitz 		err = -ENOMEM;
1064*3109e5aeSMichael Schmitz 		goto fail_unmap_regs;
1065*3109e5aeSMichael Schmitz 	}
1066*3109e5aeSMichael Schmitz 
1067*3109e5aeSMichael Schmitz 	esp->command_block = dma_alloc_coherent(esp->dev, 16,
1068*3109e5aeSMichael Schmitz 						&esp->command_block_dma,
1069*3109e5aeSMichael Schmitz 						GFP_KERNEL);
1070*3109e5aeSMichael Schmitz 
1071*3109e5aeSMichael Schmitz 	if (!esp->command_block) {
1072*3109e5aeSMichael Schmitz 		err = -ENOMEM;
1073*3109e5aeSMichael Schmitz 		goto fail_unmap_dma_regs;
1074*3109e5aeSMichael Schmitz 	}
1075*3109e5aeSMichael Schmitz 
1076*3109e5aeSMichael Schmitz 	host->irq = IRQ_AMIGA_PORTS;
1077*3109e5aeSMichael Schmitz 	err = request_irq(host->irq, scsi_esp_intr, IRQF_SHARED,
1078*3109e5aeSMichael Schmitz 			  "Amiga Zorro ESP", esp);
1079*3109e5aeSMichael Schmitz 	if (err < 0) {
1080*3109e5aeSMichael Schmitz 		err = -ENODEV;
1081*3109e5aeSMichael Schmitz 		goto fail_free_command_block;
1082*3109e5aeSMichael Schmitz 	}
1083*3109e5aeSMichael Schmitz 
1084*3109e5aeSMichael Schmitz 	/* register the chip */
1085*3109e5aeSMichael Schmitz 	err = scsi_esp_register(esp, &z->dev);
1086*3109e5aeSMichael Schmitz 
1087*3109e5aeSMichael Schmitz 	if (err) {
1088*3109e5aeSMichael Schmitz 		err = -ENOMEM;
1089*3109e5aeSMichael Schmitz 		goto fail_free_irq;
1090*3109e5aeSMichael Schmitz 	}
1091*3109e5aeSMichael Schmitz 
1092*3109e5aeSMichael Schmitz 	return 0;
1093*3109e5aeSMichael Schmitz 
1094*3109e5aeSMichael Schmitz fail_free_irq:
1095*3109e5aeSMichael Schmitz 	free_irq(host->irq, esp);
1096*3109e5aeSMichael Schmitz 
1097*3109e5aeSMichael Schmitz fail_free_command_block:
1098*3109e5aeSMichael Schmitz 	dma_free_coherent(esp->dev, 16,
1099*3109e5aeSMichael Schmitz 			  esp->command_block,
1100*3109e5aeSMichael Schmitz 			  esp->command_block_dma);
1101*3109e5aeSMichael Schmitz 
1102*3109e5aeSMichael Schmitz fail_unmap_dma_regs:
1103*3109e5aeSMichael Schmitz 	if (zep->zorro3)
1104*3109e5aeSMichael Schmitz 		iounmap(esp->dma_regs);
1105*3109e5aeSMichael Schmitz 
1106*3109e5aeSMichael Schmitz fail_unmap_regs:
1107*3109e5aeSMichael Schmitz 	if (ioaddr > 0xffffff)
1108*3109e5aeSMichael Schmitz 		iounmap(esp->regs);
1109*3109e5aeSMichael Schmitz 
1110*3109e5aeSMichael Schmitz fail_unmap_fastlane:
1111*3109e5aeSMichael Schmitz 	if (zep->zorro3)
1112*3109e5aeSMichael Schmitz 		iounmap(zep->board_base);
1113*3109e5aeSMichael Schmitz 
1114*3109e5aeSMichael Schmitz fail_free_host:
1115*3109e5aeSMichael Schmitz 	scsi_host_put(host);
1116*3109e5aeSMichael Schmitz 
1117*3109e5aeSMichael Schmitz fail_release_device:
1118*3109e5aeSMichael Schmitz 	zorro_release_device(z);
1119*3109e5aeSMichael Schmitz 
1120*3109e5aeSMichael Schmitz fail_free_zep:
1121*3109e5aeSMichael Schmitz 	kfree(zep);
1122*3109e5aeSMichael Schmitz 
1123*3109e5aeSMichael Schmitz 	return err;
1124*3109e5aeSMichael Schmitz }
1125*3109e5aeSMichael Schmitz 
1126*3109e5aeSMichael Schmitz static void zorro_esp_remove(struct zorro_dev *z)
1127*3109e5aeSMichael Schmitz {
1128*3109e5aeSMichael Schmitz 	struct zorro_esp_priv *zep = dev_get_drvdata(&z->dev);
1129*3109e5aeSMichael Schmitz 	struct esp *esp	= zep->esp;
1130*3109e5aeSMichael Schmitz 	struct Scsi_Host *host = esp->host;
1131*3109e5aeSMichael Schmitz 
1132*3109e5aeSMichael Schmitz 	scsi_esp_unregister(esp);
1133*3109e5aeSMichael Schmitz 
1134*3109e5aeSMichael Schmitz 	free_irq(host->irq, esp);
1135*3109e5aeSMichael Schmitz 	dma_free_coherent(esp->dev, 16,
1136*3109e5aeSMichael Schmitz 			  esp->command_block,
1137*3109e5aeSMichael Schmitz 			  esp->command_block_dma);
1138*3109e5aeSMichael Schmitz 
1139*3109e5aeSMichael Schmitz 	if (zep->zorro3) {
1140*3109e5aeSMichael Schmitz 		iounmap(zep->board_base);
1141*3109e5aeSMichael Schmitz 		iounmap(esp->dma_regs);
1142*3109e5aeSMichael Schmitz 	}
1143*3109e5aeSMichael Schmitz 
1144*3109e5aeSMichael Schmitz 	if (host->base > 0xffffff)
1145*3109e5aeSMichael Schmitz 		iounmap(esp->regs);
1146*3109e5aeSMichael Schmitz 
1147*3109e5aeSMichael Schmitz 	scsi_host_put(host);
1148*3109e5aeSMichael Schmitz 
1149*3109e5aeSMichael Schmitz 	zorro_release_device(z);
1150*3109e5aeSMichael Schmitz 
1151*3109e5aeSMichael Schmitz 	kfree(zep);
1152*3109e5aeSMichael Schmitz }
1153*3109e5aeSMichael Schmitz 
1154*3109e5aeSMichael Schmitz static struct zorro_driver zorro_esp_driver = {
1155*3109e5aeSMichael Schmitz 	.name	  = KBUILD_MODNAME,
1156*3109e5aeSMichael Schmitz 	.id_table = zorro_esp_zorro_tbl,
1157*3109e5aeSMichael Schmitz 	.probe	  = zorro_esp_probe,
1158*3109e5aeSMichael Schmitz 	.remove	  = zorro_esp_remove,
1159*3109e5aeSMichael Schmitz };
1160*3109e5aeSMichael Schmitz 
1161*3109e5aeSMichael Schmitz static int __init zorro_esp_scsi_init(void)
1162*3109e5aeSMichael Schmitz {
1163*3109e5aeSMichael Schmitz 	return zorro_register_driver(&zorro_esp_driver);
1164*3109e5aeSMichael Schmitz }
1165*3109e5aeSMichael Schmitz 
1166*3109e5aeSMichael Schmitz static void __exit zorro_esp_scsi_exit(void)
1167*3109e5aeSMichael Schmitz {
1168*3109e5aeSMichael Schmitz 	zorro_unregister_driver(&zorro_esp_driver);
1169*3109e5aeSMichael Schmitz }
1170*3109e5aeSMichael Schmitz 
1171*3109e5aeSMichael Schmitz module_init(zorro_esp_scsi_init);
1172*3109e5aeSMichael Schmitz module_exit(zorro_esp_scsi_exit);
1173