linux/drivers/scsi/aha1542.c
<<
>>
Prefs
   1/*
   2 *  Driver for Adaptec AHA-1542 SCSI host adapters
   3 *
   4 *  Copyright (C) 1992  Tommy Thorn
   5 *  Copyright (C) 1993, 1994, 1995 Eric Youngdale
   6 *  Copyright (C) 2015 Ondrej Zary
   7 */
   8
   9#include <linux/module.h>
  10#include <linux/interrupt.h>
  11#include <linux/kernel.h>
  12#include <linux/types.h>
  13#include <linux/string.h>
  14#include <linux/delay.h>
  15#include <linux/init.h>
  16#include <linux/spinlock.h>
  17#include <linux/isa.h>
  18#include <linux/pnp.h>
  19#include <linux/slab.h>
  20#include <linux/io.h>
  21#include <asm/dma.h>
  22#include <scsi/scsi_cmnd.h>
  23#include <scsi/scsi_device.h>
  24#include <scsi/scsi_host.h>
  25#include "aha1542.h"
  26
  27#define MAXBOARDS 4
  28
  29static bool isapnp = 1;
  30module_param(isapnp, bool, 0);
  31MODULE_PARM_DESC(isapnp, "enable PnP support (default=1)");
  32
  33static int io[MAXBOARDS] = { 0x330, 0x334, 0, 0 };
  34module_param_hw_array(io, int, ioport, NULL, 0);
  35MODULE_PARM_DESC(io, "base IO address of controller (0x130,0x134,0x230,0x234,0x330,0x334, default=0x330,0x334)");
  36
  37/* time AHA spends on the AT-bus during data transfer */
  38static int bus_on[MAXBOARDS] = { -1, -1, -1, -1 }; /* power-on default: 11us */
  39module_param_array(bus_on, int, NULL, 0);
  40MODULE_PARM_DESC(bus_on, "bus on time [us] (2-15, default=-1 [HW default: 11])");
  41
  42/* time AHA spends off the bus (not to monopolize it) during data transfer  */
  43static int bus_off[MAXBOARDS] = { -1, -1, -1, -1 }; /* power-on default: 4us */
  44module_param_array(bus_off, int, NULL, 0);
  45MODULE_PARM_DESC(bus_off, "bus off time [us] (1-64, default=-1 [HW default: 4])");
  46
  47/* default is jumper selected (J1 on 1542A), factory default = 5 MB/s */
  48static int dma_speed[MAXBOARDS] = { -1, -1, -1, -1 };
  49module_param_array(dma_speed, int, NULL, 0);
  50MODULE_PARM_DESC(dma_speed, "DMA speed [MB/s] (5,6,7,8,10, default=-1 [by jumper])");
  51
  52#define BIOS_TRANSLATION_6432 1 /* Default case these days */
  53#define BIOS_TRANSLATION_25563 2        /* Big disk case */
  54
  55struct aha1542_hostdata {
  56        /* This will effectively start both of them at the first mailbox */
  57        int bios_translation;   /* Mapping bios uses - for compatibility */
  58        int aha1542_last_mbi_used;
  59        int aha1542_last_mbo_used;
  60        struct scsi_cmnd *int_cmds[AHA1542_MAILBOXES];
  61        struct mailbox *mb;
  62        dma_addr_t mb_handle;
  63        struct ccb *ccb;
  64        dma_addr_t ccb_handle;
  65};
  66
  67struct aha1542_cmd {
  68        struct chain *chain;
  69        dma_addr_t chain_handle;
  70};
  71
  72static inline void aha1542_intr_reset(u16 base)
  73{
  74        outb(IRST, CONTROL(base));
  75}
  76
  77static inline bool wait_mask(u16 port, u8 mask, u8 allof, u8 noneof, int timeout)
  78{
  79        bool delayed = true;
  80
  81        if (timeout == 0) {
  82                timeout = 3000000;
  83                delayed = false;
  84        }
  85
  86        while (1) {
  87                u8 bits = inb(port) & mask;
  88                if ((bits & allof) == allof && ((bits & noneof) == 0))
  89                        break;
  90                if (delayed)
  91                        mdelay(1);
  92                if (--timeout == 0)
  93                        return false;
  94        }
  95
  96        return true;
  97}
  98
  99static int aha1542_outb(unsigned int base, u8 val)
 100{
 101        if (!wait_mask(STATUS(base), CDF, 0, CDF, 0))
 102                return 1;
 103        outb(val, DATA(base));
 104
 105        return 0;
 106}
 107
 108static int aha1542_out(unsigned int base, u8 *buf, int len)
 109{
 110        while (len--) {
 111                if (!wait_mask(STATUS(base), CDF, 0, CDF, 0))
 112                        return 1;
 113                outb(*buf++, DATA(base));
 114        }
 115        if (!wait_mask(INTRFLAGS(base), INTRMASK, HACC, 0, 0))
 116                return 1;
 117
 118        return 0;
 119}
 120
 121/* Only used at boot time, so we do not need to worry about latency as much
 122   here */
 123
 124static int aha1542_in(unsigned int base, u8 *buf, int len, int timeout)
 125{
 126        while (len--) {
 127                if (!wait_mask(STATUS(base), DF, DF, 0, timeout))
 128                        return 1;
 129                *buf++ = inb(DATA(base));
 130        }
 131        return 0;
 132}
 133
 134static int makecode(unsigned hosterr, unsigned scsierr)
 135{
 136        switch (hosterr) {
 137        case 0x0:
 138        case 0xa:               /* Linked command complete without error and linked normally */
 139        case 0xb:               /* Linked command complete without error, interrupt generated */
 140                hosterr = 0;
 141                break;
 142
 143        case 0x11:              /* Selection time out-The initiator selection or target
 144                                   reselection was not complete within the SCSI Time out period */
 145                hosterr = DID_TIME_OUT;
 146                break;
 147
 148        case 0x12:              /* Data overrun/underrun-The target attempted to transfer more data
 149                                   than was allocated by the Data Length field or the sum of the
 150                                   Scatter / Gather Data Length fields. */
 151
 152        case 0x13:              /* Unexpected bus free-The target dropped the SCSI BSY at an unexpected time. */
 153
 154        case 0x15:              /* MBO command was not 00, 01 or 02-The first byte of the CB was
 155                                   invalid. This usually indicates a software failure. */
 156
 157        case 0x16:              /* Invalid CCB Operation Code-The first byte of the CCB was invalid.
 158                                   This usually indicates a software failure. */
 159
 160        case 0x17:              /* Linked CCB does not have the same LUN-A subsequent CCB of a set
 161                                   of linked CCB's does not specify the same logical unit number as
 162                                   the first. */
 163        case 0x18:              /* Invalid Target Direction received from Host-The direction of a
 164                                   Target Mode CCB was invalid. */
 165
 166        case 0x19:              /* Duplicate CCB Received in Target Mode-More than once CCB was
 167                                   received to service data transfer between the same target LUN
 168                                   and initiator SCSI ID in the same direction. */
 169
 170        case 0x1a:              /* Invalid CCB or Segment List Parameter-A segment list with a zero
 171                                   length segment or invalid segment list boundaries was received.
 172                                   A CCB parameter was invalid. */
 173#ifdef DEBUG
 174                printk("Aha1542: %x %x\n", hosterr, scsierr);
 175#endif
 176                hosterr = DID_ERROR;    /* Couldn't find any better */
 177                break;
 178
 179        case 0x14:              /* Target bus phase sequence failure-An invalid bus phase or bus
 180                                   phase sequence was requested by the target. The host adapter
 181                                   will generate a SCSI Reset Condition, notifying the host with
 182                                   a SCRD interrupt */
 183                hosterr = DID_RESET;
 184                break;
 185        default:
 186                printk(KERN_ERR "aha1542: makecode: unknown hoststatus %x\n", hosterr);
 187                break;
 188        }
 189        return scsierr | (hosterr << 16);
 190}
 191
 192static int aha1542_test_port(struct Scsi_Host *sh)
 193{
 194        u8 inquiry_result[4];
 195        int i;
 196
 197        /* Quick and dirty test for presence of the card. */
 198        if (inb(STATUS(sh->io_port)) == 0xff)
 199                return 0;
 200
 201        /* Reset the adapter. I ought to make a hard reset, but it's not really necessary */
 202
 203        /* In case some other card was probing here, reset interrupts */
 204        aha1542_intr_reset(sh->io_port);        /* reset interrupts, so they don't block */
 205
 206        outb(SRST | IRST /*|SCRST */ , CONTROL(sh->io_port));
 207
 208        mdelay(20);             /* Wait a little bit for things to settle down. */
 209
 210        /* Expect INIT and IDLE, any of the others are bad */
 211        if (!wait_mask(STATUS(sh->io_port), STATMASK, INIT | IDLE, STST | DIAGF | INVDCMD | DF | CDF, 0))
 212                return 0;
 213
 214        /* Shouldn't have generated any interrupts during reset */
 215        if (inb(INTRFLAGS(sh->io_port)) & INTRMASK)
 216                return 0;
 217
 218        /* Perform a host adapter inquiry instead so we do not need to set
 219           up the mailboxes ahead of time */
 220
 221        aha1542_outb(sh->io_port, CMD_INQUIRY);
 222
 223        for (i = 0; i < 4; i++) {
 224                if (!wait_mask(STATUS(sh->io_port), DF, DF, 0, 0))
 225                        return 0;
 226                inquiry_result[i] = inb(DATA(sh->io_port));
 227        }
 228
 229        /* Reading port should reset DF */
 230        if (inb(STATUS(sh->io_port)) & DF)
 231                return 0;
 232
 233        /* When HACC, command is completed, and we're though testing */
 234        if (!wait_mask(INTRFLAGS(sh->io_port), HACC, HACC, 0, 0))
 235                return 0;
 236
 237        /* Clear interrupts */
 238        outb(IRST, CONTROL(sh->io_port));
 239
 240        return 1;
 241}
 242
 243static void aha1542_free_cmd(struct scsi_cmnd *cmd)
 244{
 245        struct aha1542_cmd *acmd = scsi_cmd_priv(cmd);
 246        struct device *dev = cmd->device->host->dma_dev;
 247        size_t len = scsi_sg_count(cmd) * sizeof(struct chain);
 248
 249        if (acmd->chain) {
 250                dma_unmap_single(dev, acmd->chain_handle, len, DMA_TO_DEVICE);
 251                kfree(acmd->chain);
 252        }
 253
 254        acmd->chain = NULL;
 255        scsi_dma_unmap(cmd);
 256}
 257
 258static irqreturn_t aha1542_interrupt(int irq, void *dev_id)
 259{
 260        struct Scsi_Host *sh = dev_id;
 261        struct aha1542_hostdata *aha1542 = shost_priv(sh);
 262        void (*my_done)(struct scsi_cmnd *) = NULL;
 263        int errstatus, mbi, mbo, mbistatus;
 264        int number_serviced;
 265        unsigned long flags;
 266        struct scsi_cmnd *tmp_cmd;
 267        int flag;
 268        struct mailbox *mb = aha1542->mb;
 269        struct ccb *ccb = aha1542->ccb;
 270
 271#ifdef DEBUG
 272        {
 273                flag = inb(INTRFLAGS(sh->io_port));
 274                shost_printk(KERN_DEBUG, sh, "aha1542_intr_handle: ");
 275                if (!(flag & ANYINTR))
 276                        printk("no interrupt?");
 277                if (flag & MBIF)
 278                        printk("MBIF ");
 279                if (flag & MBOA)
 280                        printk("MBOF ");
 281                if (flag & HACC)
 282                        printk("HACC ");
 283                if (flag & SCRD)
 284                        printk("SCRD ");
 285                printk("status %02x\n", inb(STATUS(sh->io_port)));
 286        };
 287#endif
 288        number_serviced = 0;
 289
 290        spin_lock_irqsave(sh->host_lock, flags);
 291        while (1) {
 292                flag = inb(INTRFLAGS(sh->io_port));
 293
 294                /* Check for unusual interrupts.  If any of these happen, we should
 295                   probably do something special, but for now just printing a message
 296                   is sufficient.  A SCSI reset detected is something that we really
 297                   need to deal with in some way. */
 298                if (flag & ~MBIF) {
 299                        if (flag & MBOA)
 300                                printk("MBOF ");
 301                        if (flag & HACC)
 302                                printk("HACC ");
 303                        if (flag & SCRD)
 304                                printk("SCRD ");
 305                }
 306                aha1542_intr_reset(sh->io_port);
 307
 308                mbi = aha1542->aha1542_last_mbi_used + 1;
 309                if (mbi >= 2 * AHA1542_MAILBOXES)
 310                        mbi = AHA1542_MAILBOXES;
 311
 312                do {
 313                        if (mb[mbi].status != 0)
 314                                break;
 315                        mbi++;
 316                        if (mbi >= 2 * AHA1542_MAILBOXES)
 317                                mbi = AHA1542_MAILBOXES;
 318                } while (mbi != aha1542->aha1542_last_mbi_used);
 319
 320                if (mb[mbi].status == 0) {
 321                        spin_unlock_irqrestore(sh->host_lock, flags);
 322                        /* Hmm, no mail.  Must have read it the last time around */
 323                        if (!number_serviced)
 324                                shost_printk(KERN_WARNING, sh, "interrupt received, but no mail.\n");
 325                        return IRQ_HANDLED;
 326                };
 327
 328                mbo = (scsi2int(mb[mbi].ccbptr) - (unsigned long)aha1542->ccb_handle) / sizeof(struct ccb);
 329                mbistatus = mb[mbi].status;
 330                mb[mbi].status = 0;
 331                aha1542->aha1542_last_mbi_used = mbi;
 332
 333#ifdef DEBUG
 334                if (ccb[mbo].tarstat | ccb[mbo].hastat)
 335                        shost_printk(KERN_DEBUG, sh, "aha1542_command: returning %x (status %d)\n",
 336                               ccb[mbo].tarstat + ((int) ccb[mbo].hastat << 16), mb[mbi].status);
 337#endif
 338
 339                if (mbistatus == 3)
 340                        continue;       /* Aborted command not found */
 341
 342#ifdef DEBUG
 343                shost_printk(KERN_DEBUG, sh, "...done %d %d\n", mbo, mbi);
 344#endif
 345
 346                tmp_cmd = aha1542->int_cmds[mbo];
 347
 348                if (!tmp_cmd || !tmp_cmd->scsi_done) {
 349                        spin_unlock_irqrestore(sh->host_lock, flags);
 350                        shost_printk(KERN_WARNING, sh, "Unexpected interrupt\n");
 351                        shost_printk(KERN_WARNING, sh, "tarstat=%x, hastat=%x idlun=%x ccb#=%d\n", ccb[mbo].tarstat,
 352                               ccb[mbo].hastat, ccb[mbo].idlun, mbo);
 353                        return IRQ_HANDLED;
 354                }
 355                my_done = tmp_cmd->scsi_done;
 356                aha1542_free_cmd(tmp_cmd);
 357                /* Fetch the sense data, and tuck it away, in the required slot.  The
 358                   Adaptec automatically fetches it, and there is no guarantee that
 359                   we will still have it in the cdb when we come back */
 360                if (ccb[mbo].tarstat == 2)
 361                        memcpy(tmp_cmd->sense_buffer, &ccb[mbo].cdb[ccb[mbo].cdblen],
 362                               SCSI_SENSE_BUFFERSIZE);
 363
 364
 365                /* is there mail :-) */
 366
 367                /* more error checking left out here */
 368                if (mbistatus != 1)
 369                        /* This is surely wrong, but I don't know what's right */
 370                        errstatus = makecode(ccb[mbo].hastat, ccb[mbo].tarstat);
 371                else
 372                        errstatus = 0;
 373
 374#ifdef DEBUG
 375                if (errstatus)
 376                        shost_printk(KERN_DEBUG, sh, "(aha1542 error:%x %x %x) ", errstatus,
 377                               ccb[mbo].hastat, ccb[mbo].tarstat);
 378                if (ccb[mbo].tarstat == 2)
 379                        print_hex_dump_bytes("sense: ", DUMP_PREFIX_NONE, &ccb[mbo].cdb[ccb[mbo].cdblen], 12);
 380                if (errstatus)
 381                        printk("aha1542_intr_handle: returning %6x\n", errstatus);
 382#endif
 383                tmp_cmd->result = errstatus;
 384                aha1542->int_cmds[mbo] = NULL;  /* This effectively frees up the mailbox slot, as
 385                                                   far as queuecommand is concerned */
 386                my_done(tmp_cmd);
 387                number_serviced++;
 388        };
 389}
 390
 391static int aha1542_queuecommand(struct Scsi_Host *sh, struct scsi_cmnd *cmd)
 392{
 393        struct aha1542_cmd *acmd = scsi_cmd_priv(cmd);
 394        struct aha1542_hostdata *aha1542 = shost_priv(sh);
 395        u8 direction;
 396        u8 target = cmd->device->id;
 397        u8 lun = cmd->device->lun;
 398        unsigned long flags;
 399        int bufflen = scsi_bufflen(cmd);
 400        int mbo, sg_count;
 401        struct mailbox *mb = aha1542->mb;
 402        struct ccb *ccb = aha1542->ccb;
 403
 404        if (*cmd->cmnd == REQUEST_SENSE) {
 405                /* Don't do the command - we have the sense data already */
 406                cmd->result = 0;
 407                cmd->scsi_done(cmd);
 408                return 0;
 409        }
 410#ifdef DEBUG
 411        {
 412                int i = -1;
 413                if (*cmd->cmnd == READ_10 || *cmd->cmnd == WRITE_10)
 414                        i = xscsi2int(cmd->cmnd + 2);
 415                else if (*cmd->cmnd == READ_6 || *cmd->cmnd == WRITE_6)
 416                        i = scsi2int(cmd->cmnd + 2);
 417                shost_printk(KERN_DEBUG, sh, "aha1542_queuecommand: dev %d cmd %02x pos %d len %d",
 418                                                target, *cmd->cmnd, i, bufflen);
 419                print_hex_dump_bytes("command: ", DUMP_PREFIX_NONE, cmd->cmnd, cmd->cmd_len);
 420        }
 421#endif
 422        sg_count = scsi_dma_map(cmd);
 423        if (sg_count) {
 424                size_t len = sg_count * sizeof(struct chain);
 425
 426                acmd->chain = kmalloc(len, GFP_DMA);
 427                if (!acmd->chain)
 428                        goto out_unmap;
 429                acmd->chain_handle = dma_map_single(sh->dma_dev, acmd->chain,
 430                                len, DMA_TO_DEVICE);
 431                if (dma_mapping_error(sh->dma_dev, acmd->chain_handle))
 432                        goto out_free_chain;
 433        }
 434
 435        /* Use the outgoing mailboxes in a round-robin fashion, because this
 436           is how the host adapter will scan for them */
 437
 438        spin_lock_irqsave(sh->host_lock, flags);
 439        mbo = aha1542->aha1542_last_mbo_used + 1;
 440        if (mbo >= AHA1542_MAILBOXES)
 441                mbo = 0;
 442
 443        do {
 444                if (mb[mbo].status == 0 && aha1542->int_cmds[mbo] == NULL)
 445                        break;
 446                mbo++;
 447                if (mbo >= AHA1542_MAILBOXES)
 448                        mbo = 0;
 449        } while (mbo != aha1542->aha1542_last_mbo_used);
 450
 451        if (mb[mbo].status || aha1542->int_cmds[mbo])
 452                panic("Unable to find empty mailbox for aha1542.\n");
 453
 454        aha1542->int_cmds[mbo] = cmd;   /* This will effectively prevent someone else from
 455                                           screwing with this cdb. */
 456
 457        aha1542->aha1542_last_mbo_used = mbo;
 458
 459#ifdef DEBUG
 460        shost_printk(KERN_DEBUG, sh, "Sending command (%d %p)...", mbo, cmd->scsi_done);
 461#endif
 462
 463        /* This gets trashed for some reason */
 464        any2scsi(mb[mbo].ccbptr, aha1542->ccb_handle + mbo * sizeof(*ccb));
 465
 466        memset(&ccb[mbo], 0, sizeof(struct ccb));
 467
 468        ccb[mbo].cdblen = cmd->cmd_len;
 469
 470        direction = 0;
 471        if (*cmd->cmnd == READ_10 || *cmd->cmnd == READ_6)
 472                direction = 8;
 473        else if (*cmd->cmnd == WRITE_10 || *cmd->cmnd == WRITE_6)
 474                direction = 16;
 475
 476        memcpy(ccb[mbo].cdb, cmd->cmnd, ccb[mbo].cdblen);
 477
 478        if (bufflen) {
 479                struct scatterlist *sg;
 480                int i;
 481
 482                ccb[mbo].op = 2;        /* SCSI Initiator Command  w/scatter-gather */
 483                scsi_for_each_sg(cmd, sg, sg_count, i) {
 484                        any2scsi(acmd->chain[i].dataptr, sg_dma_address(sg));
 485                        any2scsi(acmd->chain[i].datalen, sg_dma_len(sg));
 486                };
 487                any2scsi(ccb[mbo].datalen, sg_count * sizeof(struct chain));
 488                any2scsi(ccb[mbo].dataptr, acmd->chain_handle);
 489#ifdef DEBUG
 490                shost_printk(KERN_DEBUG, sh, "cptr %p: ", acmd->chain);
 491                print_hex_dump_bytes("cptr: ", DUMP_PREFIX_NONE, acmd->chain, 18);
 492#endif
 493        } else {
 494                ccb[mbo].op = 0;        /* SCSI Initiator Command */
 495                any2scsi(ccb[mbo].datalen, 0);
 496                any2scsi(ccb[mbo].dataptr, 0);
 497        };
 498        ccb[mbo].idlun = (target & 7) << 5 | direction | (lun & 7);     /*SCSI Target Id */
 499        ccb[mbo].rsalen = 16;
 500        ccb[mbo].linkptr[0] = ccb[mbo].linkptr[1] = ccb[mbo].linkptr[2] = 0;
 501        ccb[mbo].commlinkid = 0;
 502
 503#ifdef DEBUG
 504        print_hex_dump_bytes("sending: ", DUMP_PREFIX_NONE, &ccb[mbo], sizeof(ccb[mbo]) - 10);
 505        printk("aha1542_queuecommand: now waiting for interrupt ");
 506#endif
 507        mb[mbo].status = 1;
 508        aha1542_outb(cmd->device->host->io_port, CMD_START_SCSI);
 509        spin_unlock_irqrestore(sh->host_lock, flags);
 510
 511        return 0;
 512out_free_chain:
 513        kfree(acmd->chain);
 514        acmd->chain = NULL;
 515out_unmap:
 516        scsi_dma_unmap(cmd);
 517        return SCSI_MLQUEUE_HOST_BUSY;
 518}
 519
 520/* Initialize mailboxes */
 521static void setup_mailboxes(struct Scsi_Host *sh)
 522{
 523        struct aha1542_hostdata *aha1542 = shost_priv(sh);
 524        u8 mb_cmd[5] = { CMD_MBINIT, AHA1542_MAILBOXES, 0, 0, 0};
 525        int i;
 526
 527        for (i = 0; i < AHA1542_MAILBOXES; i++) {
 528                aha1542->mb[i].status = 0;
 529                any2scsi(aha1542->mb[i].ccbptr,
 530                         aha1542->ccb_handle + i * sizeof(struct ccb));
 531                aha1542->mb[AHA1542_MAILBOXES + i].status = 0;
 532        };
 533        aha1542_intr_reset(sh->io_port);        /* reset interrupts, so they don't block */
 534        any2scsi(mb_cmd + 2, aha1542->mb_handle);
 535        if (aha1542_out(sh->io_port, mb_cmd, 5))
 536                shost_printk(KERN_ERR, sh, "failed setting up mailboxes\n");
 537        aha1542_intr_reset(sh->io_port);
 538}
 539
 540static int aha1542_getconfig(struct Scsi_Host *sh)
 541{
 542        u8 inquiry_result[3];
 543        int i;
 544        i = inb(STATUS(sh->io_port));
 545        if (i & DF) {
 546                i = inb(DATA(sh->io_port));
 547        };
 548        aha1542_outb(sh->io_port, CMD_RETCONF);
 549        aha1542_in(sh->io_port, inquiry_result, 3, 0);
 550        if (!wait_mask(INTRFLAGS(sh->io_port), INTRMASK, HACC, 0, 0))
 551                shost_printk(KERN_ERR, sh, "error querying board settings\n");
 552        aha1542_intr_reset(sh->io_port);
 553        switch (inquiry_result[0]) {
 554        case 0x80:
 555                sh->dma_channel = 7;
 556                break;
 557        case 0x40:
 558                sh->dma_channel = 6;
 559                break;
 560        case 0x20:
 561                sh->dma_channel = 5;
 562                break;
 563        case 0x01:
 564                sh->dma_channel = 0;
 565                break;
 566        case 0:
 567                /* This means that the adapter, although Adaptec 1542 compatible, doesn't use a DMA channel.
 568                   Currently only aware of the BusLogic BT-445S VL-Bus adapter which needs this. */
 569                sh->dma_channel = 0xFF;
 570                break;
 571        default:
 572                shost_printk(KERN_ERR, sh, "Unable to determine DMA channel.\n");
 573                return -1;
 574        };
 575        switch (inquiry_result[1]) {
 576        case 0x40:
 577                sh->irq = 15;
 578                break;
 579        case 0x20:
 580                sh->irq = 14;
 581                break;
 582        case 0x8:
 583                sh->irq = 12;
 584                break;
 585        case 0x4:
 586                sh->irq = 11;
 587                break;
 588        case 0x2:
 589                sh->irq = 10;
 590                break;
 591        case 0x1:
 592                sh->irq = 9;
 593                break;
 594        default:
 595                shost_printk(KERN_ERR, sh, "Unable to determine IRQ level.\n");
 596                return -1;
 597        };
 598        sh->this_id = inquiry_result[2] & 7;
 599        return 0;
 600}
 601
 602/* This function should only be called for 1542C boards - we can detect
 603   the special firmware settings and unlock the board */
 604
 605static int aha1542_mbenable(struct Scsi_Host *sh)
 606{
 607        static u8 mbenable_cmd[3];
 608        static u8 mbenable_result[2];
 609        int retval;
 610
 611        retval = BIOS_TRANSLATION_6432;
 612
 613        aha1542_outb(sh->io_port, CMD_EXTBIOS);
 614        if (aha1542_in(sh->io_port, mbenable_result, 2, 100))
 615                return retval;
 616        if (!wait_mask(INTRFLAGS(sh->io_port), INTRMASK, HACC, 0, 100))
 617                goto fail;
 618        aha1542_intr_reset(sh->io_port);
 619
 620        if ((mbenable_result[0] & 0x08) || mbenable_result[1]) {
 621                mbenable_cmd[0] = CMD_MBENABLE;
 622                mbenable_cmd[1] = 0;
 623                mbenable_cmd[2] = mbenable_result[1];
 624
 625                if ((mbenable_result[0] & 0x08) && (mbenable_result[1] & 0x03))
 626                        retval = BIOS_TRANSLATION_25563;
 627
 628                if (aha1542_out(sh->io_port, mbenable_cmd, 3))
 629                        goto fail;
 630        };
 631        while (0) {
 632fail:
 633                shost_printk(KERN_ERR, sh, "Mailbox init failed\n");
 634        }
 635        aha1542_intr_reset(sh->io_port);
 636        return retval;
 637}
 638
 639/* Query the board to find out if it is a 1542 or a 1740, or whatever. */
 640static int aha1542_query(struct Scsi_Host *sh)
 641{
 642        struct aha1542_hostdata *aha1542 = shost_priv(sh);
 643        u8 inquiry_result[4];
 644        int i;
 645        i = inb(STATUS(sh->io_port));
 646        if (i & DF) {
 647                i = inb(DATA(sh->io_port));
 648        };
 649        aha1542_outb(sh->io_port, CMD_INQUIRY);
 650        aha1542_in(sh->io_port, inquiry_result, 4, 0);
 651        if (!wait_mask(INTRFLAGS(sh->io_port), INTRMASK, HACC, 0, 0))
 652                shost_printk(KERN_ERR, sh, "error querying card type\n");
 653        aha1542_intr_reset(sh->io_port);
 654
 655        aha1542->bios_translation = BIOS_TRANSLATION_6432;      /* Default case */
 656
 657        /* For an AHA1740 series board, we ignore the board since there is a
 658           hardware bug which can lead to wrong blocks being returned if the board
 659           is operating in the 1542 emulation mode.  Since there is an extended mode
 660           driver, we simply ignore the board and let the 1740 driver pick it up.
 661         */
 662
 663        if (inquiry_result[0] == 0x43) {
 664                shost_printk(KERN_INFO, sh, "Emulation mode not supported for AHA-1740 hardware, use aha1740 driver instead.\n");
 665                return 1;
 666        };
 667
 668        /* Always call this - boards that do not support extended bios translation
 669           will ignore the command, and we will set the proper default */
 670
 671        aha1542->bios_translation = aha1542_mbenable(sh);
 672
 673        return 0;
 674}
 675
 676static u8 dma_speed_hw(int dma_speed)
 677{
 678        switch (dma_speed) {
 679        case 5:
 680                return 0x00;
 681        case 6:
 682                return 0x04;
 683        case 7:
 684                return 0x01;
 685        case 8:
 686                return 0x02;
 687        case 10:
 688                return 0x03;
 689        }
 690
 691        return 0xff;    /* invalid */
 692}
 693
 694/* Set the Bus on/off-times as not to ruin floppy performance */
 695static void aha1542_set_bus_times(struct Scsi_Host *sh, int bus_on, int bus_off, int dma_speed)
 696{
 697        if (bus_on > 0) {
 698                u8 oncmd[] = { CMD_BUSON_TIME, clamp(bus_on, 2, 15) };
 699
 700                aha1542_intr_reset(sh->io_port);
 701                if (aha1542_out(sh->io_port, oncmd, 2))
 702                        goto fail;
 703        }
 704
 705        if (bus_off > 0) {
 706                u8 offcmd[] = { CMD_BUSOFF_TIME, clamp(bus_off, 1, 64) };
 707
 708                aha1542_intr_reset(sh->io_port);
 709                if (aha1542_out(sh->io_port, offcmd, 2))
 710                        goto fail;
 711        }
 712
 713        if (dma_speed_hw(dma_speed) != 0xff) {
 714                u8 dmacmd[] = { CMD_DMASPEED, dma_speed_hw(dma_speed) };
 715
 716                aha1542_intr_reset(sh->io_port);
 717                if (aha1542_out(sh->io_port, dmacmd, 2))
 718                        goto fail;
 719        }
 720        aha1542_intr_reset(sh->io_port);
 721        return;
 722fail:
 723        shost_printk(KERN_ERR, sh, "setting bus on/off-time failed\n");
 724        aha1542_intr_reset(sh->io_port);
 725}
 726
 727/* return non-zero on detection */
 728static struct Scsi_Host *aha1542_hw_init(struct scsi_host_template *tpnt, struct device *pdev, int indx)
 729{
 730        unsigned int base_io = io[indx];
 731        struct Scsi_Host *sh;
 732        struct aha1542_hostdata *aha1542;
 733        char dma_info[] = "no DMA";
 734
 735        if (base_io == 0)
 736                return NULL;
 737
 738        if (!request_region(base_io, AHA1542_REGION_SIZE, "aha1542"))
 739                return NULL;
 740
 741        sh = scsi_host_alloc(tpnt, sizeof(struct aha1542_hostdata));
 742        if (!sh)
 743                goto release;
 744        aha1542 = shost_priv(sh);
 745
 746        sh->unique_id = base_io;
 747        sh->io_port = base_io;
 748        sh->n_io_port = AHA1542_REGION_SIZE;
 749        aha1542->aha1542_last_mbi_used = 2 * AHA1542_MAILBOXES - 1;
 750        aha1542->aha1542_last_mbo_used = AHA1542_MAILBOXES - 1;
 751
 752        if (!aha1542_test_port(sh))
 753                goto unregister;
 754
 755        aha1542_set_bus_times(sh, bus_on[indx], bus_off[indx], dma_speed[indx]);
 756        if (aha1542_query(sh))
 757                goto unregister;
 758        if (aha1542_getconfig(sh) == -1)
 759                goto unregister;
 760
 761        if (sh->dma_channel != 0xFF)
 762                snprintf(dma_info, sizeof(dma_info), "DMA %d", sh->dma_channel);
 763        shost_printk(KERN_INFO, sh, "Adaptec AHA-1542 (SCSI-ID %d) at IO 0x%x, IRQ %d, %s\n",
 764                                sh->this_id, base_io, sh->irq, dma_info);
 765        if (aha1542->bios_translation == BIOS_TRANSLATION_25563)
 766                shost_printk(KERN_INFO, sh, "Using extended bios translation\n");
 767
 768        if (dma_set_mask_and_coherent(pdev, DMA_BIT_MASK(24)) < 0)
 769                goto unregister;
 770
 771        aha1542->mb = dma_alloc_coherent(pdev,
 772                        AHA1542_MAILBOXES * 2 * sizeof(struct mailbox),
 773                        &aha1542->mb_handle, GFP_KERNEL);
 774        if (!aha1542->mb)
 775                goto unregister;
 776
 777        aha1542->ccb = dma_alloc_coherent(pdev,
 778                        AHA1542_MAILBOXES * sizeof(struct ccb),
 779                        &aha1542->ccb_handle, GFP_KERNEL);
 780        if (!aha1542->ccb)
 781                goto free_mb;
 782
 783        setup_mailboxes(sh);
 784
 785        if (request_irq(sh->irq, aha1542_interrupt, 0, "aha1542", sh)) {
 786                shost_printk(KERN_ERR, sh, "Unable to allocate IRQ.\n");
 787                goto free_ccb;
 788        }
 789        if (sh->dma_channel != 0xFF) {
 790                if (request_dma(sh->dma_channel, "aha1542")) {
 791                        shost_printk(KERN_ERR, sh, "Unable to allocate DMA channel.\n");
 792                        goto free_irq;
 793                }
 794                if (sh->dma_channel == 0 || sh->dma_channel >= 5) {
 795                        set_dma_mode(sh->dma_channel, DMA_MODE_CASCADE);
 796                        enable_dma(sh->dma_channel);
 797                }
 798        }
 799
 800        if (scsi_add_host(sh, pdev))
 801                goto free_dma;
 802
 803        scsi_scan_host(sh);
 804
 805        return sh;
 806
 807free_dma:
 808        if (sh->dma_channel != 0xff)
 809                free_dma(sh->dma_channel);
 810free_irq:
 811        free_irq(sh->irq, sh);
 812free_ccb:
 813        dma_free_coherent(pdev, AHA1542_MAILBOXES * sizeof(struct ccb),
 814                          aha1542->ccb, aha1542->ccb_handle);
 815free_mb:
 816        dma_free_coherent(pdev, AHA1542_MAILBOXES * 2 * sizeof(struct mailbox),
 817                          aha1542->mb, aha1542->mb_handle);
 818unregister:
 819        scsi_host_put(sh);
 820release:
 821        release_region(base_io, AHA1542_REGION_SIZE);
 822
 823        return NULL;
 824}
 825
 826static int aha1542_release(struct Scsi_Host *sh)
 827{
 828        struct aha1542_hostdata *aha1542 = shost_priv(sh);
 829        struct device *dev = sh->dma_dev;
 830
 831        scsi_remove_host(sh);
 832        if (sh->dma_channel != 0xff)
 833                free_dma(sh->dma_channel);
 834        dma_free_coherent(dev, AHA1542_MAILBOXES * sizeof(struct ccb),
 835                          aha1542->ccb, aha1542->ccb_handle);
 836        dma_free_coherent(dev, AHA1542_MAILBOXES * 2 * sizeof(struct mailbox),
 837                          aha1542->mb, aha1542->mb_handle);
 838        if (sh->irq)
 839                free_irq(sh->irq, sh);
 840        if (sh->io_port && sh->n_io_port)
 841                release_region(sh->io_port, sh->n_io_port);
 842        scsi_host_put(sh);
 843        return 0;
 844}
 845
 846
 847/*
 848 * This is a device reset.  This is handled by sending a special command
 849 * to the device.
 850 */
 851static int aha1542_dev_reset(struct scsi_cmnd *cmd)
 852{
 853        struct Scsi_Host *sh = cmd->device->host;
 854        struct aha1542_hostdata *aha1542 = shost_priv(sh);
 855        unsigned long flags;
 856        struct mailbox *mb = aha1542->mb;
 857        u8 target = cmd->device->id;
 858        u8 lun = cmd->device->lun;
 859        int mbo;
 860        struct ccb *ccb = aha1542->ccb;
 861
 862        spin_lock_irqsave(sh->host_lock, flags);
 863        mbo = aha1542->aha1542_last_mbo_used + 1;
 864        if (mbo >= AHA1542_MAILBOXES)
 865                mbo = 0;
 866
 867        do {
 868                if (mb[mbo].status == 0 && aha1542->int_cmds[mbo] == NULL)
 869                        break;
 870                mbo++;
 871                if (mbo >= AHA1542_MAILBOXES)
 872                        mbo = 0;
 873        } while (mbo != aha1542->aha1542_last_mbo_used);
 874
 875        if (mb[mbo].status || aha1542->int_cmds[mbo])
 876                panic("Unable to find empty mailbox for aha1542.\n");
 877
 878        aha1542->int_cmds[mbo] = cmd;   /* This will effectively
 879                                           prevent someone else from
 880                                           screwing with this cdb. */
 881
 882        aha1542->aha1542_last_mbo_used = mbo;
 883
 884        /* This gets trashed for some reason */
 885        any2scsi(mb[mbo].ccbptr, aha1542->ccb_handle + mbo * sizeof(*ccb));
 886
 887        memset(&ccb[mbo], 0, sizeof(struct ccb));
 888
 889        ccb[mbo].op = 0x81;     /* BUS DEVICE RESET */
 890
 891        ccb[mbo].idlun = (target & 7) << 5 | (lun & 7);         /*SCSI Target Id */
 892
 893        ccb[mbo].linkptr[0] = ccb[mbo].linkptr[1] = ccb[mbo].linkptr[2] = 0;
 894        ccb[mbo].commlinkid = 0;
 895
 896        /* 
 897         * Now tell the 1542 to flush all pending commands for this 
 898         * target 
 899         */
 900        aha1542_outb(sh->io_port, CMD_START_SCSI);
 901        spin_unlock_irqrestore(sh->host_lock, flags);
 902
 903        scmd_printk(KERN_WARNING, cmd,
 904                "Trying device reset for target\n");
 905
 906        return SUCCESS;
 907}
 908
 909static int aha1542_reset(struct scsi_cmnd *cmd, u8 reset_cmd)
 910{
 911        struct Scsi_Host *sh = cmd->device->host;
 912        struct aha1542_hostdata *aha1542 = shost_priv(sh);
 913        unsigned long flags;
 914        int i;
 915
 916        spin_lock_irqsave(sh->host_lock, flags);
 917        /* 
 918         * This does a scsi reset for all devices on the bus.
 919         * In principle, we could also reset the 1542 - should
 920         * we do this?  Try this first, and we can add that later
 921         * if it turns out to be useful.
 922         */
 923        outb(reset_cmd, CONTROL(cmd->device->host->io_port));
 924
 925        if (!wait_mask(STATUS(cmd->device->host->io_port),
 926             STATMASK, IDLE, STST | DIAGF | INVDCMD | DF | CDF, 0)) {
 927                spin_unlock_irqrestore(sh->host_lock, flags);
 928                return FAILED;
 929        }
 930
 931        /*
 932         * We need to do this too before the 1542 can interact with
 933         * us again after host reset.
 934         */
 935        if (reset_cmd & HRST)
 936                setup_mailboxes(cmd->device->host);
 937
 938        /*
 939         * Now try to pick up the pieces.  For all pending commands,
 940         * free any internal data structures, and basically clear things
 941         * out.  We do not try and restart any commands or anything - 
 942         * the strategy handler takes care of that crap.
 943         */
 944        shost_printk(KERN_WARNING, cmd->device->host, "Sent BUS RESET to scsi host %d\n", cmd->device->host->host_no);
 945
 946        for (i = 0; i < AHA1542_MAILBOXES; i++) {
 947                if (aha1542->int_cmds[i] != NULL) {
 948                        struct scsi_cmnd *tmp_cmd;
 949                        tmp_cmd = aha1542->int_cmds[i];
 950
 951                        if (tmp_cmd->device->soft_reset) {
 952                                /*
 953                                 * If this device implements the soft reset option,
 954                                 * then it is still holding onto the command, and
 955                                 * may yet complete it.  In this case, we don't
 956                                 * flush the data.
 957                                 */
 958                                continue;
 959                        }
 960                        aha1542_free_cmd(tmp_cmd);
 961                        aha1542->int_cmds[i] = NULL;
 962                        aha1542->mb[i].status = 0;
 963                }
 964        }
 965
 966        spin_unlock_irqrestore(sh->host_lock, flags);
 967        return SUCCESS;
 968}
 969
 970static int aha1542_bus_reset(struct scsi_cmnd *cmd)
 971{
 972        return aha1542_reset(cmd, SCRST);
 973}
 974
 975static int aha1542_host_reset(struct scsi_cmnd *cmd)
 976{
 977        return aha1542_reset(cmd, HRST | SCRST);
 978}
 979
 980static int aha1542_biosparam(struct scsi_device *sdev,
 981                struct block_device *bdev, sector_t capacity, int geom[])
 982{
 983        struct aha1542_hostdata *aha1542 = shost_priv(sdev->host);
 984
 985        if (capacity >= 0x200000 &&
 986                        aha1542->bios_translation == BIOS_TRANSLATION_25563) {
 987                /* Please verify that this is the same as what DOS returns */
 988                geom[0] = 255;  /* heads */
 989                geom[1] = 63;   /* sectors */
 990        } else {
 991                geom[0] = 64;   /* heads */
 992                geom[1] = 32;   /* sectors */
 993        }
 994        geom[2] = sector_div(capacity, geom[0] * geom[1]);      /* cylinders */
 995
 996        return 0;
 997}
 998MODULE_LICENSE("GPL");
 999
