root/drivers/scsi/aha1542.c

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

DEFINITIONS

This source file includes following definitions.
  1. aha1542_intr_reset
  2. wait_mask
  3. aha1542_outb
  4. aha1542_out
  5. aha1542_in
  6. makecode
  7. aha1542_test_port
  8. aha1542_free_cmd
  9. aha1542_interrupt
  10. aha1542_queuecommand
  11. setup_mailboxes
  12. aha1542_getconfig
  13. aha1542_mbenable
  14. aha1542_query
  15. dma_speed_hw
  16. aha1542_set_bus_times
  17. aha1542_hw_init
  18. aha1542_release
  19. aha1542_dev_reset
  20. aha1542_reset
  21. aha1542_bus_reset
  22. aha1542_host_reset
  23. aha1542_biosparam
  24. aha1542_isa_match
  25. aha1542_isa_remove
  26. aha1542_pnp_probe
  27. aha1542_pnp_remove
  28. aha1542_init
  29. aha1542_exit

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

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