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