1000static struct scsi_host_template driver_template = {
1001        .module                 = THIS_MODULE,
1002        .proc_name              = "aha1542",
1003        .name                   = "Adaptec 1542",
1004        .cmd_size               = sizeof(struct aha1542_cmd),
1005        .queuecommand           = aha1542_queuecommand,
1006        .eh_device_reset_handler= aha1542_dev_reset,
1007        .eh_bus_reset_handler   = aha1542_bus_reset,
1008        .eh_host_reset_handler  = aha1542_host_reset,
1009        .bios_param             = aha1542_biosparam,
1010        .can_queue              = AHA1542_MAILBOXES, 
1011        .this_id                = 7,
1012        .sg_tablesize           = 16,
1013        .unchecked_isa_dma      = 1, 
1014};
1015
1016static int aha1542_isa_match(struct device *pdev, unsigned int ndev)
1017{
1018        struct Scsi_Host *sh = aha1542_hw_init(&driver_template, pdev, ndev);
1019
1020        if (!sh)
1021                return 0;
1022
1023        dev_set_drvdata(pdev, sh);
1024        return 1;
1025}
1026
1027static int aha1542_isa_remove(struct device *pdev,
1028                                    unsigned int ndev)
1029{
1030        aha1542_release(dev_get_drvdata(pdev));
1031        dev_set_drvdata(pdev, NULL);
1032        return 0;
1033}
1034
1035static struct isa_driver aha1542_isa_driver = {
1036        .match          = aha1542_isa_match,
1037        .remove         = aha1542_isa_remove,
1038        .driver         = {
1039                .name   = "aha1542"
1040        },
1041};
1042static int isa_registered;
1043
1044#ifdef CONFIG_PNP
1045static const struct pnp_device_id aha1542_pnp_ids[] = {
1046        { .id = "ADP1542" },
1047        { .id = "" }
1048};
1049MODULE_DEVICE_TABLE(pnp, aha1542_pnp_ids);
1050
1051static int aha1542_pnp_probe(struct pnp_dev *pdev, const struct pnp_device_id *id)
1052{
1053        int indx;
1054        struct Scsi_Host *sh;
1055
1056        for (indx = 0; indx < ARRAY_SIZE(io); indx++) {
1057                if (io[indx])
1058                        continue;
1059
1060                if (pnp_activate_dev(pdev) < 0)
1061                        continue;
1062
1063                io[indx] = pnp_port_start(pdev, 0);
1064
1065                /* The card can be queried for its DMA, we have
1066                   the DMA set up that is enough */
1067
1068                dev_info(&pdev->dev, "ISAPnP found an AHA1535 at I/O 0x%03X", io[indx]);
1069        }
1070
1071        sh = aha1542_hw_init(&driver_template, &pdev->dev, indx);
1072        if (!sh)
1073                return -ENODEV;
1074
1075        pnp_set_drvdata(pdev, sh);
1076        return 0;
1077}
1078
1079static void aha1542_pnp_remove(struct pnp_dev *pdev)
1080{
1081        aha1542_release(pnp_get_drvdata(pdev));
1082        pnp_set_drvdata(pdev, NULL);
1083}
1084
1085static struct pnp_driver aha1542_pnp_driver = {
1086        .name           = "aha1542",
1087        .id_table       = aha1542_pnp_ids,
1088        .probe          = aha1542_pnp_probe,
1089        .remove         = aha1542_pnp_remove,
1090};
1091static int pnp_registered;
1092#endif /* CONFIG_PNP */
1093
1094static int __init aha1542_init(void)
1095{
1096        int ret = 0;
1097
1098#ifdef CONFIG_PNP
1099        if (isapnp) {
1100                ret = pnp_register_driver(&aha1542_pnp_driver);
1101                if (!ret)
1102                        pnp_registered = 1;
1103        }
1104#endif
1105        ret = isa_register_driver(&aha1542_isa_driver, MAXBOARDS);
1106        if (!ret)
1107                isa_registered = 1;
1108
1109#ifdef CONFIG_PNP
1110        if (pnp_registered)
1111                ret = 0;
1112#endif
1113        if (isa_registered)
1114                ret = 0;
1115
1116        return ret;
1117}
1118
1119static void __exit aha1542_exit(void)
1120{
1121#ifdef CONFIG_PNP
1122        if (pnp_registered)
1123                pnp_unregister_driver(&aha1542_pnp_driver);
1124#endif
1125        if (isa_registered)
1126                isa_unregister_driver(&aha1542_isa_driver);
1127}
1128
1129module_init(aha1542_init);
1130module_exit(aha1542_exit);
1131