linux-old/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
  68#include <linux/config.h>
  69#include <linux/module.h>
  70
  71#define NDEBUG (0)
  72
  73#define NDEBUG_ABORT    0x800000
  74#define NDEBUG_TAGS     0x1000000
  75#define NDEBUG_MERGING  0x2000000
  76
  77#define AUTOSENSE
  78/* For the Atari version, use only polled IO or REAL_DMA */
  79#define REAL_DMA
  80/* Support tagged queuing? (on devices that are able to... :-) */
  81#define SUPPORT_TAGS
  82#define MAX_TAGS 32
  83
  84#include <linux/types.h>
  85#include <linux/stddef.h>
  86#include <linux/ctype.h>
  87#include <linux/delay.h>
  88#include <linux/mm.h>
  89#include <linux/blk.h>
  90#include <linux/sched.h>
  91#include <linux/interrupt.h>
  92#include <linux/init.h>
  93#include <linux/nvram.h>
  94
  95#include <asm/setup.h>
  96#include <asm/atarihw.h>
  97#include <asm/atariints.h>
  98#include <asm/page.h>
  99#include <asm/pgtable.h>
 100#include <asm/irq.h>
 101#include <asm/traps.h>
 102#include <asm/bitops.h>
 103
 104#include "scsi.h"
 105#include "hosts.h"
 106#include "atari_scsi.h"
 107#include "NCR5380.h"
 108#include "constants.h"
 109#include <asm/atari_stdma.h>
 110#include <asm/atari_stram.h>
 111#include <asm/io.h>
 112
 113#include <linux/stat.h>
 114
 115#define IS_A_TT()       ATARIHW_PRESENT(TT_SCSI)
 116
 117#define SCSI_DMA_WRITE_P(elt,val)                               \
 118        do {                                                    \
 119                unsigned long v = val;                          \
 120                tt_scsi_dma.elt##_lo = v & 0xff;                \
 121                v >>= 8;                                        \
 122                tt_scsi_dma.elt##_lmd = v & 0xff;               \
 123                v >>= 8;                                        \
 124                tt_scsi_dma.elt##_hmd = v & 0xff;               \
 125                v >>= 8;                                        \
 126                tt_scsi_dma.elt##_hi = v & 0xff;                \
 127        } while(0)
 128
 129#define SCSI_DMA_READ_P(elt)                                    \
 130        (((((((unsigned long)tt_scsi_dma.elt##_hi << 8) |       \
 131             (unsigned long)tt_scsi_dma.elt##_hmd) << 8) |      \
 132           (unsigned long)tt_scsi_dma.elt##_lmd) << 8) |        \
 133         (unsigned long)tt_scsi_dma.elt##_lo)
 134
 135
 136static inline void SCSI_DMA_SETADR(unsigned long adr)
 137{
 138        st_dma.dma_lo = (unsigned char)adr;
 139        MFPDELAY();
 140        adr >>= 8;
 141        st_dma.dma_md = (unsigned char)adr;
 142        MFPDELAY();
 143        adr >>= 8;
 144        st_dma.dma_hi = (unsigned char)adr;
 145        MFPDELAY();
 146}
 147
 148static inline unsigned long SCSI_DMA_GETADR(void)
 149{
 150        unsigned long adr;
 151        adr = st_dma.dma_lo;
 152        MFPDELAY();
 153        adr |= (st_dma.dma_md & 0xff) << 8;
 154        MFPDELAY();
 155        adr |= (st_dma.dma_hi & 0xff) << 16;
 156        MFPDELAY();
 157        return adr;
 158}
 159
 160static inline void ENABLE_IRQ(void)
 161{
 162        if (IS_A_TT())
 163                atari_enable_irq(IRQ_TT_MFP_SCSI);
 164        else
 165                atari_enable_irq(IRQ_MFP_FSCSI);
 166}
 167
 168static inline void DISABLE_IRQ(void)
 169{
 170        if (IS_A_TT())
 171                atari_disable_irq(IRQ_TT_MFP_SCSI);
 172        else
 173                atari_disable_irq(IRQ_MFP_FSCSI);
 174}
 175
 176
 177#define HOSTDATA_DMALEN         (((struct NCR5380_hostdata *) \
 178                                (atari_scsi_host->hostdata))->dma_len)
 179
 180/* Time (in jiffies) to wait after a reset; the SCSI standard calls for 250ms,
 181 * we usually do 0.5s to be on the safe side. But Toshiba CD-ROMs once more
 182 * need ten times the standard value... */
 183#ifndef CONFIG_ATARI_SCSI_TOSHIBA_DELAY
 184#define AFTER_RESET_DELAY       (HZ/2)
 185#else
 186#define AFTER_RESET_DELAY       (5*HZ/2)
 187#endif
 188
 189/***************************** Prototypes *****************************/
 190
 191#ifdef REAL_DMA
 192static int scsi_dma_is_ignored_buserr( unsigned char dma_stat );
 193static void atari_scsi_fetch_restbytes( void );
 194static long atari_scsi_dma_residual( struct Scsi_Host *instance );
 195static int falcon_classify_cmd( Scsi_Cmnd *cmd );
 196static unsigned long atari_dma_xfer_len( unsigned long wanted_len,
 197                                         Scsi_Cmnd *cmd, int write_flag );
 198#endif
 199static void scsi_tt_intr( int irq, void *dummy, struct pt_regs *fp);
 200static void scsi_falcon_intr( int irq, void *dummy, struct pt_regs *fp);
 201static void falcon_release_lock_if_possible( struct NCR5380_hostdata *
 202                                             hostdata );
 203static void falcon_get_lock( void );
 204#ifdef CONFIG_ATARI_SCSI_RESET_BOOT
 205static void atari_scsi_reset_boot( void );
 206#endif
 207static unsigned char atari_scsi_tt_reg_read( unsigned char reg );
 208static void atari_scsi_tt_reg_write( unsigned char reg, unsigned char value);
 209static unsigned char atari_scsi_falcon_reg_read( unsigned char reg );
 210static void atari_scsi_falcon_reg_write( unsigned char reg, unsigned char value );
 211
 212/************************* End of Prototypes **************************/
 213
 214
 215static struct Scsi_Host *atari_scsi_host = NULL;
 216static unsigned char (*atari_scsi_reg_read)( unsigned char reg );
 217static void (*atari_scsi_reg_write)( unsigned char reg, unsigned char value );
 218
 219#ifdef REAL_DMA
 220static unsigned long    atari_dma_residual, atari_dma_startaddr;
 221static short            atari_dma_active;
 222/* pointer to the dribble buffer */
 223static char             *atari_dma_buffer = NULL;
 224/* precalculated physical address of the dribble buffer */
 225static unsigned long    atari_dma_phys_buffer;
 226/* != 0 tells the Falcon int handler to copy data from the dribble buffer */
 227static char             *atari_dma_orig_addr;
 228/* size of the dribble buffer; 4k seems enough, since the Falcon cannot use
 229 * scatter-gather anyway, so most transfers are 1024 byte only. In the rare
 230 * cases where requests to physical contiguous buffers have been merged, this
 231 * request is <= 4k (one page). So I don't think we have to split transfers
 232 * just due to this buffer size...
 233 */
 234#define STRAM_BUFFER_SIZE       (4096)
 235/* mask for address bits that can't be used with the ST-DMA */
 236static unsigned long    atari_dma_stram_mask;
 237#define STRAM_ADDR(a)   (((a) & atari_dma_stram_mask) == 0)
 238/* number of bytes to cut from a transfer to handle NCR overruns */
 239static int atari_read_overruns = 0;
 240#endif
 241
 242static int setup_can_queue = -1;
 243MODULE_PARM(setup_can_queue, "i");
 244static int setup_cmd_per_lun = -1;
 245MODULE_PARM(setup_cmd_per_lun, "i");
 246static int setup_sg_tablesize = -1;
 247MODULE_PARM(setup_sg_tablesize, "i");
 248#ifdef SUPPORT_TAGS
 249static int setup_use_tagged_queuing = -1;
 250MODULE_PARM(setup_use_tagged_queuing, "i");
 251#endif
 252static int setup_hostid = -1;
 253MODULE_PARM(setup_hostid, "i");
 254
 255
 256#if defined(CONFIG_TT_DMA_EMUL)
 257#include "atari_dma_emul.c"
 258#endif
 259
 260#if defined(REAL_DMA)
 261
 262static int scsi_dma_is_ignored_buserr( unsigned char dma_stat )
 263{
 264        int i;
 265        unsigned long   addr = SCSI_DMA_READ_P( dma_addr ), end_addr;
 266
 267        if (dma_stat & 0x01) {
 268
 269                /* A bus error happens when DMA-ing from the last page of a
 270                 * physical memory chunk (DMA prefetch!), but that doesn't hurt.
 271                 * Check for this case:
 272                 */
 273                
 274                for( i = 0; i < m68k_num_memory; ++i ) {
 275                        end_addr = m68k_memory[i].addr +
 276                                m68k_memory[i].size;
 277                        if (end_addr <= addr && addr <= end_addr + 4)
 278                                return( 1 );
 279                }
 280        }
 281        return( 0 );
 282}
 283
 284
 285#if 0
 286/* Dead code... wasn't called anyway :-) and causes some trouble, because at
 287 * end-of-DMA, both SCSI ints are triggered simultaneously, so the NCR int has
 288 * to clear the DMA int pending bit before it allows other level 6 interrupts.
 289 */
 290static void scsi_dma_buserr (int irq, void *dummy, struct pt_regs *fp)
 291{
 292        unsigned char   dma_stat = tt_scsi_dma.dma_ctrl;
 293
 294        /* Don't do anything if a NCR interrupt is pending. Probably it's just
 295         * masked... */
 296        if (atari_irq_pending( IRQ_TT_MFP_SCSI ))
 297                return;
 298        
 299        printk("Bad SCSI DMA interrupt! dma_addr=0x%08lx dma_stat=%02x dma_cnt=%08lx\n",
 300               SCSI_DMA_READ_P(dma_addr), dma_stat, SCSI_DMA_READ_P(dma_cnt));
 301        if (dma_stat & 0x80) {
 302                if (!scsi_dma_is_ignored_buserr( dma_stat ))
 303                        printk( "SCSI DMA bus error -- bad DMA programming!\n" );
 304        }
 305        else {
 306                /* Under normal circumstances we never should get to this point,
 307                 * since both interrupts are triggered simultaneously and the 5380
 308                 * int has higher priority. When this irq is handled, that DMA
 309                 * interrupt is cleared. So a warning message is printed here.
 310                 */
 311                printk( "SCSI DMA intr ?? -- this shouldn't happen!\n" );
 312        }
 313}
 314#endif
 315
 316#endif
 317
 318
 319static void scsi_tt_intr (int irq, void *dummy, struct pt_regs *fp)
 320{
 321#ifdef REAL_DMA
 322        int dma_stat;
 323
 324        dma_stat = tt_scsi_dma.dma_ctrl;
 325
 326        INT_PRINTK("scsi%d: NCR5380 interrupt, DMA status = %02x\n",
 327                   atari_scsi_host->host_no, dma_stat & 0xff);
 328
 329        /* Look if it was the DMA that has interrupted: First possibility
 330         * is that a bus error occurred...
 331         */
 332        if (dma_stat & 0x80) {
 333                if (!scsi_dma_is_ignored_buserr( dma_stat )) {
 334                        printk(KERN_ERR "SCSI DMA caused bus error near 0x%08lx\n",
 335                               SCSI_DMA_READ_P(dma_addr));
 336                        printk(KERN_CRIT "SCSI DMA bus error -- bad DMA programming!");
 337                }
 338        }
 339
 340        /* If the DMA is active but not finished, we have the case
 341         * that some other 5380 interrupt occurred within the DMA transfer.
 342         * This means we have residual bytes, if the desired end address
 343         * is not yet reached. Maybe we have to fetch some bytes from the
 344         * rest data register, too. The residual must be calculated from
 345         * the address pointer, not the counter register, because only the
 346         * addr reg counts bytes not yet written and pending in the rest
 347         * data reg!
 348         */
 349        if ((dma_stat & 0x02) && !(dma_stat & 0x40)) {
 350                atari_dma_residual = HOSTDATA_DMALEN - (SCSI_DMA_READ_P( dma_addr ) -
 351                                                                                                atari_dma_startaddr);
 352
 353                DMA_PRINTK("SCSI DMA: There are %ld residual bytes.\n",
 354                           atari_dma_residual);
 355
 356                if ((signed int)atari_dma_residual < 0)
 357                        atari_dma_residual = 0;
 358                if ((dma_stat & 1) == 0) {
 359                        /* After read operations, we maybe have to
 360                           transport some rest bytes */
 361                        atari_scsi_fetch_restbytes();
 362                }
 363                else {
 364                        /* There seems to be a nasty bug in some SCSI-DMA/NCR
 365                           combinations: If a target disconnects while a write
 366                           operation is going on, the address register of the
 367                           DMA may be a few bytes farer than it actually read.
 368                           This is probably due to DMA prefetching and a delay
 369                           between DMA and NCR.  Experiments showed that the
 370                           dma_addr is 9 bytes to high, but this could vary.
 371                           The problem is, that the residual is thus calculated
 372                           wrong and the next transfer will start behind where
 373                           it should.  So we round up the residual to the next
 374                           multiple of a sector size, if it isn't already a
 375                           multiple and the originally expected transfer size
 376                           was.  The latter condition is there to ensure that
 377                           the correction is taken only for "real" data
 378                           transfers and not for, e.g., the parameters of some
 379                           other command.  These shouldn't disconnect anyway.
 380                           */
 381                        if (atari_dma_residual & 0x1ff) {
 382                                DMA_PRINTK("SCSI DMA: DMA bug corrected, "
 383                                           "difference %ld bytes\n",
 384                                           512 - (atari_dma_residual & 0x1ff));
 385                                atari_dma_residual = (atari_dma_residual + 511) & ~0x1ff;
 386                        }
 387                }
 388                tt_scsi_dma.dma_ctrl = 0;
 389        }
 390
 391        /* If the DMA is finished, fetch the rest bytes and turn it off */
 392        if (dma_stat & 0x40) {
 393                atari_dma_residual = 0;
 394                if ((dma_stat & 1) == 0)
 395                        atari_scsi_fetch_restbytes();
 396                tt_scsi_dma.dma_ctrl = 0;
 397        }
 398
 399#endif /* REAL_DMA */
 400        
 401        NCR5380_intr (0, 0, 0);
 402
 403#if 0
 404        /* To be sure the int is not masked */
 405        atari_enable_irq( IRQ_TT_MFP_SCSI );
 406#endif
 407}
 408
 409
 410static void scsi_falcon_intr (int irq, void *dummy, struct pt_regs *fp)
 411{
 412#ifdef REAL_DMA
 413        int dma_stat;
 414
 415        /* Turn off DMA and select sector counter register before
 416         * accessing the status register (Atari recommendation!)
 417         */
 418        st_dma.dma_mode_status = 0x90;
 419        dma_stat = st_dma.dma_mode_status;
 420
 421        /* Bit 0 indicates some error in the DMA process... don't know
 422         * what happened exactly (no further docu).
 423         */
 424        if (!(dma_stat & 0x01)) {
 425                /* DMA error */
 426                printk(KERN_CRIT "SCSI DMA error near 0x%08lx!\n", SCSI_DMA_GETADR());
 427        }
 428
 429        /* If the DMA was active, but now bit 1 is not clear, it is some
 430         * other 5380 interrupt that finishes the DMA transfer. We have to
 431         * calculate the number of residual bytes and give a warning if
 432         * bytes are stuck in the ST-DMA fifo (there's no way to reach them!)
 433         */
 434        if (atari_dma_active && (dma_stat & 0x02)) {
 435                unsigned long   transferred;
 436
 437                transferred = SCSI_DMA_GETADR() - atari_dma_startaddr;
 438                /* The ST-DMA address is incremented in 2-byte steps, but the
 439                 * data are written only in 16-byte chunks. If the number of
 440                 * transferred bytes is not divisible by 16, the remainder is
 441                 * lost somewhere in outer space.
 442                 */
 443                if (transferred & 15)
 444                        printk(KERN_ERR "SCSI DMA error: %ld bytes lost in "
 445                               "ST-DMA fifo\n", transferred & 15);
 446
 447                atari_dma_residual = HOSTDATA_DMALEN - transferred;
 448                DMA_PRINTK("SCSI DMA: There are %ld residual bytes.\n",
 449                           atari_dma_residual);
 450        }
 451        else
 452                atari_dma_residual = 0;
 453        atari_dma_active = 0;
 454
 455        if (atari_dma_orig_addr) {
 456                /* If the dribble buffer was used on a read operation, copy the DMA-ed
 457                 * data to the original destination address.
 458                 */
 459                memcpy(atari_dma_orig_addr, phys_to_virt(atari_dma_startaddr),
 460                       HOSTDATA_DMALEN - atari_dma_residual);
 461                atari_dma_orig_addr = NULL;
 462        }
 463
 464#endif /* REAL_DMA */
 465
 466        NCR5380_intr (0, 0, 0);
 467}
 468
 469
 470#ifdef REAL_DMA
 471static void atari_scsi_fetch_restbytes( void )
 472{
 473        int nr;
 474        char *src, *dst;
 475        unsigned long phys_dst;
 476
 477        /* fetch rest bytes in the DMA register */
 478        phys_dst = SCSI_DMA_READ_P(dma_addr);
 479        nr = phys_dst & 3;
 480        if (nr) {
 481                /* there are 'nr' bytes left for the last long address
 482                   before the DMA pointer */
 483                phys_dst ^= nr;
 484                DMA_PRINTK("SCSI DMA: there are %d rest bytes for phys addr 0x%08lx",
 485                           nr, phys_dst);
 486                /* The content of the DMA pointer is a physical address!  */
 487                dst = phys_to_virt(phys_dst);
 488                DMA_PRINTK(" = virt addr %p\n", dst);
 489                for (src = (char *)&tt_scsi_dma.dma_restdata; nr != 0; --nr)
 490                        *dst++ = *src++;
 491        }
 492}
 493#endif /* REAL_DMA */
 494
 495
 496static int falcon_got_lock = 0;
 497static DECLARE_WAIT_QUEUE_HEAD(falcon_fairness_wait);
 498static int falcon_trying_lock = 0;
 499static DECLARE_WAIT_QUEUE_HEAD(falcon_try_wait);
 500static int falcon_dont_release = 0;
 501
 502/* This function releases the lock on the DMA chip if there is no
 503 * connected command and the disconnected queue is empty. On
 504 * releasing, instances of falcon_get_lock are awoken, that put
 505 * themselves to sleep for fairness. They can now try to get the lock
 506 * again (but others waiting longer more probably will win).
 507 */
 508
 509static void
 510falcon_release_lock_if_possible( struct NCR5380_hostdata * hostdata )
 511{
 512        unsigned long   oldflags;
 513                
 514        if (IS_A_TT()) return;
 515        
 516        save_flags(oldflags);
 517        cli();
 518
 519        if (falcon_got_lock &&
 520                !hostdata->disconnected_queue &&
 521                !hostdata->issue_queue &&
 522                !hostdata->connected) {
 523
 524                if (falcon_dont_release) {
 525#if 0
 526                        printk("WARNING: Lock release not allowed. Ignored\n");
 527#endif
 528                        restore_flags(oldflags);
 529                        return;
 530                }
 531                falcon_got_lock = 0;
 532                stdma_release();
 533                wake_up( &falcon_fairness_wait );
 534        }
 535
 536        restore_flags(oldflags);
 537}
 538
 539/* This function manages the locking of the ST-DMA.
 540 * If the DMA isn't locked already for SCSI, it tries to lock it by
 541 * calling stdma_lock(). But if the DMA is locked by the SCSI code and
 542 * there are other drivers waiting for the chip, we do not issue the
 543 * command immediately but wait on 'falcon_fairness_queue'. We will be
 544 * waked up when the DMA is unlocked by some SCSI interrupt. After that
 545 * we try to get the lock again.
 546 * But we must be prepared that more than one instance of
 547 * falcon_get_lock() is waiting on the fairness queue. They should not
 548 * try all at once to call stdma_lock(), one is enough! For that, the
 549 * first one sets 'falcon_trying_lock', others that see that variable
 550 * set wait on the queue 'falcon_try_wait'.
 551 * Complicated, complicated.... Sigh...
 552 */
 553
 554static void falcon_get_lock( void )
 555{
 556        unsigned long   oldflags;
 557
 558        if (IS_A_TT()) return;
 559
 560        save_flags(oldflags);
 561        cli();
 562
 563        while( !in_interrupt() && falcon_got_lock && stdma_others_waiting() )
 564                sleep_on( &falcon_fairness_wait );
 565
 566        while (!falcon_got_lock) {
 567                if (in_interrupt())
 568                        panic( "Falcon SCSI hasn't ST-DMA lock in interrupt" );
 569                if (!falcon_trying_lock) {
 570                        falcon_trying_lock = 1;
 571                        stdma_lock(scsi_falcon_intr, NULL);
 572                        falcon_got_lock = 1;
 573                        falcon_trying_lock = 0;
 574                        wake_up( &falcon_try_wait );
 575                }
 576                else {
 577                        sleep_on( &falcon_try_wait );
 578                }
 579        }       
 580
 581        restore_flags(oldflags);
 582        if (!falcon_got_lock)
 583                panic("Falcon SCSI: someone stole the lock :-(\n");
 584}
 585
 586
 587/* This is the wrapper function for NCR5380_queue_command(). It just
 588 * tries to get the lock on the ST-DMA (see above) and then calls the
 589 * original function.
 590 */
 591
 592#if 0
 593int atari_queue_command (Scsi_Cmnd *cmd, void (*done)(Scsi_Cmnd *))
 594{
 595        /* falcon_get_lock();
 596         * ++guenther: moved to NCR5380_queue_command() to prevent
 597         * race condition, see there for an explanation.
 598         */
 599        return( NCR5380_queue_command( cmd, done ) );
 600}
 601#endif
 602
 603
 604int atari_scsi_detect (Scsi_Host_Template *host)
 605{
 606        static int called = 0;
 607        struct Scsi_Host *instance;
 608
 609        if (!MACH_IS_ATARI ||
 610            (!ATARIHW_PRESENT(ST_SCSI) && !ATARIHW_PRESENT(TT_SCSI)) ||
 611            called)
 612                return( 0 );
 613
 614        host->proc_name = "Atari";
 615
 616        atari_scsi_reg_read  = IS_A_TT() ? atari_scsi_tt_reg_read :
 617                                           atari_scsi_falcon_reg_read;
 618        atari_scsi_reg_write = IS_A_TT() ? atari_scsi_tt_reg_write :
 619                                           atari_scsi_falcon_reg_write;
 620
 621        /* setup variables */
 622        host->can_queue =
 623                (setup_can_queue > 0) ? setup_can_queue :
 624                IS_A_TT() ? ATARI_TT_CAN_QUEUE : ATARI_FALCON_CAN_QUEUE;
 625        host->cmd_per_lun =
 626                (setup_cmd_per_lun > 0) ? setup_cmd_per_lun :
 627                IS_A_TT() ? ATARI_TT_CMD_PER_LUN : ATARI_FALCON_CMD_PER_LUN;
 628        /* Force sg_tablesize to 0 on a Falcon! */
 629        host->sg_tablesize =
 630                !IS_A_TT() ? ATARI_FALCON_SG_TABLESIZE :
 631                (setup_sg_tablesize >= 0) ? setup_sg_tablesize : ATARI_TT_SG_TABLESIZE;
 632
 633        if (setup_hostid >= 0)
 634                host->this_id = setup_hostid;
 635        else {
 636                /* use 7 as default */
 637                host->this_id = 7;
 638                /* Test if a host id is set in the NVRam */
 639                if (ATARIHW_PRESENT(TT_CLK) && nvram_check_checksum()) {
 640                        unsigned char b = nvram_read_byte( 14 );
 641                        /* Arbitration enabled? (for TOS) If yes, use configured host ID */
 642                        if (b & 0x80)
 643                                host->this_id = b & 7;
 644                }
 645        }
 646
 647#ifdef SUPPORT_TAGS
 648        if (setup_use_tagged_queuing < 0)
 649                setup_use_tagged_queuing = DEFAULT_USE_TAGGED_QUEUING;
 650#endif
 651#ifdef REAL_DMA
 652        /* If running on a Falcon and if there's TT-Ram (i.e., more than one
 653         * memory block, since there's always ST-Ram in a Falcon), then allocate a
 654         * STRAM_BUFFER_SIZE byte dribble buffer for transfers from/to alternative
 655         * Ram.
 656         */
 657        if (MACH_IS_ATARI && ATARIHW_PRESENT(ST_SCSI) &&
 658            !ATARIHW_PRESENT(EXTD_DMA) && m68k_num_memory > 1) {
 659                atari_dma_buffer = atari_stram_alloc(STRAM_BUFFER_SIZE, "SCSI");
 660                if (!atari_dma_buffer) {
 661                        printk( KERN_ERR "atari_scsi_detect: can't allocate ST-RAM "
 662                                        "double buffer\n" );
 663                        return( 0 );
 664                }
 665                atari_dma_phys_buffer = virt_to_phys( atari_dma_buffer );
 666                atari_dma_orig_addr = 0;
 667        }
 668#endif
 669        instance = scsi_register (host, sizeof (struct NCR5380_hostdata));
 670        if(instance == NULL)
 671        {
 672                atari_stram_free(atari_dma_buffer);
 673                atari_dma_buffer = 0;
 674                return 0;
 675        }
 676        atari_scsi_host = instance;
 677       /* Set irq to 0, to avoid that the mid-level code disables our interrupt
 678        * during queue_command calls. This is completely unnecessary, and even
 679        * worse causes bad problems on the Falcon, where the int is shared with
 680        * IDE and floppy! */
 681       instance->irq = 0;
 682
 683#ifdef CONFIG_ATARI_SCSI_RESET_BOOT
 684        atari_scsi_reset_boot();
 685#endif
 686        NCR5380_init (instance, 0);
 687
 688        if (IS_A_TT()) {
 689
 690                /* This int is actually "pseudo-slow", i.e. it acts like a slow
 691                 * interrupt after having cleared the pending flag for the DMA
 692                 * interrupt. */
 693                if (request_irq(IRQ_TT_MFP_SCSI, scsi_tt_intr, IRQ_TYPE_SLOW,
 694                                 "SCSI NCR5380", scsi_tt_intr)) {
 695                        printk(KERN_ERR "atari_scsi_detect: cannot allocate irq %d, aborting",IRQ_TT_MFP_SCSI);
 696                        scsi_unregister(atari_scsi_host);
 697                        atari_stram_free(atari_dma_buffer);
 698                        atari_dma_buffer = 0;
 699                        return 0;
 700                }
 701                tt_mfp.active_edge |= 0x80;             /* SCSI int on L->H */
 702#ifdef REAL_DMA
 703                tt_scsi_dma.dma_ctrl = 0;
 704                atari_dma_residual = 0;
 705#ifdef CONFIG_TT_DMA_EMUL
 706                if (MACH_IS_HADES) {
 707                        if (request_irq(IRQ_AUTO_2, hades_dma_emulator,
 708                                         IRQ_TYPE_PRIO, "Hades DMA emulator",
 709                                         hades_dma_emulator)) {
 710                                printk(KERN_ERR "atari_scsi_detect: cannot allocate irq %d, aborting (MACH_IS_HADES)",IRQ_AUTO_2);
 711                                free_irq(IRQ_TT_MFP_SCSI, scsi_tt_intr);
 712                                scsi_unregister(atari_scsi_host);
 713                                atari_stram_free(atari_dma_buffer);
 714                                atari_dma_buffer = 0;
 715                                return 0;
 716                        }
 717                }
 718#endif
 719                if (MACH_IS_MEDUSA || MACH_IS_HADES) {
 720                        /* While the read overruns (described by Drew Eckhardt in
 721                         * NCR5380.c) never happened on TTs, they do in fact on the Medusa
 722                         * (This was the cause why SCSI didn't work right for so long
 723                         * there.) Since handling the overruns slows down a bit, I turned
 724                         * the #ifdef's into a runtime condition.
 725                         *
 726                         * In principle it should be sufficient to do max. 1 byte with
 727                         * PIO, but there is another problem on the Medusa with the DMA
 728                         * rest data register. So 'atari_read_overruns' is currently set
 729                         * to 4 to avoid having transfers that aren't a multiple of 4. If
 730                         * the rest data bug is fixed, this can be lowered to 1.
 731                         */
 732                        atari_read_overruns = 4;
 733                }               
 734#endif /*REAL_DMA*/
 735        }
 736        else { /* ! IS_A_TT */
 737                
 738                /* Nothing to do for the interrupt: the ST-DMA is initialized
 739                 * already by atari_init_INTS()
 740                 */
 741
 742#ifdef REAL_DMA
 743                atari_dma_residual = 0;
 744                atari_dma_active = 0;
 745                atari_dma_stram_mask = (ATARIHW_PRESENT(EXTD_DMA) ? 0x00000000
 746                                        : 0xff000000);
 747#endif
 748        }
 749
 750        printk(KERN_INFO "scsi%d: options CAN_QUEUE=%d CMD_PER_LUN=%d SCAT-GAT=%d "
 751#ifdef SUPPORT_TAGS
 752                        "TAGGED-QUEUING=%s "
 753#endif
 754                        "HOSTID=%d",
 755                        instance->host_no, instance->hostt->can_queue,
 756                        instance->hostt->cmd_per_lun,
 757                        instance->hostt->sg_tablesize,
 758#ifdef SUPPORT_TAGS
 759                        setup_use_tagged_queuing ? "yes" : "no",
 760#endif
 761                        instance->hostt->this_id );
 762        NCR5380_print_options (instance);
 763        printk ("\n");
 764
 765        called = 1;
 766        return( 1 );
 767}
 768
 769#ifdef MODULE
 770int atari_scsi_release (struct Scsi_Host *sh)
 771{
 772        if (IS_A_TT())
 773                free_irq(IRQ_TT_MFP_SCSI, scsi_tt_intr);
 774        if (atari_dma_buffer)
 775                atari_stram_free (atari_dma_buffer);
 776        return 1;
 777}
 778#endif
 779
 780void __init atari_scsi_setup(char *str, int *ints)
 781{
 782        /* Format of atascsi parameter is:
 783         *   atascsi=<can_queue>,<cmd_per_lun>,<sg_tablesize>,<hostid>,<use_tags>
 784         * Defaults depend on TT or Falcon, hostid determined at run time.
 785         * Negative values mean don't change.
 786         */
 787        
 788        if (ints[0] < 1) {
 789                printk( "atari_scsi_setup: no arguments!\n" );
 790                return;
 791        }
 792
 793        if (ints[0] >= 1) {
 794                if (ints[1] > 0)
 795                        /* no limits on this, just > 0 */
 796                        setup_can_queue = ints[1];
 797        }
 798        if (ints[0] >= 2) {
 799                if (ints[2] > 0)
 800                        setup_cmd_per_lun = ints[2];
 801        }
 802        if (ints[0] >= 3) {
 803                if (ints[3] >= 0) {
 804                        setup_sg_tablesize = ints[3];
 805                        /* Must be <= SG_ALL (255) */
 806                        if (setup_sg_tablesize > SG_ALL)
 807                                setup_sg_tablesize = SG_ALL;
 808                }
 809        }
 810        if (ints[0] >= 4) {
 811                /* Must be between 0 and 7 */
 812                if (ints[4] >= 0 && ints[4] <= 7)
 813                        setup_hostid = ints[4];
 814                else if (ints[4] > 7)
 815                        printk( "atari_scsi_setup: invalid host ID %d !\n", ints[4] );
 816        }
 817#ifdef SUPPORT_TAGS
 818        if (ints[0] >= 5) {
 819                if (ints[5] >= 0)
 820                        setup_use_tagged_queuing = !!ints[5];
 821        }
 822#endif
 823}
 824
 825int atari_scsi_reset( Scsi_Cmnd *cmd, unsigned int reset_flags)
 826{
 827        int             rv;
 828        struct NCR5380_hostdata *hostdata =
 829                (struct NCR5380_hostdata *)cmd->host->hostdata;
 830
 831        /* For doing the reset, SCSI interrupts must be disabled first,
 832         * since the 5380 raises its IRQ line while _RST is active and we
 833         * can't disable interrupts completely, since we need the timer.
 834         */
 835        /* And abort a maybe active DMA transfer */
 836        if (IS_A_TT()) {
 837                atari_turnoff_irq( IRQ_TT_MFP_SCSI );
 838#ifdef REAL_DMA
 839                tt_scsi_dma.dma_ctrl = 0;
 840#endif /* REAL_DMA */
 841        }
 842        else {
 843                atari_turnoff_irq( IRQ_MFP_FSCSI );
 844#ifdef REAL_DMA
 845                st_dma.dma_mode_status = 0x90;
 846                atari_dma_active = 0;
 847                atari_dma_orig_addr = NULL;
 848#endif /* REAL_DMA */
 849        }
 850
 851        rv = NCR5380_reset(cmd, reset_flags);
 852
 853        /* Re-enable ints */
 854        if (IS_A_TT()) {
 855                atari_turnon_irq( IRQ_TT_MFP_SCSI );
 856        }
 857        else {
 858                atari_turnon_irq( IRQ_MFP_FSCSI );
 859        }
 860        if ((rv & SCSI_RESET_ACTION) == SCSI_RESET_SUCCESS)
 861                falcon_release_lock_if_possible(hostdata);
 862
 863        return( rv );
 864}
 865
 866        
 867#ifdef CONFIG_ATARI_SCSI_RESET_BOOT
 868static void __init atari_scsi_reset_boot(void)
 869{
 870        unsigned long end;
 871        
 872        /*
 873         * Do a SCSI reset to clean up the bus during initialization. No messing
 874         * with the queues, interrupts, or locks necessary here.
 875         */
 876
 877        printk( "Atari SCSI: resetting the SCSI bus..." );
 878
 879        /* get in phase */
 880        NCR5380_write( TARGET_COMMAND_REG,
 881                      PHASE_SR_TO_TCR( NCR5380_read(STATUS_REG) ));
 882
 883        /* assert RST */
 884        NCR5380_write( INITIATOR_COMMAND_REG, ICR_BASE | ICR_ASSERT_RST );
 885        /* The min. reset hold time is 25us, so 40us should be enough */
 886        udelay( 50 );
 887        /* reset RST and interrupt */
 888        NCR5380_write( INITIATOR_COMMAND_REG, ICR_BASE );
 889        NCR5380_read( RESET_PARITY_INTERRUPT_REG );
 890
 891        end = jiffies + AFTER_RESET_DELAY;
 892        while (time_before(jiffies, end))
 893                barrier();
 894
 895        printk( " done\n" );
 896}
 897#endif
 898
 899
 900const char * atari_scsi_info (struct Scsi_Host *host)
 901{
 902        /* atari_scsi_detect() is verbose enough... */
 903        static const char string[] = "Atari native SCSI";
 904        return string;
 905}
 906
 907
 908#if defined(REAL_DMA)
 909
 910unsigned long atari_scsi_dma_setup( struct Scsi_Host *instance, void *data,
 911                                   unsigned long count, int dir )
 912{
 913        unsigned long addr = virt_to_phys( data );
 914
 915        DMA_PRINTK("scsi%d: setting up dma, data = %p, phys = %lx, count = %ld, "
 916                   "dir = %d\n", instance->host_no, data, addr, count, dir);
 917
 918        if (!IS_A_TT() && !STRAM_ADDR(addr)) {
 919                /* If we have a non-DMAable address on a Falcon, use the dribble
 920                 * buffer; 'orig_addr' != 0 in the read case tells the interrupt
 921                 * handler to copy data from the dribble buffer to the originally
 922                 * wanted address.
 923                 */
 924                if (dir)
 925                        memcpy( atari_dma_buffer, data, count );
 926                else
 927                        atari_dma_orig_addr = data;
 928                addr = atari_dma_phys_buffer;
 929        }
 930        
 931        atari_dma_startaddr = addr;     /* Needed for calculating residual later. */
 932  
 933        /* Cache cleanup stuff: On writes, push any dirty cache out before sending
 934         * it to the peripheral. (Must be done before DMA setup, since at least
 935         * the ST-DMA begins to fill internal buffers right after setup. For
 936         * reads, invalidate any cache, may be altered after DMA without CPU
 937         * knowledge.
 938         * 
 939         * ++roman: For the Medusa, there's no need at all for that cache stuff,
 940         * because the hardware does bus snooping (fine!).
 941         */
 942        dma_cache_maintenance( addr, count, dir );
 943
 944        if (count == 0)
 945                printk(KERN_NOTICE "SCSI warning: DMA programmed for 0 bytes !\n");
 946
 947        if (IS_A_TT()) {
 948                tt_scsi_dma.dma_ctrl = dir;
 949                SCSI_DMA_WRITE_P( dma_addr, addr );
 950                SCSI_DMA_WRITE_P( dma_cnt, count );
 951                tt_scsi_dma.dma_ctrl = dir | 2;
 952        }
 953        else { /* ! IS_A_TT */
 954  
 955                /* set address */
 956                SCSI_DMA_SETADR( addr );
 957
 958                /* toggle direction bit to clear FIFO and set DMA direction */
 959                dir <<= 8;
 960                st_dma.dma_mode_status = 0x90 | dir;
 961                st_dma.dma_mode_status = 0x90 | (dir ^ 0x100);
 962                st_dma.dma_mode_status = 0x90 | dir;
 963                udelay(40);
 964                /* On writes, round up the transfer length to the next multiple of 512
 965                 * (see also comment at atari_dma_xfer_len()). */
 966                st_dma.fdc_acces_seccount = (count + (dir ? 511 : 0)) >> 9;
 967                udelay(40);
 968                st_dma.dma_mode_status = 0x10 | dir;
 969                udelay(40);
 970                /* need not restore value of dir, only boolean value is tested */
 971                atari_dma_active = 1;
 972        }
 973
 974        return( count );
 975}
 976
 977
 978static long atari_scsi_dma_residual( struct Scsi_Host *instance )
 979{
 980        return( atari_dma_residual );
 981}
 982
 983
 984#define CMD_SURELY_BLOCK_MODE   0
 985#define CMD_SURELY_BYTE_MODE    1
 986#define CMD_MODE_UNKNOWN                2
 987
 988static int falcon_classify_cmd( Scsi_Cmnd *cmd )
 989{
 990        unsigned char opcode = cmd->cmnd[0];
 991        
 992        if (opcode == READ_DEFECT_DATA || opcode == READ_LONG ||
 993                opcode == READ_BUFFER)
 994                return( CMD_SURELY_BYTE_MODE );
 995        else if (opcode == READ_6 || opcode == READ_10 ||
 996                 opcode == 0xa8 /* READ_12 */ || opcode == READ_REVERSE ||
 997                 opcode == RECOVER_BUFFERED_DATA) {
 998                /* In case of a sequential-access target (tape), special care is
 999                 * needed here: The transfer is block-mode only if the 'fixed' bit is
1000                 * set! */
1001                if (cmd->device->type == TYPE_TAPE && !(cmd->cmnd[1] & 1))
1002                        return( CMD_SURELY_BYTE_MODE );
1003                else
1004                        return( CMD_SURELY_BLOCK_MODE );
1005        }
1006        else
1007                return( CMD_MODE_UNKNOWN );
1008}
1009
1010
1011/* This function calculates the number of bytes that can be transferred via
1012 * DMA. On the TT, this is arbitrary, but on the Falcon we have to use the
1013 * ST-DMA chip. There are only multiples of 512 bytes possible and max.
1014 * 255*512 bytes :-( This means also, that defining READ_OVERRUNS is not
1015 * possible on the Falcon, since that would require to program the DMA for
1016 * n*512 - atari_read_overrun bytes. But it seems that the Falcon doesn't have
1017 * the overrun problem, so this question is academic :-)
1018 */
1019
1020static unsigned long atari_dma_xfer_len( unsigned long wanted_len,
1021                                        Scsi_Cmnd *cmd,
1022                                        int write_flag )
1023{
1024        unsigned long   possible_len, limit;
1025#ifndef CONFIG_TT_DMA_EMUL
1026        if (MACH_IS_HADES)
1027                /* Hades has no SCSI DMA at all :-( Always force use of PIO */
1028                return( 0 );
1029#endif  
1030        if (IS_A_TT())
1031                /* TT SCSI DMA can transfer arbitrary #bytes */
1032                return( wanted_len );
1033
1034        /* ST DMA chip is stupid -- only multiples of 512 bytes! (and max.
1035         * 255*512 bytes, but this should be enough)
1036         *
1037         * ++roman: Aaargl! Another Falcon-SCSI problem... There are some commands
1038         * that return a number of bytes which cannot be known beforehand. In this
1039         * case, the given transfer length is an "allocation length". Now it
1040         * can happen that this allocation length is a multiple of 512 bytes and
1041         * the DMA is used. But if not n*512 bytes really arrive, some input data
1042         * will be lost in the ST-DMA's FIFO :-( Thus, we have to distinguish
1043         * between commands that do block transfers and those that do byte
1044         * transfers. But this isn't easy... there are lots of vendor specific
1045         * commands, and the user can issue any command via the
1046         * SCSI_IOCTL_SEND_COMMAND.
1047         *
1048         * The solution: We classify SCSI commands in 1) surely block-mode cmd.s,
1049         * 2) surely byte-mode cmd.s and 3) cmd.s with unknown mode. In case 1)
1050         * and 3), the thing to do is obvious: allow any number of blocks via DMA
1051         * or none. In case 2), we apply some heuristic: Byte mode is assumed if
1052         * the transfer (allocation) length is < 1024, hoping that no cmd. not
1053         * explicitly known as byte mode have such big allocation lengths...
1054         * BTW, all the discussion above applies only to reads. DMA writes are
1055         * unproblematic anyways, since the targets aborts the transfer after
1056         * receiving a sufficient number of bytes.
1057         *
1058         * Another point: If the transfer is from/to an non-ST-RAM address, we
1059         * use the dribble buffer and thus can do only STRAM_BUFFER_SIZE bytes.
1060         */
1061
1062        if (write_flag) {
1063                /* Write operation can always use the DMA, but the transfer size must
1064                 * be rounded up to the next multiple of 512 (atari_dma_setup() does
1065                 * this).
1066                 */
1067                possible_len = wanted_len;
1068        }
1069        else {
1070                /* Read operations: if the wanted transfer length is not a multiple of
1071                 * 512, we cannot use DMA, since the ST-DMA cannot split transfers
1072                 * (no interrupt on DMA finished!)
1073                 */
1074                if (wanted_len & 0x1ff)
1075                        possible_len = 0;
1076                else {
1077                        /* Now classify the command (see above) and decide whether it is
1078                         * allowed to do DMA at all */
1079                        switch( falcon_classify_cmd( cmd )) {
1080                          case CMD_SURELY_BLOCK_MODE:
1081                                possible_len = wanted_len;
1082                                break;
1083                          case CMD_SURELY_BYTE_MODE:
1084                                possible_len = 0; /* DMA prohibited */
1085                                break;
1086                          case CMD_MODE_UNKNOWN:
1087                          default:
1088                                /* For unknown commands assume block transfers if the transfer
1089                                 * size/allocation length is >= 1024 */
1090                                possible_len = (wanted_len < 1024) ? 0 : wanted_len;
1091                                break;
1092                        }
1093                }
1094        }
1095        
1096        /* Last step: apply the hard limit on DMA transfers */
1097        limit = (atari_dma_buffer && !STRAM_ADDR( virt_to_phys(cmd->SCp.ptr) )) ?
1098                    STRAM_BUFFER_SIZE : 255*512;
1099        if (possible_len > limit)
1100                possible_len = limit;
1101
1102        if (possible_len != wanted_len)
1103                DMA_PRINTK("Sorry, must cut DMA transfer size to %ld bytes "
1104                           "instead of %ld\n", possible_len, wanted_len);
1105
1106        return( possible_len );
1107}
1108
1109
1110#endif  /* REAL_DMA */
1111
1112
1113/* NCR5380 register access functions
1114 *
1115 * There are separate functions for TT and Falcon, because the access
1116 * methods are quite different. The calling macros NCR5380_read and
1117 * NCR5380_write call these functions via function pointers.
1118 */
1119
1120static unsigned char atari_scsi_tt_reg_read( unsigned char reg )
1121{
1122        return( tt_scsi_regp[reg * 2] );
1123}
1124
1125static void atari_scsi_tt_reg_write( unsigned char reg, unsigned char value )
1126{
1127        tt_scsi_regp[reg * 2] = value;
1128}
1129
1130static unsigned char atari_scsi_falcon_reg_read( unsigned char reg )
1131{
1132        dma_wd.dma_mode_status= (u_short)(0x88 + reg);
1133        return( (u_char)dma_wd.fdc_acces_seccount );
1134}
1135
1136static void atari_scsi_falcon_reg_write( unsigned char reg, unsigned char value )
1137{
1138        dma_wd.dma_mode_status = (u_short)(0x88 + reg);
1139        dma_wd.fdc_acces_seccount = (u_short)value;
1140}
1141
1142
1143#include "atari_NCR5380.c"
1144
1145static Scsi_Host_Template driver_template = ATARI_SCSI;
1146#include "scsi_module.c"
1147
1148MODULE_LICENSE("GPL");
1149
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.