root/drivers/scsi/atari_scsi.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. SCSI_DMA_SETADR
  2. SCSI_DMA_GETADR
  3. scsi_dma_is_ignored_buserr
  4. scsi_tt_intr
  5. scsi_falcon_intr
  6. atari_scsi_fetch_restbytes
  7. falcon_release_lock
  8. falcon_get_lock
  9. atari_scsi_setup
  10. atari_scsi_dma_setup
  11. atari_scsi_dma_recv_setup
  12. atari_scsi_dma_send_setup
  13. atari_scsi_dma_residual
  14. falcon_classify_cmd
  15. atari_scsi_dma_xfer_len
  16. atari_scsi_tt_reg_read
  17. atari_scsi_tt_reg_write
  18. atari_scsi_falcon_reg_read
  19. atari_scsi_falcon_reg_write
  20. atari_scsi_host_reset
  21. atari_scsi_probe
  22. atari_scsi_remove

   1 /*
   2  * atari_scsi.c -- Device dependent functions for the Atari generic SCSI port
   3  *
   4  * Copyright 1994 Roman Hodek <Roman.Hodek@informatik.uni-erlangen.de>
   5  *
   6  *   Loosely based on the work of Robert De Vries' team and added:
   7  *    - working real DMA
   8  *    - Falcon support (untested yet!)   ++bjoern fixed and now it works
   9  *    - lots of extensions and bug fixes.
  10  *
  11  * This file is subject to the terms and conditions of the GNU General Public
  12  * License.  See the file COPYING in the main directory of this archive
  13  * for more details.
  14  *
  15  */
  16 
  17 /*
  18  * Notes for Falcon SCSI DMA
  19  *
  20  * The 5380 device is one of several that all share the DMA chip. Hence
  21  * "locking" and "unlocking" access to this chip is required.
  22  *
  23  * Two possible schemes for ST DMA acquisition by atari_scsi are:
  24  * 1) The lock is taken for each command separately (i.e. can_queue == 1).
  25  * 2) The lock is taken when the first command arrives and released
  26  * when the last command is finished (i.e. can_queue > 1).
  27  *
  28  * The first alternative limits SCSI bus utilization, since interleaving
  29  * commands is not possible. The second gives better performance but is
  30  * unfair to other drivers needing to use the ST DMA chip. In order to
  31  * allow the IDE and floppy drivers equal access to the ST DMA chip
  32  * the default is can_queue == 1.
  33  */
  34 
  35 #include <linux/module.h>
  36 #include <linux/types.h>
  37 #include <linux/blkdev.h>
  38 #include <linux/interrupt.h>
  39 #include <linux/init.h>
  40 #include <linux/nvram.h>
  41 #include <linux/bitops.h>
  42 #include <linux/wait.h>
  43 #include <linux/platform_device.h>
  44 
  45 #include <asm/setup.h>
  46 #include <asm/atarihw.h>
  47 #include <asm/atariints.h>
  48 #include <asm/atari_stdma.h>
  49 #include <asm/atari_stram.h>
  50 #include <asm/io.h>
  51 
  52 #include <scsi/scsi_host.h>
  53 
  54 #define DMA_MIN_SIZE                    32
  55 
  56 /* Definitions for the core NCR5380 driver. */
  57 
  58 #define NCR5380_implementation_fields   /* none */
  59 
  60 static u8 (*atari_scsi_reg_read)(unsigned int);
  61 static void (*atari_scsi_reg_write)(unsigned int, u8);
  62 
  63 #define NCR5380_read(reg)               atari_scsi_reg_read(reg)
  64 #define NCR5380_write(reg, value)       atari_scsi_reg_write(reg, value)
  65 
  66 #define NCR5380_queue_command           atari_scsi_queue_command
  67 #define NCR5380_abort                   atari_scsi_abort
  68 #define NCR5380_info                    atari_scsi_info
  69 
  70 #define NCR5380_dma_xfer_len            atari_scsi_dma_xfer_len
  71 #define NCR5380_dma_recv_setup          atari_scsi_dma_recv_setup
  72 #define NCR5380_dma_send_setup          atari_scsi_dma_send_setup
  73 #define NCR5380_dma_residual            atari_scsi_dma_residual
  74 
  75 #define NCR5380_acquire_dma_irq(instance)      falcon_get_lock(instance)
  76 #define NCR5380_release_dma_irq(instance)      falcon_release_lock()
  77 
  78 #include "NCR5380.h"
  79 
  80 
  81 #define IS_A_TT()       ATARIHW_PRESENT(TT_SCSI)
  82 
  83 #define SCSI_DMA_WRITE_P(elt,val)                               \
  84         do {                                                    \
  85                 unsigned long v = val;                          \
  86                 tt_scsi_dma.elt##_lo = v & 0xff;                \
  87                 v >>= 8;                                        \
  88                 tt_scsi_dma.elt##_lmd = v & 0xff;               \
  89                 v >>= 8;                                        \
  90                 tt_scsi_dma.elt##_hmd = v & 0xff;               \
  91                 v >>= 8;                                        \
  92                 tt_scsi_dma.elt##_hi = v & 0xff;                \
  93         } while(0)
  94 
  95 #define SCSI_DMA_READ_P(elt)                                    \
  96         (((((((unsigned long)tt_scsi_dma.elt##_hi << 8) |       \
  97              (unsigned long)tt_scsi_dma.elt##_hmd) << 8) |      \
  98            (unsigned long)tt_scsi_dma.elt##_lmd) << 8) |        \
  99          (unsigned long)tt_scsi_dma.elt##_lo)
 100 
 101 
 102 static inline void SCSI_DMA_SETADR(unsigned long adr)
 103 {
 104         st_dma.dma_lo = (unsigned char)adr;
 105         MFPDELAY();
 106         adr >>= 8;
 107         st_dma.dma_md = (unsigned char)adr;
 108         MFPDELAY();
 109         adr >>= 8;
 110         st_dma.dma_hi = (unsigned char)adr;
 111         MFPDELAY();
 112 }
 113 
 114 static inline unsigned long SCSI_DMA_GETADR(void)
 115 {
 116         unsigned long adr;
 117         adr = st_dma.dma_lo;
 118         MFPDELAY();
 119         adr |= (st_dma.dma_md & 0xff) << 8;
 120         MFPDELAY();
 121         adr |= (st_dma.dma_hi & 0xff) << 16;
 122         MFPDELAY();
 123         return adr;
 124 }
 125 
 126 static void atari_scsi_fetch_restbytes(void);
 127 
 128 static unsigned long    atari_dma_residual, atari_dma_startaddr;
 129 static short            atari_dma_active;
 130 /* pointer to the dribble buffer */
 131 static char             *atari_dma_buffer;
 132 /* precalculated physical address of the dribble buffer */
 133 static unsigned long    atari_dma_phys_buffer;
 134 /* != 0 tells the Falcon int handler to copy data from the dribble buffer */
 135 static char             *atari_dma_orig_addr;
 136 /* size of the dribble buffer; 4k seems enough, since the Falcon cannot use
 137  * scatter-gather anyway, so most transfers are 1024 byte only. In the rare
 138  * cases where requests to physical contiguous buffers have been merged, this
 139  * request is <= 4k (one page). So I don't think we have to split transfers
 140  * just due to this buffer size...
 141  */
 142 #define STRAM_BUFFER_SIZE       (4096)
 143 /* mask for address bits that can't be used with the ST-DMA */
 144 static unsigned long    atari_dma_stram_mask;
 145 #define STRAM_ADDR(a)   (((a) & atari_dma_stram_mask) == 0)
 146 
 147 static int setup_can_queue = -1;
 148 module_param(setup_can_queue, int, 0);
 149 static int setup_cmd_per_lun = -1;
 150 module_param(setup_cmd_per_lun, int, 0);
 151 static int setup_sg_tablesize = -1;
 152 module_param(setup_sg_tablesize, int, 0);
 153 static int setup_hostid = -1;
 154 module_param(setup_hostid, int, 0);
 155 static int setup_toshiba_delay = -1;
 156 module_param(setup_toshiba_delay, int, 0);
 157 
 158 
 159 static int scsi_dma_is_ignored_buserr(unsigned char dma_stat)
 160 {
 161         int i;
 162         unsigned long addr = SCSI_DMA_READ_P(dma_addr), end_addr;
 163 
 164         if (dma_stat & 0x01) {
 165 
 166                 /* A bus error happens when DMA-ing from the last page of a
 167                  * physical memory chunk (DMA prefetch!), but that doesn't hurt.
 168                  * Check for this case:
 169                  */
 170 
 171                 for (i = 0; i < m68k_num_memory; ++i) {
 172                         end_addr = m68k_memory[i].addr + m68k_memory[i].size;
 173                         if (end_addr <= addr && addr <= end_addr + 4)
 174                                 return 1;
 175                 }
 176         }
 177         return 0;
 178 }
 179 
 180 
 181 static irqreturn_t scsi_tt_intr(int irq, void *dev)
 182 {
 183         struct Scsi_Host *instance = dev;
 184         struct NCR5380_hostdata *hostdata = shost_priv(instance);
 185         int dma_stat;
 186 
 187         dma_stat = tt_scsi_dma.dma_ctrl;
 188 
 189         dsprintk(NDEBUG_INTR, instance, "NCR5380 interrupt, DMA status = %02x\n",
 190                  dma_stat & 0xff);
 191 
 192         /* Look if it was the DMA that has interrupted: First possibility
 193          * is that a bus error occurred...
 194          */
 195         if (dma_stat & 0x80) {
 196                 if (!scsi_dma_is_ignored_buserr(dma_stat)) {
 197                         printk(KERN_ERR "SCSI DMA caused bus error near 0x%08lx\n",
 198                                SCSI_DMA_READ_P(dma_addr));
 199                         printk(KERN_CRIT "SCSI DMA bus error -- bad DMA programming!");
 200                 }
 201         }
 202 
 203         /* If the DMA is active but not finished, we have the case
 204          * that some other 5380 interrupt occurred within the DMA transfer.
 205          * This means we have residual bytes, if the desired end address
 206          * is not yet reached. Maybe we have to fetch some bytes from the
 207          * rest data register, too. The residual must be calculated from
 208          * the address pointer, not the counter register, because only the
 209          * addr reg counts bytes not yet written and pending in the rest
 210          * data reg!
 211          */
 212         if ((dma_stat & 0x02) && !(dma_stat & 0x40)) {
 213                 atari_dma_residual = hostdata->dma_len -
 214                         (SCSI_DMA_READ_P(dma_addr) - atari_dma_startaddr);
 215 
 216                 dprintk(NDEBUG_DMA, "SCSI DMA: There are %ld residual bytes.\n",
 217                            atari_dma_residual);
 218 
 219                 if ((signed int)atari_dma_residual < 0)
 220                         atari_dma_residual = 0;
 221                 if ((dma_stat & 1) == 0) {
 222                         /*
 223                          * After read operations, we maybe have to
 224                          * transport some rest bytes
 225                          */
 226                         atari_scsi_fetch_restbytes();
 227                 } else {
 228                         /*
 229                          * There seems to be a nasty bug in some SCSI-DMA/NCR
 230                          * combinations: If a target disconnects while a write
 231                          * operation is going on, the address register of the
 232                          * DMA may be a few bytes farer than it actually read.
 233                          * This is probably due to DMA prefetching and a delay
 234                          * between DMA and NCR.  Experiments showed that the
 235                          * dma_addr is 9 bytes to high, but this could vary.
 236                          * The problem is, that the residual is thus calculated
 237                          * wrong and the next transfer will start behind where
 238                          * it should.  So we round up the residual to the next
 239                          * multiple of a sector size, if it isn't already a
 240                          * multiple and the originally expected transfer size
 241                          * was.  The latter condition is there to ensure that
 242                          * the correction is taken only for "real" data
 243                          * transfers and not for, e.g., the parameters of some
 244                          * other command.  These shouldn't disconnect anyway.
 245                          */
 246                         if (atari_dma_residual & 0x1ff) {
 247                                 dprintk(NDEBUG_DMA, "SCSI DMA: DMA bug corrected, "
 248                                            "difference %ld bytes\n",
 249                                            512 - (atari_dma_residual & 0x1ff));
 250                                 atari_dma_residual = (atari_dma_residual + 511) & ~0x1ff;
 251                         }
 252                 }
 253                 tt_scsi_dma.dma_ctrl = 0;
 254         }
 255 
 256         /* If the DMA is finished, fetch the rest bytes and turn it off */
 257         if (dma_stat & 0x40) {
 258                 atari_dma_residual = 0;
 259                 if ((dma_stat & 1) == 0)
 260                         atari_scsi_fetch_restbytes();
 261                 tt_scsi_dma.dma_ctrl = 0;
 262         }
 263 
 264         NCR5380_intr(irq, dev);
 265 
 266         return IRQ_HANDLED;
 267 }
 268 
 269 
 270 static irqreturn_t scsi_falcon_intr(int irq, void *dev)
 271 {
 272         struct Scsi_Host *instance = dev;
 273         struct NCR5380_hostdata *hostdata = shost_priv(instance);
 274         int dma_stat;
 275 
 276         /* Turn off DMA and select sector counter register before
 277          * accessing the status register (Atari recommendation!)
 278          */
 279         st_dma.dma_mode_status = 0x90;
 280         dma_stat = st_dma.dma_mode_status;
 281 
 282         /* Bit 0 indicates some error in the DMA process... don't know
 283          * what happened exactly (no further docu).
 284          */
 285         if (!(dma_stat & 0x01)) {
 286                 /* DMA error */
 287                 printk(KERN_CRIT "SCSI DMA error near 0x%08lx!\n", SCSI_DMA_GETADR());
 288         }
 289 
 290         /* If the DMA was active, but now bit 1 is not clear, it is some
 291          * other 5380 interrupt that finishes the DMA transfer. We have to
 292          * calculate the number of residual bytes and give a warning if
 293          * bytes are stuck in the ST-DMA fifo (there's no way to reach them!)
 294          */
 295         if (atari_dma_active && (dma_stat & 0x02)) {
 296                 unsigned long transferred;
 297 
 298                 transferred = SCSI_DMA_GETADR() - atari_dma_startaddr;
 299                 /* The ST-DMA address is incremented in 2-byte steps, but the
 300                  * data are written only in 16-byte chunks. If the number of
 301                  * transferred bytes is not divisible by 16, the remainder is
 302                  * lost somewhere in outer space.
 303                  */
 304                 if (transferred & 15)
 305                         printk(KERN_ERR "SCSI DMA error: %ld bytes lost in "
 306                                "ST-DMA fifo\n", transferred & 15);
 307 
 308                 atari_dma_residual = hostdata->dma_len - transferred;
 309                 dprintk(NDEBUG_DMA, "SCSI DMA: There are %ld residual bytes.\n",
 310                            atari_dma_residual);
 311         } else
 312                 atari_dma_residual = 0;
 313         atari_dma_active = 0;
 314 
 315         if (atari_dma_orig_addr) {
 316                 /* If the dribble buffer was used on a read operation, copy the DMA-ed
 317                  * data to the original destination address.
 318                  */
 319                 memcpy(atari_dma_orig_addr, phys_to_virt(atari_dma_startaddr),
 320                        hostdata->dma_len - atari_dma_residual);
 321                 atari_dma_orig_addr = NULL;
 322         }
 323 
 324         NCR5380_intr(irq, dev);
 325 
 326         return IRQ_HANDLED;
 327 }
 328 
 329 
 330 static void atari_scsi_fetch_restbytes(void)
 331 {
 332         int nr;
 333         char *src, *dst;
 334         unsigned long phys_dst;
 335 
 336         /* fetch rest bytes in the DMA register */
 337         phys_dst = SCSI_DMA_READ_P(dma_addr);
 338         nr = phys_dst & 3;
 339         if (nr) {
 340                 /* there are 'nr' bytes left for the last long address
 341                    before the DMA pointer */
 342                 phys_dst ^= nr;
 343                 dprintk(NDEBUG_DMA, "SCSI DMA: there are %d rest bytes for phys addr 0x%08lx",
 344                            nr, phys_dst);
 345                 /* The content of the DMA pointer is a physical address!  */
 346                 dst = phys_to_virt(phys_dst);
 347                 dprintk(NDEBUG_DMA, " = virt addr %p\n", dst);
 348                 for (src = (char *)&tt_scsi_dma.dma_restdata; nr != 0; --nr)
 349                         *dst++ = *src++;
 350         }
 351 }
 352 
 353 
 354 /* This function releases the lock on the DMA chip if there is no
 355  * connected command and the disconnected queue is empty.
 356  */
 357 
 358 static void falcon_release_lock(void)
 359 {
 360         if (IS_A_TT())
 361                 return;
 362 
 363         if (stdma_is_locked_by(scsi_falcon_intr))
 364                 stdma_release();
 365 }
 366 
 367 /* This function manages the locking of the ST-DMA.
 368  * If the DMA isn't locked already for SCSI, it tries to lock it by
 369  * calling stdma_lock(). But if the DMA is locked by the SCSI code and
 370  * there are other drivers waiting for the chip, we do not issue the
 371  * command immediately but tell the SCSI mid-layer to defer.
 372  */
 373 
 374 static int falcon_get_lock(struct Scsi_Host *instance)
 375 {
 376         if (IS_A_TT())
 377                 return 1;
 378 
 379         if (stdma_is_locked_by(scsi_falcon_intr) &&
 380             instance->hostt->can_queue > 1)
 381                 return 1;
 382 
 383         if (in_interrupt())
 384                 return stdma_try_lock(scsi_falcon_intr, instance);
 385 
 386         stdma_lock(scsi_falcon_intr, instance);
 387         return 1;
 388 }
 389 
 390 #ifndef MODULE
 391 static int __init atari_scsi_setup(char *str)
 392 {
 393         /* Format of atascsi parameter is:
 394          *   atascsi=<can_queue>,<cmd_per_lun>,<sg_tablesize>,<hostid>,<use_tags>
 395          * Defaults depend on TT or Falcon, determined at run time.
 396          * Negative values mean don't change.
 397          */
 398         int ints[8];
 399 
 400         get_options(str, ARRAY_SIZE(ints), ints);
 401 
 402         if (ints[0] < 1) {
 403                 printk("atari_scsi_setup: no arguments!\n");
 404                 return 0;
 405         }
 406         if (ints[0] >= 1)
 407                 setup_can_queue = ints[1];
 408         if (ints[0] >= 2)
 409                 setup_cmd_per_lun = ints[2];
 410         if (ints[0] >= 3)
 411                 setup_sg_tablesize = ints[3];
 412         if (ints[0] >= 4)
 413                 setup_hostid = ints[4];
 414         /* ints[5] (use_tagged_queuing) is ignored */
 415         /* ints[6] (use_pdma) is ignored */
 416         if (ints[0] >= 7)
 417                 setup_toshiba_delay = ints[7];
 418 
 419         return 1;
 420 }
 421 
 422 __setup("atascsi=", atari_scsi_setup);
 423 #endif /* !MODULE */
 424 
 425 static unsigned long atari_scsi_dma_setup(struct NCR5380_hostdata *hostdata,
 426                                           void *data, unsigned long count,
 427                                           int dir)
 428 {
 429         unsigned long addr = virt_to_phys(data);
 430 
 431         dprintk(NDEBUG_DMA, "scsi%d: setting up dma, data = %p, phys = %lx, count = %ld, dir = %d\n",
 432                 hostdata->host->host_no, data, addr, count, dir);
 433 
 434         if (!IS_A_TT() && !STRAM_ADDR(addr)) {
 435                 /* If we have a non-DMAable address on a Falcon, use the dribble
 436                  * buffer; 'orig_addr' != 0 in the read case tells the interrupt
 437                  * handler to copy data from the dribble buffer to the originally
 438                  * wanted address.
 439                  */
 440                 if (dir)
 441                         memcpy(atari_dma_buffer, data, count);
 442                 else
 443                         atari_dma_orig_addr = data;
 444                 addr = atari_dma_phys_buffer;
 445         }
 446 
 447         atari_dma_startaddr = addr;     /* Needed for calculating residual later. */
 448 
 449         /* Cache cleanup stuff: On writes, push any dirty cache out before sending
 450          * it to the peripheral. (Must be done before DMA setup, since at least
 451          * the ST-DMA begins to fill internal buffers right after setup. For
 452          * reads, invalidate any cache, may be altered after DMA without CPU
 453          * knowledge.
 454          *
 455          * ++roman: For the Medusa, there's no need at all for that cache stuff,
 456          * because the hardware does bus snooping (fine!).
 457          */
 458         dma_cache_maintenance(addr, count, dir);
 459 
 460         if (IS_A_TT()) {
 461                 tt_scsi_dma.dma_ctrl = dir;
 462                 SCSI_DMA_WRITE_P(dma_addr, addr);
 463                 SCSI_DMA_WRITE_P(dma_cnt, count);
 464                 tt_scsi_dma.dma_ctrl = dir | 2;
 465         } else { /* ! IS_A_TT */
 466 
 467                 /* set address */
 468                 SCSI_DMA_SETADR(addr);
 469 
 470                 /* toggle direction bit to clear FIFO and set DMA direction */
 471                 dir <<= 8;
 472                 st_dma.dma_mode_status = 0x90 | dir;
 473                 st_dma.dma_mode_status = 0x90 | (dir ^ 0x100);
 474                 st_dma.dma_mode_status = 0x90 | dir;
 475                 udelay(40);
 476                 /* On writes, round up the transfer length to the next multiple of 512
 477                  * (see also comment at atari_dma_xfer_len()). */
 478                 st_dma.fdc_acces_seccount = (count + (dir ? 511 : 0)) >> 9;
 479                 udelay(40);
 480                 st_dma.dma_mode_status = 0x10 | dir;
 481                 udelay(40);
 482                 /* need not restore value of dir, only boolean value is tested */
 483                 atari_dma_active = 1;
 484         }
 485 
 486         return count;
 487 }
 488 
 489 static inline int atari_scsi_dma_recv_setup(struct NCR5380_hostdata *hostdata,
 490                                             unsigned char *data, int count)
 491 {
 492         return atari_scsi_dma_setup(hostdata, data, count, 0);
 493 }
 494 
 495 static inline int atari_scsi_dma_send_setup(struct NCR5380_hostdata *hostdata,
 496                                             unsigned char *data, int count)
 497 {
 498         return atari_scsi_dma_setup(hostdata, data, count, 1);
 499 }
 500 
 501 static int atari_scsi_dma_residual(struct NCR5380_hostdata *hostdata)
 502 {
 503         return atari_dma_residual;
 504 }
 505 
 506 
 507 #define CMD_SURELY_BLOCK_MODE   0
 508 #define CMD_SURELY_BYTE_MODE    1
 509 #define CMD_MODE_UNKNOWN                2
 510 
 511 static int falcon_classify_cmd(struct scsi_cmnd *cmd)
 512 {
 513         unsigned char opcode = cmd->cmnd[0];
 514 
 515         if (opcode == READ_DEFECT_DATA || opcode == READ_LONG ||
 516             opcode == READ_BUFFER)
 517                 return CMD_SURELY_BYTE_MODE;
 518         else if (opcode == READ_6 || opcode == READ_10 ||
 519                  opcode == 0xa8 /* READ_12 */ || opcode == READ_REVERSE ||
 520                  opcode == RECOVER_BUFFERED_DATA) {
 521                 /* In case of a sequential-access target (tape), special care is
 522                  * needed here: The transfer is block-mode only if the 'fixed' bit is
 523                  * set! */
 524                 if (cmd->device->type == TYPE_TAPE && !(cmd->cmnd[1] & 1))
 525                         return CMD_SURELY_BYTE_MODE;
 526                 else
 527                         return CMD_SURELY_BLOCK_MODE;
 528         } else
 529                 return CMD_MODE_UNKNOWN;
 530 }
 531 
 532 
 533 /* This function calculates the number of bytes that can be transferred via
 534  * DMA. On the TT, this is arbitrary, but on the Falcon we have to use the
 535  * ST-DMA chip. There are only multiples of 512 bytes possible and max.
 536  * 255*512 bytes :-( This means also, that defining READ_OVERRUNS is not
 537  * possible on the Falcon, since that would require to program the DMA for
 538  * n*512 - atari_read_overrun bytes. But it seems that the Falcon doesn't have
 539  * the overrun problem, so this question is academic :-)
 540  */
 541 
 542 static int atari_scsi_dma_xfer_len(struct NCR5380_hostdata *hostdata,
 543                                    struct scsi_cmnd *cmd)
 544 {
 545         int wanted_len = cmd->SCp.this_residual;
 546         int possible_len, limit;
 547 
 548         if (wanted_len < DMA_MIN_SIZE)
 549                 return 0;
 550 
 551         if (IS_A_TT())
 552                 /* TT SCSI DMA can transfer arbitrary #bytes */
 553                 return wanted_len;
 554 
 555         /* ST DMA chip is stupid -- only multiples of 512 bytes! (and max.
 556          * 255*512 bytes, but this should be enough)
 557          *
 558          * ++roman: Aaargl! Another Falcon-SCSI problem... There are some commands
 559          * that return a number of bytes which cannot be known beforehand. In this
 560          * case, the given transfer length is an "allocation length". Now it
 561          * can happen that this allocation length is a multiple of 512 bytes and
 562          * the DMA is used. But if not n*512 bytes really arrive, some input data
 563          * will be lost in the ST-DMA's FIFO :-( Thus, we have to distinguish
 564          * between commands that do block transfers and those that do byte
 565          * transfers. But this isn't easy... there are lots of vendor specific
 566          * commands, and the user can issue any command via the
 567          * SCSI_IOCTL_SEND_COMMAND.
 568          *
 569          * The solution: We classify SCSI commands in 1) surely block-mode cmd.s,
 570          * 2) surely byte-mode cmd.s and 3) cmd.s with unknown mode. In case 1)
 571          * and 3), the thing to do is obvious: allow any number of blocks via DMA
 572          * or none. In case 2), we apply some heuristic: Byte mode is assumed if
 573          * the transfer (allocation) length is < 1024, hoping that no cmd. not
 574          * explicitly known as byte mode have such big allocation lengths...
 575          * BTW, all the discussion above applies only to reads. DMA writes are
 576          * unproblematic anyways, since the targets aborts the transfer after
 577          * receiving a sufficient number of bytes.
 578          *
 579          * Another point: If the transfer is from/to an non-ST-RAM address, we
 580          * use the dribble buffer and thus can do only STRAM_BUFFER_SIZE bytes.
 581          */
 582 
 583         if (cmd->sc_data_direction == DMA_TO_DEVICE) {
 584                 /* Write operation can always use the DMA, but the transfer size must
 585                  * be rounded up to the next multiple of 512 (atari_dma_setup() does
 586                  * this).
 587                  */
 588                 possible_len = wanted_len;
 589         } else {
 590                 /* Read operations: if the wanted transfer length is not a multiple of
 591                  * 512, we cannot use DMA, since the ST-DMA cannot split transfers
 592                  * (no interrupt on DMA finished!)
 593                  */
 594                 if (wanted_len & 0x1ff)
 595                         possible_len = 0;
 596                 else {
 597                         /* Now classify the command (see above) and decide whether it is
 598                          * allowed to do DMA at all */
 599                         switch (falcon_classify_cmd(cmd)) {
 600                         case CMD_SURELY_BLOCK_MODE:
 601                                 possible_len = wanted_len;
 602                                 break;
 603                         case CMD_SURELY_BYTE_MODE:
 604                                 possible_len = 0; /* DMA prohibited */
 605                                 break;
 606                         case CMD_MODE_UNKNOWN:
 607                         default:
 608                                 /* For unknown commands assume block transfers if the transfer
 609                                  * size/allocation length is >= 1024 */
 610                                 possible_len = (wanted_len < 1024) ? 0 : wanted_len;
 611                                 break;
 612                         }
 613                 }
 614         }
 615 
 616         /* Last step: apply the hard limit on DMA transfers */
 617         limit = (atari_dma_buffer && !STRAM_ADDR(virt_to_phys(cmd->SCp.ptr))) ?
 618                     STRAM_BUFFER_SIZE : 255*512;
 619         if (possible_len > limit)
 620                 possible_len = limit;
 621 
 622         if (possible_len != wanted_len)
 623                 dprintk(NDEBUG_DMA, "DMA transfer now %d bytes instead of %d\n",
 624                         possible_len, wanted_len);
 625 
 626         return possible_len;
 627 }
 628 
 629 
 630 /* NCR5380 register access functions
 631  *
 632  * There are separate functions for TT and Falcon, because the access
 633  * methods are quite different. The calling macros NCR5380_read and
 634  * NCR5380_write call these functions via function pointers.
 635  */
 636 
 637 static u8 atari_scsi_tt_reg_read(unsigned int reg)
 638 {
 639         return tt_scsi_regp[reg * 2];
 640 }
 641 
 642 static void atari_scsi_tt_reg_write(unsigned int reg, u8 value)
 643 {
 644         tt_scsi_regp[reg * 2] = value;
 645 }
 646 
 647 static u8 atari_scsi_falcon_reg_read(unsigned int reg)
 648 {
 649         unsigned long flags;
 650         u8 result;
 651 
 652         reg += 0x88;
 653         local_irq_save(flags);
 654         dma_wd.dma_mode_status = (u_short)reg;
 655         result = (u8)dma_wd.fdc_acces_seccount;
 656         local_irq_restore(flags);
 657         return result;
 658 }
 659 
 660 static void atari_scsi_falcon_reg_write(unsigned int reg, u8 value)
 661 {
 662         unsigned long flags;
 663 
 664         reg += 0x88;
 665         local_irq_save(flags);
 666         dma_wd.dma_mode_status = (u_short)reg;
 667         dma_wd.fdc_acces_seccount = (u_short)value;
 668         local_irq_restore(flags);
 669 }
 670 
 671 
 672 #include "NCR5380.c"
 673 
 674 static int atari_scsi_host_reset(struct scsi_cmnd *cmd)
 675 {
 676         int rv;
 677         unsigned long flags;
 678 
 679         local_irq_save(flags);
 680 
 681         /* Abort a maybe active DMA transfer */
 682         if (IS_A_TT()) {
 683                 tt_scsi_dma.dma_ctrl = 0;
 684         } else {
 685                 if (stdma_is_locked_by(scsi_falcon_intr))
 686                         st_dma.dma_mode_status = 0x90;
 687                 atari_dma_active = 0;
 688                 atari_dma_orig_addr = NULL;
 689         }
 690 
 691         rv = NCR5380_host_reset(cmd);
 692 
 693         /* The 5380 raises its IRQ line while _RST is active but the ST DMA
 694          * "lock" has been released so this interrupt may end up handled by
 695          * floppy or IDE driver (if one of them holds the lock). The NCR5380
 696          * interrupt flag has been cleared already.
 697          */
 698 
 699         local_irq_restore(flags);
 700 
 701         return rv;
 702 }
 703 
 704 #define DRV_MODULE_NAME         "atari_scsi"
 705 #define PFX                     DRV_MODULE_NAME ": "
 706 
 707 static struct scsi_host_template atari_scsi_template = {
 708         .module                 = THIS_MODULE,
 709         .proc_name              = DRV_MODULE_NAME,
 710         .name                   = "Atari native SCSI",
 711         .info                   = atari_scsi_info,
 712         .queuecommand           = atari_scsi_queue_command,
 713         .eh_abort_handler       = atari_scsi_abort,
 714         .eh_host_reset_handler  = atari_scsi_host_reset,
 715         .this_id                = 7,
 716         .cmd_per_lun            = 2,
 717         .dma_boundary           = PAGE_SIZE - 1,
 718         .cmd_size               = NCR5380_CMD_SIZE,
 719 };
 720 
 721 static int __init atari_scsi_probe(struct platform_device *pdev)
 722 {
 723         struct Scsi_Host *instance;
 724         int error;
 725         struct resource *irq;
 726         int host_flags = 0;
 727 
 728         irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
 729         if (!irq)
 730                 return -ENODEV;
 731 
 732         if (ATARIHW_PRESENT(TT_SCSI)) {
 733                 atari_scsi_reg_read  = atari_scsi_tt_reg_read;
 734                 atari_scsi_reg_write = atari_scsi_tt_reg_write;
 735         } else {
 736                 atari_scsi_reg_read  = atari_scsi_falcon_reg_read;
 737                 atari_scsi_reg_write = atari_scsi_falcon_reg_write;
 738         }
 739 
 740         if (ATARIHW_PRESENT(TT_SCSI)) {
 741                 atari_scsi_template.can_queue    = 16;
 742                 atari_scsi_template.sg_tablesize = SG_ALL;
 743         } else {
 744                 atari_scsi_template.can_queue    = 1;
 745                 atari_scsi_template.sg_tablesize = 1;
 746         }
 747 
 748         if (setup_can_queue > 0)
 749                 atari_scsi_template.can_queue = setup_can_queue;
 750 
 751         if (setup_cmd_per_lun > 0)
 752                 atari_scsi_template.cmd_per_lun = setup_cmd_per_lun;
 753 
 754         /* Don't increase sg_tablesize on Falcon! */
 755         if (ATARIHW_PRESENT(TT_SCSI) && setup_sg_tablesize > 0)
 756                 atari_scsi_template.sg_tablesize = setup_sg_tablesize;
 757 
 758         if (setup_hostid >= 0) {
 759                 atari_scsi_template.this_id = setup_hostid & 7;
 760         } else if (IS_REACHABLE(CONFIG_NVRAM)) {
 761                 /* Test if a host id is set in the NVRam */
 762                 if (ATARIHW_PRESENT(TT_CLK)) {
 763                         unsigned char b;
 764                         loff_t offset = 16;
 765                         ssize_t count = nvram_read(&b, 1, &offset);
 766 
 767                         /* Arbitration enabled? (for TOS)
 768                          * If yes, use configured host ID
 769                          */
 770                         if ((count == 1) && (b & 0x80))
 771                                 atari_scsi_template.this_id = b & 7;
 772                 }
 773         }
 774 
 775         /* If running on a Falcon and if there's TT-Ram (i.e., more than one
 776          * memory block, since there's always ST-Ram in a Falcon), then
 777          * allocate a STRAM_BUFFER_SIZE byte dribble buffer for transfers
 778          * from/to alternative Ram.
 779          */
 780         if (ATARIHW_PRESENT(ST_SCSI) && !ATARIHW_PRESENT(EXTD_DMA) &&
 781             m68k_realnum_memory > 1) {
 782                 atari_dma_buffer = atari_stram_alloc(STRAM_BUFFER_SIZE, "SCSI");
 783                 if (!atari_dma_buffer) {
 784                         pr_err(PFX "can't allocate ST-RAM double buffer\n");
 785                         return -ENOMEM;
 786                 }
 787                 atari_dma_phys_buffer = atari_stram_to_phys(atari_dma_buffer);
 788                 atari_dma_orig_addr = NULL;
 789         }
 790 
 791         instance = scsi_host_alloc(&atari_scsi_template,
 792                                    sizeof(struct NCR5380_hostdata));
 793         if (!instance) {
 794                 error = -ENOMEM;
 795                 goto fail_alloc;
 796         }
 797 
 798         instance->irq = irq->start;
 799 
 800         host_flags |= IS_A_TT() ? 0 : FLAG_LATE_DMA_SETUP;
 801         host_flags |= setup_toshiba_delay > 0 ? FLAG_TOSHIBA_DELAY : 0;
 802 
 803         error = NCR5380_init(instance, host_flags);
 804         if (error)
 805                 goto fail_init;
 806 
 807         if (IS_A_TT()) {
 808                 error = request_irq(instance->irq, scsi_tt_intr, 0,
 809                                     "NCR5380", instance);
 810                 if (error) {
 811                         pr_err(PFX "request irq %d failed, aborting\n",
 812                                instance->irq);
 813                         goto fail_irq;
 814                 }
 815                 tt_mfp.active_edge |= 0x80;     /* SCSI int on L->H */
 816 
 817                 tt_scsi_dma.dma_ctrl = 0;
 818                 atari_dma_residual = 0;
 819 
 820                 /* While the read overruns (described by Drew Eckhardt in
 821                  * NCR5380.c) never happened on TTs, they do in fact on the
 822                  * Medusa (This was the cause why SCSI didn't work right for
 823                  * so long there.) Since handling the overruns slows down
 824                  * a bit, I turned the #ifdef's into a runtime condition.
 825                  *
 826                  * In principle it should be sufficient to do max. 1 byte with
 827                  * PIO, but there is another problem on the Medusa with the DMA
 828                  * rest data register. So read_overruns is currently set
 829                  * to 4 to avoid having transfers that aren't a multiple of 4.
 830                  * If the rest data bug is fixed, this can be lowered to 1.
 831                  */
 832                 if (MACH_IS_MEDUSA) {
 833                         struct NCR5380_hostdata *hostdata =
 834                                 shost_priv(instance);
 835 
 836                         hostdata->read_overruns = 4;
 837                 }
 838         } else {
 839                 /* Nothing to do for the interrupt: the ST-DMA is initialized
 840                  * already.
 841                  */
 842                 atari_dma_residual = 0;
 843                 atari_dma_active = 0;
 844                 atari_dma_stram_mask = (ATARIHW_PRESENT(EXTD_DMA) ? 0x00000000
 845                                         : 0xff000000);
 846         }
 847 
 848         NCR5380_maybe_reset_bus(instance);
 849 
 850         error = scsi_add_host(instance, NULL);
 851         if (error)
 852                 goto fail_host;
 853 
 854         platform_set_drvdata(pdev, instance);
 855 
 856         scsi_scan_host(instance);
 857         return 0;
 858 
 859 fail_host:
 860         if (IS_A_TT())
 861                 free_irq(instance->irq, instance);
 862 fail_irq:
 863         NCR5380_exit(instance);
 864 fail_init:
 865         scsi_host_put(instance);
 866 fail_alloc:
 867         if (atari_dma_buffer)
 868                 atari_stram_free(atari_dma_buffer);
 869         return error;
 870 }
 871 
 872 static int __exit atari_scsi_remove(struct platform_device *pdev)
 873 {
 874         struct Scsi_Host *instance = platform_get_drvdata(pdev);
 875 
 876         scsi_remove_host(instance);
 877         if (IS_A_TT())
 878                 free_irq(instance->irq, instance);
 879         NCR5380_exit(instance);
 880         scsi_host_put(instance);
 881         if (atari_dma_buffer)
 882                 atari_stram_free(atari_dma_buffer);
 883         return 0;
 884 }
 885 
 886 static struct platform_driver atari_scsi_driver = {
 887         .remove = __exit_p(atari_scsi_remove),
 888         .driver = {
 889                 .name   = DRV_MODULE_NAME,
 890         },
 891 };
 892 
 893 module_platform_driver_probe(atari_scsi_driver, atari_scsi_probe);
 894 
 895 MODULE_ALIAS("platform:" DRV_MODULE_NAME);
 896 MODULE_LICENSE("GPL");

/* [<][>][^][v][top][bottom][index][help] */