xref: /OK3568_Linux_fs/kernel/drivers/scsi/am53c974.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-only
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * AMD am53c974 driver.
4*4882a593Smuzhiyun  * Copyright (c) 2014 Hannes Reinecke, SUSE Linux GmbH
5*4882a593Smuzhiyun  */
6*4882a593Smuzhiyun 
7*4882a593Smuzhiyun #include <linux/kernel.h>
8*4882a593Smuzhiyun #include <linux/module.h>
9*4882a593Smuzhiyun #include <linux/init.h>
10*4882a593Smuzhiyun #include <linux/delay.h>
11*4882a593Smuzhiyun #include <linux/pci.h>
12*4882a593Smuzhiyun #include <linux/interrupt.h>
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun #include <scsi/scsi_host.h>
15*4882a593Smuzhiyun 
16*4882a593Smuzhiyun #include "esp_scsi.h"
17*4882a593Smuzhiyun 
18*4882a593Smuzhiyun #define DRV_MODULE_NAME "am53c974"
19*4882a593Smuzhiyun #define DRV_MODULE_VERSION "1.00"
20*4882a593Smuzhiyun 
21*4882a593Smuzhiyun static bool am53c974_debug;
22*4882a593Smuzhiyun static bool am53c974_fenab = true;
23*4882a593Smuzhiyun 
24*4882a593Smuzhiyun #define esp_dma_log(f, a...)						\
25*4882a593Smuzhiyun 	do {								\
26*4882a593Smuzhiyun 		if (am53c974_debug)					\
27*4882a593Smuzhiyun 			shost_printk(KERN_DEBUG, esp->host, f, ##a);	\
28*4882a593Smuzhiyun 	} while (0)
29*4882a593Smuzhiyun 
30*4882a593Smuzhiyun #define ESP_DMA_CMD 0x10
31*4882a593Smuzhiyun #define ESP_DMA_STC 0x11
32*4882a593Smuzhiyun #define ESP_DMA_SPA 0x12
33*4882a593Smuzhiyun #define ESP_DMA_WBC 0x13
34*4882a593Smuzhiyun #define ESP_DMA_WAC 0x14
35*4882a593Smuzhiyun #define ESP_DMA_STATUS 0x15
36*4882a593Smuzhiyun #define ESP_DMA_SMDLA 0x16
37*4882a593Smuzhiyun #define ESP_DMA_WMAC 0x17
38*4882a593Smuzhiyun 
39*4882a593Smuzhiyun #define ESP_DMA_CMD_IDLE 0x00
40*4882a593Smuzhiyun #define ESP_DMA_CMD_BLAST 0x01
41*4882a593Smuzhiyun #define ESP_DMA_CMD_ABORT 0x02
42*4882a593Smuzhiyun #define ESP_DMA_CMD_START 0x03
43*4882a593Smuzhiyun #define ESP_DMA_CMD_MASK  0x03
44*4882a593Smuzhiyun #define ESP_DMA_CMD_DIAG 0x04
45*4882a593Smuzhiyun #define ESP_DMA_CMD_MDL 0x10
46*4882a593Smuzhiyun #define ESP_DMA_CMD_INTE_P 0x20
47*4882a593Smuzhiyun #define ESP_DMA_CMD_INTE_D 0x40
48*4882a593Smuzhiyun #define ESP_DMA_CMD_DIR 0x80
49*4882a593Smuzhiyun 
50*4882a593Smuzhiyun #define ESP_DMA_STAT_PWDN 0x01
51*4882a593Smuzhiyun #define ESP_DMA_STAT_ERROR 0x02
52*4882a593Smuzhiyun #define ESP_DMA_STAT_ABORT 0x04
53*4882a593Smuzhiyun #define ESP_DMA_STAT_DONE 0x08
54*4882a593Smuzhiyun #define ESP_DMA_STAT_SCSIINT 0x10
55*4882a593Smuzhiyun #define ESP_DMA_STAT_BCMPLT 0x20
56*4882a593Smuzhiyun 
57*4882a593Smuzhiyun /* EEPROM is accessed with 16-bit values */
58*4882a593Smuzhiyun #define DC390_EEPROM_READ 0x80
59*4882a593Smuzhiyun #define DC390_EEPROM_LEN 0x40
60*4882a593Smuzhiyun 
61*4882a593Smuzhiyun /*
62*4882a593Smuzhiyun  * DC390 EEPROM
63*4882a593Smuzhiyun  *
64*4882a593Smuzhiyun  * 8 * 4 bytes of per-device options
65*4882a593Smuzhiyun  * followed by HBA specific options
66*4882a593Smuzhiyun  */
67*4882a593Smuzhiyun 
68*4882a593Smuzhiyun /* Per-device options */
69*4882a593Smuzhiyun #define DC390_EE_MODE1 0x00
70*4882a593Smuzhiyun #define DC390_EE_SPEED 0x01
71*4882a593Smuzhiyun 
72*4882a593Smuzhiyun /* HBA-specific options */
73*4882a593Smuzhiyun #define DC390_EE_ADAPT_SCSI_ID 0x40
74*4882a593Smuzhiyun #define DC390_EE_MODE2 0x41
75*4882a593Smuzhiyun #define DC390_EE_DELAY 0x42
76*4882a593Smuzhiyun #define DC390_EE_TAG_CMD_NUM 0x43
77*4882a593Smuzhiyun 
78*4882a593Smuzhiyun #define DC390_EE_MODE1_PARITY_CHK   0x01
79*4882a593Smuzhiyun #define DC390_EE_MODE1_SYNC_NEGO    0x02
80*4882a593Smuzhiyun #define DC390_EE_MODE1_EN_DISC      0x04
81*4882a593Smuzhiyun #define DC390_EE_MODE1_SEND_START   0x08
82*4882a593Smuzhiyun #define DC390_EE_MODE1_TCQ          0x10
83*4882a593Smuzhiyun 
84*4882a593Smuzhiyun #define DC390_EE_MODE2_MORE_2DRV    0x01
85*4882a593Smuzhiyun #define DC390_EE_MODE2_GREATER_1G   0x02
86*4882a593Smuzhiyun #define DC390_EE_MODE2_RST_SCSI_BUS 0x04
87*4882a593Smuzhiyun #define DC390_EE_MODE2_ACTIVE_NEGATION 0x08
88*4882a593Smuzhiyun #define DC390_EE_MODE2_NO_SEEK      0x10
89*4882a593Smuzhiyun #define DC390_EE_MODE2_LUN_CHECK    0x20
90*4882a593Smuzhiyun 
91*4882a593Smuzhiyun struct pci_esp_priv {
92*4882a593Smuzhiyun 	struct esp *esp;
93*4882a593Smuzhiyun 	u8 dma_status;
94*4882a593Smuzhiyun };
95*4882a593Smuzhiyun 
96*4882a593Smuzhiyun static void pci_esp_dma_drain(struct esp *esp);
97*4882a593Smuzhiyun 
pci_esp_get_priv(struct esp * esp)98*4882a593Smuzhiyun static inline struct pci_esp_priv *pci_esp_get_priv(struct esp *esp)
99*4882a593Smuzhiyun {
100*4882a593Smuzhiyun 	return dev_get_drvdata(esp->dev);
101*4882a593Smuzhiyun }
102*4882a593Smuzhiyun 
pci_esp_write8(struct esp * esp,u8 val,unsigned long reg)103*4882a593Smuzhiyun static void pci_esp_write8(struct esp *esp, u8 val, unsigned long reg)
104*4882a593Smuzhiyun {
105*4882a593Smuzhiyun 	iowrite8(val, esp->regs + (reg * 4UL));
106*4882a593Smuzhiyun }
107*4882a593Smuzhiyun 
pci_esp_read8(struct esp * esp,unsigned long reg)108*4882a593Smuzhiyun static u8 pci_esp_read8(struct esp *esp, unsigned long reg)
109*4882a593Smuzhiyun {
110*4882a593Smuzhiyun 	return ioread8(esp->regs + (reg * 4UL));
111*4882a593Smuzhiyun }
112*4882a593Smuzhiyun 
pci_esp_write32(struct esp * esp,u32 val,unsigned long reg)113*4882a593Smuzhiyun static void pci_esp_write32(struct esp *esp, u32 val, unsigned long reg)
114*4882a593Smuzhiyun {
115*4882a593Smuzhiyun 	return iowrite32(val, esp->regs + (reg * 4UL));
116*4882a593Smuzhiyun }
117*4882a593Smuzhiyun 
pci_esp_irq_pending(struct esp * esp)118*4882a593Smuzhiyun static int pci_esp_irq_pending(struct esp *esp)
119*4882a593Smuzhiyun {
120*4882a593Smuzhiyun 	struct pci_esp_priv *pep = pci_esp_get_priv(esp);
121*4882a593Smuzhiyun 
122*4882a593Smuzhiyun 	pep->dma_status = pci_esp_read8(esp, ESP_DMA_STATUS);
123*4882a593Smuzhiyun 	esp_dma_log("dma intr dreg[%02x]\n", pep->dma_status);
124*4882a593Smuzhiyun 
125*4882a593Smuzhiyun 	if (pep->dma_status & (ESP_DMA_STAT_ERROR |
126*4882a593Smuzhiyun 			       ESP_DMA_STAT_ABORT |
127*4882a593Smuzhiyun 			       ESP_DMA_STAT_DONE |
128*4882a593Smuzhiyun 			       ESP_DMA_STAT_SCSIINT))
129*4882a593Smuzhiyun 		return 1;
130*4882a593Smuzhiyun 
131*4882a593Smuzhiyun 	return 0;
132*4882a593Smuzhiyun }
133*4882a593Smuzhiyun 
pci_esp_reset_dma(struct esp * esp)134*4882a593Smuzhiyun static void pci_esp_reset_dma(struct esp *esp)
135*4882a593Smuzhiyun {
136*4882a593Smuzhiyun 	/* Nothing to do ? */
137*4882a593Smuzhiyun }
138*4882a593Smuzhiyun 
pci_esp_dma_drain(struct esp * esp)139*4882a593Smuzhiyun static void pci_esp_dma_drain(struct esp *esp)
140*4882a593Smuzhiyun {
141*4882a593Smuzhiyun 	u8 resid;
142*4882a593Smuzhiyun 	int lim = 1000;
143*4882a593Smuzhiyun 
144*4882a593Smuzhiyun 
145*4882a593Smuzhiyun 	if ((esp->sreg & ESP_STAT_PMASK) == ESP_DOP ||
146*4882a593Smuzhiyun 	    (esp->sreg & ESP_STAT_PMASK) == ESP_DIP)
147*4882a593Smuzhiyun 		/* Data-In or Data-Out, nothing to be done */
148*4882a593Smuzhiyun 		return;
149*4882a593Smuzhiyun 
150*4882a593Smuzhiyun 	while (--lim > 0) {
151*4882a593Smuzhiyun 		resid = pci_esp_read8(esp, ESP_FFLAGS) & ESP_FF_FBYTES;
152*4882a593Smuzhiyun 		if (resid <= 1)
153*4882a593Smuzhiyun 			break;
154*4882a593Smuzhiyun 		cpu_relax();
155*4882a593Smuzhiyun 	}
156*4882a593Smuzhiyun 
157*4882a593Smuzhiyun 	/*
158*4882a593Smuzhiyun 	 * When there is a residual BCMPLT will never be set
159*4882a593Smuzhiyun 	 * (obviously). But we still have to issue the BLAST
160*4882a593Smuzhiyun 	 * command, otherwise the data will not being transferred.
161*4882a593Smuzhiyun 	 * But we'll never know when the BLAST operation is
162*4882a593Smuzhiyun 	 * finished. So check for some time and give up eventually.
163*4882a593Smuzhiyun 	 */
164*4882a593Smuzhiyun 	lim = 1000;
165*4882a593Smuzhiyun 	pci_esp_write8(esp, ESP_DMA_CMD_DIR | ESP_DMA_CMD_BLAST, ESP_DMA_CMD);
166*4882a593Smuzhiyun 	while (pci_esp_read8(esp, ESP_DMA_STATUS) & ESP_DMA_STAT_BCMPLT) {
167*4882a593Smuzhiyun 		if (--lim == 0)
168*4882a593Smuzhiyun 			break;
169*4882a593Smuzhiyun 		cpu_relax();
170*4882a593Smuzhiyun 	}
171*4882a593Smuzhiyun 	pci_esp_write8(esp, ESP_DMA_CMD_DIR | ESP_DMA_CMD_IDLE, ESP_DMA_CMD);
172*4882a593Smuzhiyun 	esp_dma_log("DMA blast done (%d tries, %d bytes left)\n", lim, resid);
173*4882a593Smuzhiyun 	/* BLAST residual handling is currently untested */
174*4882a593Smuzhiyun 	if (WARN_ON_ONCE(resid == 1)) {
175*4882a593Smuzhiyun 		struct esp_cmd_entry *ent = esp->active_cmd;
176*4882a593Smuzhiyun 
177*4882a593Smuzhiyun 		ent->flags |= ESP_CMD_FLAG_RESIDUAL;
178*4882a593Smuzhiyun 	}
179*4882a593Smuzhiyun }
180*4882a593Smuzhiyun 
pci_esp_dma_invalidate(struct esp * esp)181*4882a593Smuzhiyun static void pci_esp_dma_invalidate(struct esp *esp)
182*4882a593Smuzhiyun {
183*4882a593Smuzhiyun 	struct pci_esp_priv *pep = pci_esp_get_priv(esp);
184*4882a593Smuzhiyun 
185*4882a593Smuzhiyun 	esp_dma_log("invalidate DMA\n");
186*4882a593Smuzhiyun 
187*4882a593Smuzhiyun 	pci_esp_write8(esp, ESP_DMA_CMD_IDLE, ESP_DMA_CMD);
188*4882a593Smuzhiyun 	pep->dma_status = 0;
189*4882a593Smuzhiyun }
190*4882a593Smuzhiyun 
pci_esp_dma_error(struct esp * esp)191*4882a593Smuzhiyun static int pci_esp_dma_error(struct esp *esp)
192*4882a593Smuzhiyun {
193*4882a593Smuzhiyun 	struct pci_esp_priv *pep = pci_esp_get_priv(esp);
194*4882a593Smuzhiyun 
195*4882a593Smuzhiyun 	if (pep->dma_status & ESP_DMA_STAT_ERROR) {
196*4882a593Smuzhiyun 		u8 dma_cmd = pci_esp_read8(esp, ESP_DMA_CMD);
197*4882a593Smuzhiyun 
198*4882a593Smuzhiyun 		if ((dma_cmd & ESP_DMA_CMD_MASK) == ESP_DMA_CMD_START)
199*4882a593Smuzhiyun 			pci_esp_write8(esp, ESP_DMA_CMD_ABORT, ESP_DMA_CMD);
200*4882a593Smuzhiyun 
201*4882a593Smuzhiyun 		return 1;
202*4882a593Smuzhiyun 	}
203*4882a593Smuzhiyun 	if (pep->dma_status & ESP_DMA_STAT_ABORT) {
204*4882a593Smuzhiyun 		pci_esp_write8(esp, ESP_DMA_CMD_IDLE, ESP_DMA_CMD);
205*4882a593Smuzhiyun 		pep->dma_status = pci_esp_read8(esp, ESP_DMA_CMD);
206*4882a593Smuzhiyun 		return 1;
207*4882a593Smuzhiyun 	}
208*4882a593Smuzhiyun 	return 0;
209*4882a593Smuzhiyun }
210*4882a593Smuzhiyun 
pci_esp_send_dma_cmd(struct esp * esp,u32 addr,u32 esp_count,u32 dma_count,int write,u8 cmd)211*4882a593Smuzhiyun static void pci_esp_send_dma_cmd(struct esp *esp, u32 addr, u32 esp_count,
212*4882a593Smuzhiyun 				 u32 dma_count, int write, u8 cmd)
213*4882a593Smuzhiyun {
214*4882a593Smuzhiyun 	struct pci_esp_priv *pep = pci_esp_get_priv(esp);
215*4882a593Smuzhiyun 	u32 val = 0;
216*4882a593Smuzhiyun 
217*4882a593Smuzhiyun 	BUG_ON(!(cmd & ESP_CMD_DMA));
218*4882a593Smuzhiyun 
219*4882a593Smuzhiyun 	pep->dma_status = 0;
220*4882a593Smuzhiyun 
221*4882a593Smuzhiyun 	/* Set DMA engine to IDLE */
222*4882a593Smuzhiyun 	if (write)
223*4882a593Smuzhiyun 		/* DMA write direction logic is inverted */
224*4882a593Smuzhiyun 		val |= ESP_DMA_CMD_DIR;
225*4882a593Smuzhiyun 	pci_esp_write8(esp, ESP_DMA_CMD_IDLE | val, ESP_DMA_CMD);
226*4882a593Smuzhiyun 
227*4882a593Smuzhiyun 	pci_esp_write8(esp, (esp_count >> 0) & 0xff, ESP_TCLOW);
228*4882a593Smuzhiyun 	pci_esp_write8(esp, (esp_count >> 8) & 0xff, ESP_TCMED);
229*4882a593Smuzhiyun 	if (esp->config2 & ESP_CONFIG2_FENAB)
230*4882a593Smuzhiyun 		pci_esp_write8(esp, (esp_count >> 16) & 0xff, ESP_TCHI);
231*4882a593Smuzhiyun 
232*4882a593Smuzhiyun 	pci_esp_write32(esp, esp_count, ESP_DMA_STC);
233*4882a593Smuzhiyun 	pci_esp_write32(esp, addr, ESP_DMA_SPA);
234*4882a593Smuzhiyun 
235*4882a593Smuzhiyun 	esp_dma_log("start dma addr[%x] count[%d:%d]\n",
236*4882a593Smuzhiyun 		    addr, esp_count, dma_count);
237*4882a593Smuzhiyun 
238*4882a593Smuzhiyun 	scsi_esp_cmd(esp, cmd);
239*4882a593Smuzhiyun 	/* Send DMA Start command */
240*4882a593Smuzhiyun 	pci_esp_write8(esp, ESP_DMA_CMD_START | val, ESP_DMA_CMD);
241*4882a593Smuzhiyun }
242*4882a593Smuzhiyun 
pci_esp_dma_length_limit(struct esp * esp,u32 dma_addr,u32 dma_len)243*4882a593Smuzhiyun static u32 pci_esp_dma_length_limit(struct esp *esp, u32 dma_addr, u32 dma_len)
244*4882a593Smuzhiyun {
245*4882a593Smuzhiyun 	int dma_limit = 16;
246*4882a593Smuzhiyun 	u32 base, end;
247*4882a593Smuzhiyun 
248*4882a593Smuzhiyun 	/*
249*4882a593Smuzhiyun 	 * If CONFIG2_FENAB is set we can
250*4882a593Smuzhiyun 	 * handle up to 24 bit addresses
251*4882a593Smuzhiyun 	 */
252*4882a593Smuzhiyun 	if (esp->config2 & ESP_CONFIG2_FENAB)
253*4882a593Smuzhiyun 		dma_limit = 24;
254*4882a593Smuzhiyun 
255*4882a593Smuzhiyun 	if (dma_len > (1U << dma_limit))
256*4882a593Smuzhiyun 		dma_len = (1U << dma_limit);
257*4882a593Smuzhiyun 
258*4882a593Smuzhiyun 	/*
259*4882a593Smuzhiyun 	 * Prevent crossing a 24-bit address boundary.
260*4882a593Smuzhiyun 	 */
261*4882a593Smuzhiyun 	base = dma_addr & ((1U << 24) - 1U);
262*4882a593Smuzhiyun 	end = base + dma_len;
263*4882a593Smuzhiyun 	if (end > (1U << 24))
264*4882a593Smuzhiyun 		end = (1U <<24);
265*4882a593Smuzhiyun 	dma_len = end - base;
266*4882a593Smuzhiyun 
267*4882a593Smuzhiyun 	return dma_len;
268*4882a593Smuzhiyun }
269*4882a593Smuzhiyun 
270*4882a593Smuzhiyun static const struct esp_driver_ops pci_esp_ops = {
271*4882a593Smuzhiyun 	.esp_write8	=	pci_esp_write8,
272*4882a593Smuzhiyun 	.esp_read8	=	pci_esp_read8,
273*4882a593Smuzhiyun 	.irq_pending	=	pci_esp_irq_pending,
274*4882a593Smuzhiyun 	.reset_dma	=	pci_esp_reset_dma,
275*4882a593Smuzhiyun 	.dma_drain	=	pci_esp_dma_drain,
276*4882a593Smuzhiyun 	.dma_invalidate	=	pci_esp_dma_invalidate,
277*4882a593Smuzhiyun 	.send_dma_cmd	=	pci_esp_send_dma_cmd,
278*4882a593Smuzhiyun 	.dma_error	=	pci_esp_dma_error,
279*4882a593Smuzhiyun 	.dma_length_limit =	pci_esp_dma_length_limit,
280*4882a593Smuzhiyun };
281*4882a593Smuzhiyun 
282*4882a593Smuzhiyun /*
283*4882a593Smuzhiyun  * Read DC-390 eeprom
284*4882a593Smuzhiyun  */
dc390_eeprom_prepare_read(struct pci_dev * pdev,u8 cmd)285*4882a593Smuzhiyun static void dc390_eeprom_prepare_read(struct pci_dev *pdev, u8 cmd)
286*4882a593Smuzhiyun {
287*4882a593Smuzhiyun 	u8 carry_flag = 1, j = 0x80, bval;
288*4882a593Smuzhiyun 	int i;
289*4882a593Smuzhiyun 
290*4882a593Smuzhiyun 	for (i = 0; i < 9; i++) {
291*4882a593Smuzhiyun 		if (carry_flag) {
292*4882a593Smuzhiyun 			pci_write_config_byte(pdev, 0x80, 0x40);
293*4882a593Smuzhiyun 			bval = 0xc0;
294*4882a593Smuzhiyun 		} else
295*4882a593Smuzhiyun 			bval = 0x80;
296*4882a593Smuzhiyun 
297*4882a593Smuzhiyun 		udelay(160);
298*4882a593Smuzhiyun 		pci_write_config_byte(pdev, 0x80, bval);
299*4882a593Smuzhiyun 		udelay(160);
300*4882a593Smuzhiyun 		pci_write_config_byte(pdev, 0x80, 0);
301*4882a593Smuzhiyun 		udelay(160);
302*4882a593Smuzhiyun 
303*4882a593Smuzhiyun 		carry_flag = (cmd & j) ? 1 : 0;
304*4882a593Smuzhiyun 		j >>= 1;
305*4882a593Smuzhiyun 	}
306*4882a593Smuzhiyun }
307*4882a593Smuzhiyun 
dc390_eeprom_get_data(struct pci_dev * pdev)308*4882a593Smuzhiyun static u16 dc390_eeprom_get_data(struct pci_dev *pdev)
309*4882a593Smuzhiyun {
310*4882a593Smuzhiyun 	int i;
311*4882a593Smuzhiyun 	u16 wval = 0;
312*4882a593Smuzhiyun 	u8 bval;
313*4882a593Smuzhiyun 
314*4882a593Smuzhiyun 	for (i = 0; i < 16; i++) {
315*4882a593Smuzhiyun 		wval <<= 1;
316*4882a593Smuzhiyun 
317*4882a593Smuzhiyun 		pci_write_config_byte(pdev, 0x80, 0x80);
318*4882a593Smuzhiyun 		udelay(160);
319*4882a593Smuzhiyun 		pci_write_config_byte(pdev, 0x80, 0x40);
320*4882a593Smuzhiyun 		udelay(160);
321*4882a593Smuzhiyun 		pci_read_config_byte(pdev, 0x00, &bval);
322*4882a593Smuzhiyun 
323*4882a593Smuzhiyun 		if (bval == 0x22)
324*4882a593Smuzhiyun 			wval |= 1;
325*4882a593Smuzhiyun 	}
326*4882a593Smuzhiyun 
327*4882a593Smuzhiyun 	return wval;
328*4882a593Smuzhiyun }
329*4882a593Smuzhiyun 
dc390_read_eeprom(struct pci_dev * pdev,u16 * ptr)330*4882a593Smuzhiyun static void dc390_read_eeprom(struct pci_dev *pdev, u16 *ptr)
331*4882a593Smuzhiyun {
332*4882a593Smuzhiyun 	u8 cmd = DC390_EEPROM_READ, i;
333*4882a593Smuzhiyun 
334*4882a593Smuzhiyun 	for (i = 0; i < DC390_EEPROM_LEN; i++) {
335*4882a593Smuzhiyun 		pci_write_config_byte(pdev, 0xc0, 0);
336*4882a593Smuzhiyun 		udelay(160);
337*4882a593Smuzhiyun 
338*4882a593Smuzhiyun 		dc390_eeprom_prepare_read(pdev, cmd++);
339*4882a593Smuzhiyun 		*ptr++ = dc390_eeprom_get_data(pdev);
340*4882a593Smuzhiyun 
341*4882a593Smuzhiyun 		pci_write_config_byte(pdev, 0x80, 0);
342*4882a593Smuzhiyun 		pci_write_config_byte(pdev, 0x80, 0);
343*4882a593Smuzhiyun 		udelay(160);
344*4882a593Smuzhiyun 	}
345*4882a593Smuzhiyun }
346*4882a593Smuzhiyun 
dc390_check_eeprom(struct esp * esp)347*4882a593Smuzhiyun static void dc390_check_eeprom(struct esp *esp)
348*4882a593Smuzhiyun {
349*4882a593Smuzhiyun 	struct pci_dev *pdev = to_pci_dev(esp->dev);
350*4882a593Smuzhiyun 	u8 EEbuf[128];
351*4882a593Smuzhiyun 	u16 *ptr = (u16 *)EEbuf, wval = 0;
352*4882a593Smuzhiyun 	int i;
353*4882a593Smuzhiyun 
354*4882a593Smuzhiyun 	dc390_read_eeprom(pdev, ptr);
355*4882a593Smuzhiyun 
356*4882a593Smuzhiyun 	for (i = 0; i < DC390_EEPROM_LEN; i++, ptr++)
357*4882a593Smuzhiyun 		wval += *ptr;
358*4882a593Smuzhiyun 
359*4882a593Smuzhiyun 	/* no Tekram EEprom found */
360*4882a593Smuzhiyun 	if (wval != 0x1234) {
361*4882a593Smuzhiyun 		dev_printk(KERN_INFO, &pdev->dev,
362*4882a593Smuzhiyun 			   "No valid Tekram EEprom found\n");
363*4882a593Smuzhiyun 		return;
364*4882a593Smuzhiyun 	}
365*4882a593Smuzhiyun 	esp->scsi_id = EEbuf[DC390_EE_ADAPT_SCSI_ID];
366*4882a593Smuzhiyun 	esp->num_tags = 2 << EEbuf[DC390_EE_TAG_CMD_NUM];
367*4882a593Smuzhiyun 	if (EEbuf[DC390_EE_MODE2] & DC390_EE_MODE2_ACTIVE_NEGATION)
368*4882a593Smuzhiyun 		esp->config4 |= ESP_CONFIG4_RADE | ESP_CONFIG4_RAE;
369*4882a593Smuzhiyun }
370*4882a593Smuzhiyun 
pci_esp_probe_one(struct pci_dev * pdev,const struct pci_device_id * id)371*4882a593Smuzhiyun static int pci_esp_probe_one(struct pci_dev *pdev,
372*4882a593Smuzhiyun 			      const struct pci_device_id *id)
373*4882a593Smuzhiyun {
374*4882a593Smuzhiyun 	struct scsi_host_template *hostt = &scsi_esp_template;
375*4882a593Smuzhiyun 	int err = -ENODEV;
376*4882a593Smuzhiyun 	struct Scsi_Host *shost;
377*4882a593Smuzhiyun 	struct esp *esp;
378*4882a593Smuzhiyun 	struct pci_esp_priv *pep;
379*4882a593Smuzhiyun 
380*4882a593Smuzhiyun 	if (pci_enable_device(pdev)) {
381*4882a593Smuzhiyun 		dev_printk(KERN_INFO, &pdev->dev, "cannot enable device\n");
382*4882a593Smuzhiyun 		return -ENODEV;
383*4882a593Smuzhiyun 	}
384*4882a593Smuzhiyun 
385*4882a593Smuzhiyun 	if (dma_set_mask(&pdev->dev, DMA_BIT_MASK(32))) {
386*4882a593Smuzhiyun 		dev_printk(KERN_INFO, &pdev->dev,
387*4882a593Smuzhiyun 			   "failed to set 32bit DMA mask\n");
388*4882a593Smuzhiyun 		goto fail_disable_device;
389*4882a593Smuzhiyun 	}
390*4882a593Smuzhiyun 
391*4882a593Smuzhiyun 	shost = scsi_host_alloc(hostt, sizeof(struct esp));
392*4882a593Smuzhiyun 	if (!shost) {
393*4882a593Smuzhiyun 		dev_printk(KERN_INFO, &pdev->dev,
394*4882a593Smuzhiyun 			   "failed to allocate scsi host\n");
395*4882a593Smuzhiyun 		err = -ENOMEM;
396*4882a593Smuzhiyun 		goto fail_disable_device;
397*4882a593Smuzhiyun 	}
398*4882a593Smuzhiyun 
399*4882a593Smuzhiyun 	pep = kzalloc(sizeof(struct pci_esp_priv), GFP_KERNEL);
400*4882a593Smuzhiyun 	if (!pep) {
401*4882a593Smuzhiyun 		dev_printk(KERN_INFO, &pdev->dev,
402*4882a593Smuzhiyun 			   "failed to allocate esp_priv\n");
403*4882a593Smuzhiyun 		err = -ENOMEM;
404*4882a593Smuzhiyun 		goto fail_host_alloc;
405*4882a593Smuzhiyun 	}
406*4882a593Smuzhiyun 
407*4882a593Smuzhiyun 	esp = shost_priv(shost);
408*4882a593Smuzhiyun 	esp->host = shost;
409*4882a593Smuzhiyun 	esp->dev = &pdev->dev;
410*4882a593Smuzhiyun 	esp->ops = &pci_esp_ops;
411*4882a593Smuzhiyun 	/*
412*4882a593Smuzhiyun 	 * The am53c974 HBA has a design flaw of generating
413*4882a593Smuzhiyun 	 * spurious DMA completion interrupts when using
414*4882a593Smuzhiyun 	 * DMA for command submission.
415*4882a593Smuzhiyun 	 */
416*4882a593Smuzhiyun 	esp->flags |= ESP_FLAG_USE_FIFO;
417*4882a593Smuzhiyun 	/*
418*4882a593Smuzhiyun 	 * Enable CONFIG2_FENAB to allow for large DMA transfers
419*4882a593Smuzhiyun 	 */
420*4882a593Smuzhiyun 	if (am53c974_fenab)
421*4882a593Smuzhiyun 		esp->config2 |= ESP_CONFIG2_FENAB;
422*4882a593Smuzhiyun 
423*4882a593Smuzhiyun 	pep->esp = esp;
424*4882a593Smuzhiyun 
425*4882a593Smuzhiyun 	if (pci_request_regions(pdev, DRV_MODULE_NAME)) {
426*4882a593Smuzhiyun 		dev_printk(KERN_ERR, &pdev->dev,
427*4882a593Smuzhiyun 			   "pci memory selection failed\n");
428*4882a593Smuzhiyun 		goto fail_priv_alloc;
429*4882a593Smuzhiyun 	}
430*4882a593Smuzhiyun 
431*4882a593Smuzhiyun 	esp->regs = pci_iomap(pdev, 0, pci_resource_len(pdev, 0));
432*4882a593Smuzhiyun 	if (!esp->regs) {
433*4882a593Smuzhiyun 		dev_printk(KERN_ERR, &pdev->dev, "pci I/O map failed\n");
434*4882a593Smuzhiyun 		err = -EINVAL;
435*4882a593Smuzhiyun 		goto fail_release_regions;
436*4882a593Smuzhiyun 	}
437*4882a593Smuzhiyun 	esp->dma_regs = esp->regs;
438*4882a593Smuzhiyun 
439*4882a593Smuzhiyun 	pci_set_master(pdev);
440*4882a593Smuzhiyun 
441*4882a593Smuzhiyun 	esp->command_block = dma_alloc_coherent(&pdev->dev, 16,
442*4882a593Smuzhiyun 			&esp->command_block_dma, GFP_KERNEL);
443*4882a593Smuzhiyun 	if (!esp->command_block) {
444*4882a593Smuzhiyun 		dev_printk(KERN_ERR, &pdev->dev,
445*4882a593Smuzhiyun 			   "failed to allocate command block\n");
446*4882a593Smuzhiyun 		err = -ENOMEM;
447*4882a593Smuzhiyun 		goto fail_unmap_regs;
448*4882a593Smuzhiyun 	}
449*4882a593Smuzhiyun 
450*4882a593Smuzhiyun 	pci_set_drvdata(pdev, pep);
451*4882a593Smuzhiyun 
452*4882a593Smuzhiyun 	err = request_irq(pdev->irq, scsi_esp_intr, IRQF_SHARED,
453*4882a593Smuzhiyun 			  DRV_MODULE_NAME, esp);
454*4882a593Smuzhiyun 	if (err < 0) {
455*4882a593Smuzhiyun 		dev_printk(KERN_ERR, &pdev->dev, "failed to register IRQ\n");
456*4882a593Smuzhiyun 		goto fail_unmap_command_block;
457*4882a593Smuzhiyun 	}
458*4882a593Smuzhiyun 
459*4882a593Smuzhiyun 	esp->scsi_id = 7;
460*4882a593Smuzhiyun 	dc390_check_eeprom(esp);
461*4882a593Smuzhiyun 
462*4882a593Smuzhiyun 	shost->this_id = esp->scsi_id;
463*4882a593Smuzhiyun 	shost->max_id = 8;
464*4882a593Smuzhiyun 	shost->irq = pdev->irq;
465*4882a593Smuzhiyun 	shost->io_port = pci_resource_start(pdev, 0);
466*4882a593Smuzhiyun 	shost->n_io_port = pci_resource_len(pdev, 0);
467*4882a593Smuzhiyun 	shost->unique_id = shost->io_port;
468*4882a593Smuzhiyun 	esp->scsi_id_mask = (1 << esp->scsi_id);
469*4882a593Smuzhiyun 	/* Assume 40MHz clock */
470*4882a593Smuzhiyun 	esp->cfreq = 40000000;
471*4882a593Smuzhiyun 
472*4882a593Smuzhiyun 	err = scsi_esp_register(esp);
473*4882a593Smuzhiyun 	if (err)
474*4882a593Smuzhiyun 		goto fail_free_irq;
475*4882a593Smuzhiyun 
476*4882a593Smuzhiyun 	return 0;
477*4882a593Smuzhiyun 
478*4882a593Smuzhiyun fail_free_irq:
479*4882a593Smuzhiyun 	free_irq(pdev->irq, esp);
480*4882a593Smuzhiyun fail_unmap_command_block:
481*4882a593Smuzhiyun 	pci_set_drvdata(pdev, NULL);
482*4882a593Smuzhiyun 	dma_free_coherent(&pdev->dev, 16, esp->command_block,
483*4882a593Smuzhiyun 			  esp->command_block_dma);
484*4882a593Smuzhiyun fail_unmap_regs:
485*4882a593Smuzhiyun 	pci_iounmap(pdev, esp->regs);
486*4882a593Smuzhiyun fail_release_regions:
487*4882a593Smuzhiyun 	pci_release_regions(pdev);
488*4882a593Smuzhiyun fail_priv_alloc:
489*4882a593Smuzhiyun 	kfree(pep);
490*4882a593Smuzhiyun fail_host_alloc:
491*4882a593Smuzhiyun 	scsi_host_put(shost);
492*4882a593Smuzhiyun fail_disable_device:
493*4882a593Smuzhiyun 	pci_disable_device(pdev);
494*4882a593Smuzhiyun 
495*4882a593Smuzhiyun 	return err;
496*4882a593Smuzhiyun }
497*4882a593Smuzhiyun 
pci_esp_remove_one(struct pci_dev * pdev)498*4882a593Smuzhiyun static void pci_esp_remove_one(struct pci_dev *pdev)
499*4882a593Smuzhiyun {
500*4882a593Smuzhiyun 	struct pci_esp_priv *pep = pci_get_drvdata(pdev);
501*4882a593Smuzhiyun 	struct esp *esp = pep->esp;
502*4882a593Smuzhiyun 
503*4882a593Smuzhiyun 	scsi_esp_unregister(esp);
504*4882a593Smuzhiyun 	free_irq(pdev->irq, esp);
505*4882a593Smuzhiyun 	pci_set_drvdata(pdev, NULL);
506*4882a593Smuzhiyun 	dma_free_coherent(&pdev->dev, 16, esp->command_block,
507*4882a593Smuzhiyun 			  esp->command_block_dma);
508*4882a593Smuzhiyun 	pci_iounmap(pdev, esp->regs);
509*4882a593Smuzhiyun 	pci_release_regions(pdev);
510*4882a593Smuzhiyun 	pci_disable_device(pdev);
511*4882a593Smuzhiyun 	kfree(pep);
512*4882a593Smuzhiyun 
513*4882a593Smuzhiyun 	scsi_host_put(esp->host);
514*4882a593Smuzhiyun }
515*4882a593Smuzhiyun 
516*4882a593Smuzhiyun static struct pci_device_id am53c974_pci_tbl[] = {
517*4882a593Smuzhiyun 	{ PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_SCSI,
518*4882a593Smuzhiyun 		PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
519*4882a593Smuzhiyun 	{ }
520*4882a593Smuzhiyun };
521*4882a593Smuzhiyun MODULE_DEVICE_TABLE(pci, am53c974_pci_tbl);
522*4882a593Smuzhiyun 
523*4882a593Smuzhiyun static struct pci_driver am53c974_driver = {
524*4882a593Smuzhiyun 	.name           = DRV_MODULE_NAME,
525*4882a593Smuzhiyun 	.id_table       = am53c974_pci_tbl,
526*4882a593Smuzhiyun 	.probe          = pci_esp_probe_one,
527*4882a593Smuzhiyun 	.remove         = pci_esp_remove_one,
528*4882a593Smuzhiyun };
529*4882a593Smuzhiyun 
530*4882a593Smuzhiyun module_pci_driver(am53c974_driver);
531*4882a593Smuzhiyun 
532*4882a593Smuzhiyun MODULE_DESCRIPTION("AM53C974 SCSI driver");
533*4882a593Smuzhiyun MODULE_AUTHOR("Hannes Reinecke <hare@suse.de>");
534*4882a593Smuzhiyun MODULE_LICENSE("GPL");
535*4882a593Smuzhiyun MODULE_VERSION(DRV_MODULE_VERSION);
536*4882a593Smuzhiyun MODULE_ALIAS("tmscsim");
537*4882a593Smuzhiyun 
538*4882a593Smuzhiyun module_param(am53c974_debug, bool, 0644);
539*4882a593Smuzhiyun MODULE_PARM_DESC(am53c974_debug, "Enable debugging");
540*4882a593Smuzhiyun 
541*4882a593Smuzhiyun module_param(am53c974_fenab, bool, 0444);
542*4882a593Smuzhiyun MODULE_PARM_DESC(am53c974_fenab, "Enable 24-bit DMA transfer sizes");
543