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