linux/drivers/scsi/myrb.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 * Linux Driver for Mylex DAC960/AcceleRAID/eXtremeRAID PCI RAID Controllers
   4 *
   5 * Copyright 2017 Hannes Reinecke, SUSE Linux GmbH <hare@suse.com>
   6 *
   7 * Based on the original DAC960 driver,
   8 * Copyright 1998-2001 by Leonard N. Zubkoff <lnz@dandelion.com>
   9 * Portions Copyright 2002 by Mylex (An IBM Business Unit)
  10 *
  11 */
  12
  13#include <linux/module.h>
  14#include <linux/types.h>
  15#include <linux/delay.h>
  16#include <linux/interrupt.h>
  17#include <linux/pci.h>
  18#include <linux/raid_class.h>
  19#include <asm/unaligned.h>
  20#include <scsi/scsi.h>
  21#include <scsi/scsi_host.h>
  22#include <scsi/scsi_device.h>
  23#include <scsi/scsi_cmnd.h>
  24#include <scsi/scsi_tcq.h>
  25#include "myrb.h"
  26
  27static struct raid_template *myrb_raid_template;
  28
  29static void myrb_monitor(struct work_struct *work);
  30static inline void myrb_translate_devstate(void *DeviceState);
  31
  32static inline int myrb_logical_channel(struct Scsi_Host *shost)
  33{
  34        return shost->max_channel - 1;
  35}
  36
  37static struct myrb_devstate_name_entry {
  38        enum myrb_devstate state;
  39        const char *name;
  40} myrb_devstate_name_list[] = {
  41        { MYRB_DEVICE_DEAD, "Dead" },
  42        { MYRB_DEVICE_WO, "WriteOnly" },
  43        { MYRB_DEVICE_ONLINE, "Online" },
  44        { MYRB_DEVICE_CRITICAL, "Critical" },
  45        { MYRB_DEVICE_STANDBY, "Standby" },
  46        { MYRB_DEVICE_OFFLINE, "Offline" },
  47};
  48
  49static const char *myrb_devstate_name(enum myrb_devstate state)
  50{
  51        struct myrb_devstate_name_entry *entry = myrb_devstate_name_list;
  52        int i;
  53
  54        for (i = 0; i < ARRAY_SIZE(myrb_devstate_name_list); i++) {
  55                if (entry[i].state == state)
  56                        return entry[i].name;
  57        }
  58        return "Unknown";
  59}
  60
  61static struct myrb_raidlevel_name_entry {
  62        enum myrb_raidlevel level;
  63        const char *name;
  64} myrb_raidlevel_name_list[] = {
  65        { MYRB_RAID_LEVEL0, "RAID0" },
  66        { MYRB_RAID_LEVEL1, "RAID1" },
  67        { MYRB_RAID_LEVEL3, "RAID3" },
  68        { MYRB_RAID_LEVEL5, "RAID5" },
  69        { MYRB_RAID_LEVEL6, "RAID6" },
  70        { MYRB_RAID_JBOD, "JBOD" },
  71};
  72
  73static const char *myrb_raidlevel_name(enum myrb_raidlevel level)
  74{
  75        struct myrb_raidlevel_name_entry *entry = myrb_raidlevel_name_list;
  76        int i;
  77
  78        for (i = 0; i < ARRAY_SIZE(myrb_raidlevel_name_list); i++) {
  79                if (entry[i].level == level)
  80                        return entry[i].name;
  81        }
  82        return NULL;
  83}
  84
  85/*
  86 * myrb_create_mempools - allocates auxiliary data structures
  87 *
  88 * Return: true on success, false otherwise.
  89 */
  90static bool myrb_create_mempools(struct pci_dev *pdev, struct myrb_hba *cb)
  91{
  92        size_t elem_size, elem_align;
  93
  94        elem_align = sizeof(struct myrb_sge);
  95        elem_size = cb->host->sg_tablesize * elem_align;
  96        cb->sg_pool = dma_pool_create("myrb_sg", &pdev->dev,
  97                                      elem_size, elem_align, 0);
  98        if (cb->sg_pool == NULL) {
  99                shost_printk(KERN_ERR, cb->host,
 100                             "Failed to allocate SG pool\n");
 101                return false;
 102        }
 103
 104        cb->dcdb_pool = dma_pool_create("myrb_dcdb", &pdev->dev,
 105                                       sizeof(struct myrb_dcdb),
 106                                       sizeof(unsigned int), 0);
 107        if (!cb->dcdb_pool) {
 108                dma_pool_destroy(cb->sg_pool);
 109                cb->sg_pool = NULL;
 110                shost_printk(KERN_ERR, cb->host,
 111                             "Failed to allocate DCDB pool\n");
 112                return false;
 113        }
 114
 115        snprintf(cb->work_q_name, sizeof(cb->work_q_name),
 116                 "myrb_wq_%d", cb->host->host_no);
 117        cb->work_q = create_singlethread_workqueue(cb->work_q_name);
 118        if (!cb->work_q) {
 119                dma_pool_destroy(cb->dcdb_pool);
 120                cb->dcdb_pool = NULL;
 121                dma_pool_destroy(cb->sg_pool);
 122                cb->sg_pool = NULL;
 123                shost_printk(KERN_ERR, cb->host,
 124                             "Failed to create workqueue\n");
 125                return false;
 126        }
 127
 128        /*
 129         * Initialize the Monitoring Timer.
 130         */
 131        INIT_DELAYED_WORK(&cb->monitor_work, myrb_monitor);
 132        queue_delayed_work(cb->work_q, &cb->monitor_work, 1);
 133
 134        return true;
 135}
 136
 137/*
 138 * myrb_destroy_mempools - tears down the memory pools for the controller
 139 */
 140static void myrb_destroy_mempools(struct myrb_hba *cb)
 141{
 142        cancel_delayed_work_sync(&cb->monitor_work);
 143        destroy_workqueue(cb->work_q);
 144
 145        dma_pool_destroy(cb->sg_pool);
 146        dma_pool_destroy(cb->dcdb_pool);
 147}
 148
 149/*
 150 * myrb_reset_cmd - reset command block
 151 */
 152static inline void myrb_reset_cmd(struct myrb_cmdblk *cmd_blk)
 153{
 154        union myrb_cmd_mbox *mbox = &cmd_blk->mbox;
 155
 156        memset(mbox, 0, sizeof(union myrb_cmd_mbox));
 157        cmd_blk->status = 0;
 158}
 159
 160/*
 161 * myrb_qcmd - queues command block for execution
 162 */
 163static void myrb_qcmd(struct myrb_hba *cb, struct myrb_cmdblk *cmd_blk)
 164{
 165        void __iomem *base = cb->io_base;
 166        union myrb_cmd_mbox *mbox = &cmd_blk->mbox;
 167        union myrb_cmd_mbox *next_mbox = cb->next_cmd_mbox;
 168
 169        cb->write_cmd_mbox(next_mbox, mbox);
 170        if (cb->prev_cmd_mbox1->words[0] == 0 ||
 171            cb->prev_cmd_mbox2->words[0] == 0)
 172                cb->get_cmd_mbox(base);
 173        cb->prev_cmd_mbox2 = cb->prev_cmd_mbox1;
 174        cb->prev_cmd_mbox1 = next_mbox;
 175        if (++next_mbox > cb->last_cmd_mbox)
 176                next_mbox = cb->first_cmd_mbox;
 177        cb->next_cmd_mbox = next_mbox;
 178}
 179
 180/*
 181 * myrb_exec_cmd - executes command block and waits for completion.
 182 *
 183 * Return: command status
 184 */
 185static unsigned short myrb_exec_cmd(struct myrb_hba *cb,
 186                struct myrb_cmdblk *cmd_blk)
 187{
 188        DECLARE_COMPLETION_ONSTACK(cmpl);
 189        unsigned long flags;
 190
 191        cmd_blk->completion = &cmpl;
 192
 193        spin_lock_irqsave(&cb->queue_lock, flags);
 194        cb->qcmd(cb, cmd_blk);
 195        spin_unlock_irqrestore(&cb->queue_lock, flags);
 196
 197        wait_for_completion(&cmpl);
 198        return cmd_blk->status;
 199}
 200
 201/*
 202 * myrb_exec_type3 - executes a type 3 command and waits for completion.
 203 *
 204 * Return: command status
 205 */
 206static unsigned short myrb_exec_type3(struct myrb_hba *cb,
 207                enum myrb_cmd_opcode op, dma_addr_t addr)
 208{
 209        struct myrb_cmdblk *cmd_blk = &cb->dcmd_blk;
 210        union myrb_cmd_mbox *mbox = &cmd_blk->mbox;
 211        unsigned short status;
 212
 213        mutex_lock(&cb->dcmd_mutex);
 214        myrb_reset_cmd(cmd_blk);
 215        mbox->type3.id = MYRB_DCMD_TAG;
 216        mbox->type3.opcode = op;
 217        mbox->type3.addr = addr;
 218        status = myrb_exec_cmd(cb, cmd_blk);
 219        mutex_unlock(&cb->dcmd_mutex);
 220        return status;
 221}
 222
 223/*
 224 * myrb_exec_type3D - executes a type 3D command and waits for completion.
 225 *
 226 * Return: command status
 227 */
 228static unsigned short myrb_exec_type3D(struct myrb_hba *cb,
 229                enum myrb_cmd_opcode op, struct scsi_device *sdev,
 230                struct myrb_pdev_state *pdev_info)
 231{
 232        struct myrb_cmdblk *cmd_blk = &cb->dcmd_blk;
 233        union myrb_cmd_mbox *mbox = &cmd_blk->mbox;
 234        unsigned short status;
 235        dma_addr_t pdev_info_addr;
 236
 237        pdev_info_addr = dma_map_single(&cb->pdev->dev, pdev_info,
 238                                        sizeof(struct myrb_pdev_state),
 239                                        DMA_FROM_DEVICE);
 240        if (dma_mapping_error(&cb->pdev->dev, pdev_info_addr))
 241                return MYRB_STATUS_SUBSYS_FAILED;
 242
 243        mutex_lock(&cb->dcmd_mutex);
 244        myrb_reset_cmd(cmd_blk);
 245        mbox->type3D.id = MYRB_DCMD_TAG;
 246        mbox->type3D.opcode = op;
 247        mbox->type3D.channel = sdev->channel;
 248        mbox->type3D.target = sdev->id;
 249        mbox->type3D.addr = pdev_info_addr;
 250        status = myrb_exec_cmd(cb, cmd_blk);
 251        mutex_unlock(&cb->dcmd_mutex);
 252        dma_unmap_single(&cb->pdev->dev, pdev_info_addr,
 253                         sizeof(struct myrb_pdev_state), DMA_FROM_DEVICE);
 254        if (status == MYRB_STATUS_SUCCESS &&
 255            mbox->type3D.opcode == MYRB_CMD_GET_DEVICE_STATE_OLD)
 256                myrb_translate_devstate(pdev_info);
 257
 258        return status;
 259}
 260
 261static char *myrb_event_msg[] = {
 262        "killed because write recovery failed",
 263        "killed because of SCSI bus reset failure",
 264        "killed because of double check condition",
 265        "killed because it was removed",
 266        "killed because of gross error on SCSI chip",
 267        "killed because of bad tag returned from drive",
 268        "killed because of timeout on SCSI command",
 269        "killed because of reset SCSI command issued from system",
 270        "killed because busy or parity error count exceeded limit",
 271        "killed because of 'kill drive' command from system",
 272        "killed because of selection timeout",
 273        "killed due to SCSI phase sequence error",
 274        "killed due to unknown status",
 275};
 276
 277/**
 278 * myrb_get_event - get event log from HBA
 279 * @cb: pointer to the hba structure
 280 * @event: number of the event
 281 *
 282 * Execute a type 3E command and logs the event message
 283 */
 284static void myrb_get_event(struct myrb_hba *cb, unsigned int event)
 285{
 286        struct myrb_cmdblk *cmd_blk = &cb->mcmd_blk;
 287        union myrb_cmd_mbox *mbox = &cmd_blk->mbox;
 288        struct myrb_log_entry *ev_buf;
 289        dma_addr_t ev_addr;
 290        unsigned short status;
 291
 292        ev_buf = dma_alloc_coherent(&cb->pdev->dev,
 293                                    sizeof(struct myrb_log_entry),
 294                                    &ev_addr, GFP_KERNEL);
 295        if (!ev_buf)
 296                return;
 297
 298        myrb_reset_cmd(cmd_blk);
 299        mbox->type3E.id = MYRB_MCMD_TAG;
 300        mbox->type3E.opcode = MYRB_CMD_EVENT_LOG_OPERATION;
 301        mbox->type3E.optype = DAC960_V1_GetEventLogEntry;
 302        mbox->type3E.opqual = 1;
 303        mbox->type3E.ev_seq = event;
 304        mbox->type3E.addr = ev_addr;
 305        status = myrb_exec_cmd(cb, cmd_blk);
 306        if (status != MYRB_STATUS_SUCCESS)
 307                shost_printk(KERN_INFO, cb->host,
 308                             "Failed to get event log %d, status %04x\n",
 309                             event, status);
 310
 311        else if (ev_buf->seq_num == event) {
 312                struct scsi_sense_hdr sshdr;
 313
 314                memset(&sshdr, 0, sizeof(sshdr));
 315                scsi_normalize_sense(ev_buf->sense, 32, &sshdr);
 316
 317                if (sshdr.sense_key == VENDOR_SPECIFIC &&
 318                    sshdr.asc == 0x80 &&
 319                    sshdr.ascq < ARRAY_SIZE(myrb_event_msg))
 320                        shost_printk(KERN_CRIT, cb->host,
 321                                     "Physical drive %d:%d: %s\n",
 322                                     ev_buf->channel, ev_buf->target,
 323                                     myrb_event_msg[sshdr.ascq]);
 324                else
 325                        shost_printk(KERN_CRIT, cb->host,
 326                                     "Physical drive %d:%d: Sense: %X/%02X/%02X\n",
 327                                     ev_buf->channel, ev_buf->target,
 328                                     sshdr.sense_key, sshdr.asc, sshdr.ascq);
 329        }
 330
 331        dma_free_coherent(&cb->pdev->dev, sizeof(struct myrb_log_entry),
 332                          ev_buf, ev_addr);
 333}
 334
 335/*
 336 * myrb_get_errtable - retrieves the error table from the controller
 337 *
 338 * Executes a type 3 command and logs the error table from the controller.
 339 */
 340static void myrb_get_errtable(struct myrb_hba *cb)
 341{
 342        struct myrb_cmdblk *cmd_blk = &cb->mcmd_blk;
 343        union myrb_cmd_mbox *mbox = &cmd_blk->mbox;
 344        unsigned short status;
 345        struct myrb_error_entry old_table[MYRB_MAX_CHANNELS * MYRB_MAX_TARGETS];
 346
 347        memcpy(&old_table, cb->err_table, sizeof(old_table));
 348
 349        myrb_reset_cmd(cmd_blk);
 350        mbox->type3.id = MYRB_MCMD_TAG;
 351        mbox->type3.opcode = MYRB_CMD_GET_ERROR_TABLE;
 352        mbox->type3.addr = cb->err_table_addr;
 353        status = myrb_exec_cmd(cb, cmd_blk);
 354        if (status == MYRB_STATUS_SUCCESS) {
 355                struct myrb_error_entry *table = cb->err_table;
 356                struct myrb_error_entry *new, *old;
 357                size_t err_table_offset;
 358                struct scsi_device *sdev;
 359
 360                shost_for_each_device(sdev, cb->host) {
 361                        if (sdev->channel >= myrb_logical_channel(cb->host))
 362                                continue;
 363                        err_table_offset = sdev->channel * MYRB_MAX_TARGETS
 364                                + sdev->id;
 365                        new = table + err_table_offset;
 366                        old = &old_table[err_table_offset];
 367                        if (new->parity_err == old->parity_err &&
 368                            new->soft_err == old->soft_err &&
 369                            new->hard_err == old->hard_err &&
 370                            new->misc_err == old->misc_err)
 371                                continue;
 372                        sdev_printk(KERN_CRIT, sdev,
 373                                    "Errors: Parity = %d, Soft = %d, Hard = %d, Misc = %d\n",
 374                                    new->parity_err, new->soft_err,
 375                                    new->hard_err, new->misc_err);
 376                }
 377        }
 378}
 379
 380/*
 381 * myrb_get_ldev_info - retrieves the logical device table from the controller
 382 *
 383 * Executes a type 3 command and updates the logical device table.
 384 *
 385 * Return: command status
 386 */
 387static unsigned short myrb_get_ldev_info(struct myrb_hba *cb)
 388{
 389        unsigned short status;
 390        int ldev_num, ldev_cnt = cb->enquiry->ldev_count;
 391        struct Scsi_Host *shost = cb->host;
 392
 393        status = myrb_exec_type3(cb, MYRB_CMD_GET_LDEV_INFO,
 394                                 cb->ldev_info_addr);
 395        if (status != MYRB_STATUS_SUCCESS)
 396                return status;
 397
 398        for (ldev_num = 0; ldev_num < ldev_cnt; ldev_num++) {
 399                struct myrb_ldev_info *old = NULL;
 400                struct myrb_ldev_info *new = cb->ldev_info_buf + ldev_num;
 401                struct scsi_device *sdev;
 402
 403                sdev = scsi_device_lookup(shost, myrb_logical_channel(shost),
 404                                          ldev_num, 0);
 405                if (!sdev) {
 406                        if (new->state == MYRB_DEVICE_OFFLINE)
 407                                continue;
 408                        shost_printk(KERN_INFO, shost,
 409                                     "Adding Logical Drive %d in state %s\n",
 410                                     ldev_num, myrb_devstate_name(new->state));
 411                        scsi_add_device(shost, myrb_logical_channel(shost),
 412                                        ldev_num, 0);
 413                        continue;
 414                }
 415                old = sdev->hostdata;
 416                if (new->state != old->state)
 417                        shost_printk(KERN_INFO, shost,
 418                                     "Logical Drive %d is now %s\n",
 419                                     ldev_num, myrb_devstate_name(new->state));
 420                if (new->wb_enabled != old->wb_enabled)
 421                        sdev_printk(KERN_INFO, sdev,
 422                                    "Logical Drive is now WRITE %s\n",
 423                                    (new->wb_enabled ? "BACK" : "THRU"));
 424                memcpy(old, new, sizeof(*new));
 425                scsi_device_put(sdev);
 426        }
 427        return status;
 428}
 429
 430/*
 431 * myrb_get_rbld_progress - get rebuild progress information
 432 *
 433 * Executes a type 3 command and returns the rebuild progress
 434 * information.
 435 *
 436 * Return: command status
 437 */
 438static unsigned short myrb_get_rbld_progress(struct myrb_hba *cb,
 439                struct myrb_rbld_progress *rbld)
 440{
 441        struct myrb_cmdblk *cmd_blk = &cb->mcmd_blk;
 442        union myrb_cmd_mbox *mbox = &cmd_blk->mbox;
 443        struct myrb_rbld_progress *rbld_buf;
 444        dma_addr_t rbld_addr;
 445        unsigned short status;
 446
 447        rbld_buf = dma_alloc_coherent(&cb->pdev->dev,
 448                                      sizeof(struct myrb_rbld_progress),
 449                                      &rbld_addr, GFP_KERNEL);
 450        if (!rbld_buf)
 451                return MYRB_STATUS_RBLD_NOT_CHECKED;
 452
 453        myrb_reset_cmd(cmd_blk);
 454        mbox->type3.id = MYRB_MCMD_TAG;
 455        mbox->type3.opcode = MYRB_CMD_GET_REBUILD_PROGRESS;
 456        mbox->type3.addr = rbld_addr;
 457        status = myrb_exec_cmd(cb, cmd_blk);
 458        if (rbld)
 459                memcpy(rbld, rbld_buf, sizeof(struct myrb_rbld_progress));
 460        dma_free_coherent(&cb->pdev->dev, sizeof(struct myrb_rbld_progress),
 461                          rbld_buf, rbld_addr);
 462        return status;
 463}
 464
 465/*
 466 * myrb_update_rbld_progress - updates the rebuild status
 467 *
 468 * Updates the rebuild status for the attached logical devices.
 469 */
 470static void myrb_update_rbld_progress(struct myrb_hba *cb)
 471{
 472        struct myrb_rbld_progress rbld_buf;
 473        unsigned short status;
 474
 475        status = myrb_get_rbld_progress(cb, &rbld_buf);
 476        if (status == MYRB_NO_STDBY_RBLD_OR_CHECK_IN_PROGRESS &&
 477            cb->last_rbld_status == MYRB_STATUS_SUCCESS)
 478                status = MYRB_STATUS_RBLD_SUCCESS;
 479        if (status != MYRB_NO_STDBY_RBLD_OR_CHECK_IN_PROGRESS) {
 480                unsigned int blocks_done =
 481                        rbld_buf.ldev_size - rbld_buf.blocks_left;
 482                struct scsi_device *sdev;
 483
 484                sdev = scsi_device_lookup(cb->host,
 485                                          myrb_logical_channel(cb->host),
 486                                          rbld_buf.ldev_num, 0);
 487                if (!sdev)
 488                        return;
 489
 490                switch (status) {
 491                case MYRB_STATUS_SUCCESS:
 492                        sdev_printk(KERN_INFO, sdev,
 493                                    "Rebuild in Progress, %d%% completed\n",
 494                                    (100 * (blocks_done >> 7))
 495                                    / (rbld_buf.ldev_size >> 7));
 496                        break;
 497                case MYRB_STATUS_RBLD_FAILED_LDEV_FAILURE:
 498                        sdev_printk(KERN_INFO, sdev,
 499                                    "Rebuild Failed due to Logical Drive Failure\n");
 500                        break;
 501                case MYRB_STATUS_RBLD_FAILED_BADBLOCKS:
 502                        sdev_printk(KERN_INFO, sdev,
 503                                    "Rebuild Failed due to Bad Blocks on Other Drives\n");
 504                        break;
 505                case MYRB_STATUS_RBLD_FAILED_NEW_DRIVE_FAILED:
 506                        sdev_printk(KERN_INFO, sdev,
 507                                    "Rebuild Failed due to Failure of Drive Being Rebuilt\n");
 508                        break;
 509                case MYRB_STATUS_RBLD_SUCCESS:
 510                        sdev_printk(KERN_INFO, sdev,
 511                                    "Rebuild Completed Successfully\n");
 512                        break;
 513                case MYRB_STATUS_RBLD_SUCCESS_TERMINATED:
 514                        sdev_printk(KERN_INFO, sdev,
 515                                     "Rebuild Successfully Terminated\n");
 516                        break;
 517                default:
 518                        break;
 519                }
 520                scsi_device_put(sdev);
 521        }
 522        cb->last_rbld_status = status;
 523}
 524
 525/*
 526 * myrb_get_cc_progress - retrieve the rebuild status
 527 *
 528 * Execute a type 3 Command and fetch the rebuild / consistency check
 529 * status.
 530 */
 531static void myrb_get_cc_progress(struct myrb_hba *cb)
 532{
 533        struct myrb_cmdblk *cmd_blk = &cb->mcmd_blk;
 534        union myrb_cmd_mbox *mbox = &cmd_blk->mbox;
 535        struct myrb_rbld_progress *rbld_buf;
 536        dma_addr_t rbld_addr;
 537        unsigned short status;
 538
 539        rbld_buf = dma_alloc_coherent(&cb->pdev->dev,
 540                                      sizeof(struct myrb_rbld_progress),
 541                                      &rbld_addr, GFP_KERNEL);
 542        if (!rbld_buf) {
 543                cb->need_cc_status = true;
 544                return;
 545        }
 546        myrb_reset_cmd(cmd_blk);
 547        mbox->type3.id = MYRB_MCMD_TAG;
 548        mbox->type3.opcode = MYRB_CMD_REBUILD_STAT;
 549        mbox->type3.addr = rbld_addr;
 550        status = myrb_exec_cmd(cb, cmd_blk);
 551        if (status == MYRB_STATUS_SUCCESS) {
 552                unsigned int ldev_num = rbld_buf->ldev_num;
 553                unsigned int ldev_size = rbld_buf->ldev_size;
 554                unsigned int blocks_done =
 555                        ldev_size - rbld_buf->blocks_left;
 556                struct scsi_device *sdev;
 557
 558                sdev = scsi_device_lookup(cb->host,
 559                                          myrb_logical_channel(cb->host),
 560                                          ldev_num, 0);
 561                if (sdev) {
 562                        sdev_printk(KERN_INFO, sdev,
 563                                    "Consistency Check in Progress: %d%% completed\n",
 564                                    (100 * (blocks_done >> 7))
 565                                    / (ldev_size >> 7));
 566                        scsi_device_put(sdev);
 567                }
 568        }
 569        dma_free_coherent(&cb->pdev->dev, sizeof(struct myrb_rbld_progress),
 570                          rbld_buf, rbld_addr);
 571}
 572
 573/*
 574 * myrb_bgi_control - updates background initialisation status
 575 *
 576 * Executes a type 3B command and updates the background initialisation status
 577 */
 578static void myrb_bgi_control(struct myrb_hba *cb)
 579{
 580        struct myrb_cmdblk *cmd_blk = &cb->mcmd_blk;
 581        union myrb_cmd_mbox *mbox = &cmd_blk->mbox;
 582        struct myrb_bgi_status *bgi, *last_bgi;
 583        dma_addr_t bgi_addr;
 584        struct scsi_device *sdev = NULL;
 585        unsigned short status;
 586
 587        bgi = dma_alloc_coherent(&cb->pdev->dev, sizeof(struct myrb_bgi_status),
 588                                 &bgi_addr, GFP_KERNEL);
 589        if (!bgi) {
 590                shost_printk(KERN_ERR, cb->host,
 591                             "Failed to allocate bgi memory\n");
 592                return;
 593        }
 594        myrb_reset_cmd(cmd_blk);
 595        mbox->type3B.id = MYRB_DCMD_TAG;
 596        mbox->type3B.opcode = MYRB_CMD_BGI_CONTROL;
 597        mbox->type3B.optype = 0x20;
 598        mbox->type3B.addr = bgi_addr;
 599        status = myrb_exec_cmd(cb, cmd_blk);
 600        last_bgi = &cb->bgi_status;
 601        sdev = scsi_device_lookup(cb->host,
 602                                  myrb_logical_channel(cb->host),
 603                                  bgi->ldev_num, 0);
 604        switch (status) {
 605        case MYRB_STATUS_SUCCESS:
 606                switch (bgi->status) {
 607                case MYRB_BGI_INVALID:
 608                        break;
 609                case MYRB_BGI_STARTED:
 610                        if (!sdev)
 611                                break;
 612                        sdev_printk(KERN_INFO, sdev,
 613                                    "Background Initialization Started\n");
 614                        break;
 615                case MYRB_BGI_INPROGRESS:
 616                        if (!sdev)
 617                                break;
 618                        if (bgi->blocks_done == last_bgi->blocks_done &&
 619                            bgi->ldev_num == last_bgi->ldev_num)
 620                                break;
 621                        sdev_printk(KERN_INFO, sdev,
 622                                 "Background Initialization in Progress: %d%% completed\n",
 623                                 (100 * (bgi->blocks_done >> 7))
 624                                 / (bgi->ldev_size >> 7));
 625                        break;
 626                case MYRB_BGI_SUSPENDED:
 627                        if (!sdev)
 628                                break;
 629                        sdev_printk(KERN_INFO, sdev,
 630                                    "Background Initialization Suspended\n");
 631                        break;
 632                case MYRB_BGI_CANCELLED:
 633                        if (!sdev)
 634                                break;
 635                        sdev_printk(KERN_INFO, sdev,
 636                                    "Background Initialization Cancelled\n");
 637                        break;
 638                }
 639                memcpy(&cb->bgi_status, bgi, sizeof(struct myrb_bgi_status));
 640                break;
 641        case MYRB_STATUS_BGI_SUCCESS:
 642                if (sdev && cb->bgi_status.status == MYRB_BGI_INPROGRESS)
 643                        sdev_printk(KERN_INFO, sdev,
 644                                    "Background Initialization Completed Successfully\n");
 645                cb->bgi_status.status = MYRB_BGI_INVALID;
 646                break;
 647        case MYRB_STATUS_BGI_ABORTED:
 648                if (sdev && cb->bgi_status.status == MYRB_BGI_INPROGRESS)
 649                        sdev_printk(KERN_INFO, sdev,
 650                                    "Background Initialization Aborted\n");
 651                fallthrough;
 652        case MYRB_STATUS_NO_BGI_INPROGRESS:
 653                cb->bgi_status.status = MYRB_BGI_INVALID;
 654                break;
 655        }
 656        if (sdev)
 657                scsi_device_put(sdev);
 658        dma_free_coherent(&cb->pdev->dev, sizeof(struct myrb_bgi_status),
 659                          bgi, bgi_addr);
 660}
 661
 662/*
 663 * myrb_hba_enquiry - updates the controller status
 664 *
 665 * Executes a DAC_V1_Enquiry command and updates the controller status.
 666 *
 667 * Return: command status
 668 */
 669static unsigned short myrb_hba_enquiry(struct myrb_hba *cb)
 670{
 671        struct myrb_enquiry old, *new;
 672        unsigned short status;
 673
 674        memcpy(&old, cb->enquiry, sizeof(struct myrb_enquiry));
 675
 676        status = myrb_exec_type3(cb, MYRB_CMD_ENQUIRY, cb->enquiry_addr);
 677        if (status != MYRB_STATUS_SUCCESS)
 678                return status;
 679
 680        new = cb->enquiry;
 681        if (new->ldev_count > old.ldev_count) {
 682                int ldev_num = old.ldev_count - 1;
 683
 684                while (++ldev_num < new->ldev_count)
 685                        shost_printk(KERN_CRIT, cb->host,
 686                                     "Logical Drive %d Now Exists\n",
 687                                     ldev_num);
 688        }
 689        if (new->ldev_count < old.ldev_count) {
 690                int ldev_num = new->ldev_count - 1;
 691
 692                while (++ldev_num < old.ldev_count)
 693                        shost_printk(KERN_CRIT, cb->host,
 694                                     "Logical Drive %d No Longer Exists\n",
 695                                     ldev_num);
 696        }
 697        if (new->status.deferred != old.status.deferred)
 698                shost_printk(KERN_CRIT, cb->host,
 699                             "Deferred Write Error Flag is now %s\n",
 700                             (new->status.deferred ? "TRUE" : "FALSE"));
 701        if (new->ev_seq != old.ev_seq) {
 702                cb->new_ev_seq = new->ev_seq;
 703                cb->need_err_info = true;
 704                shost_printk(KERN_INFO, cb->host,
 705                             "Event log %d/%d (%d/%d) available\n",
 706                             cb->old_ev_seq, cb->new_ev_seq,
 707                             old.ev_seq, new->ev_seq);
 708        }
 709        if ((new->ldev_critical > 0 &&
 710             new->ldev_critical != old.ldev_critical) ||
 711            (new->ldev_offline > 0 &&
 712             new->ldev_offline != old.ldev_offline) ||
 713            (new->ldev_count != old.ldev_count)) {
 714                shost_printk(KERN_INFO, cb->host,
 715                             "Logical drive count changed (%d/%d/%d)\n",
 716                             new->ldev_critical,
 717                             new->ldev_offline,
 718                             new->ldev_count);
 719                cb->need_ldev_info = true;
 720        }
 721        if (new->pdev_dead > 0 ||
 722            new->pdev_dead != old.pdev_dead ||
 723            time_after_eq(jiffies, cb->secondary_monitor_time
 724                          + MYRB_SECONDARY_MONITOR_INTERVAL)) {
 725                cb->need_bgi_status = cb->bgi_status_supported;
 726                cb->secondary_monitor_time = jiffies;
 727        }
 728        if (new->rbld == MYRB_STDBY_RBLD_IN_PROGRESS ||
 729            new->rbld == MYRB_BG_RBLD_IN_PROGRESS ||
 730            old.rbld == MYRB_STDBY_RBLD_IN_PROGRESS ||
 731            old.rbld == MYRB_BG_RBLD_IN_PROGRESS) {
 732                cb->need_rbld = true;
 733                cb->rbld_first = (new->ldev_critical < old.ldev_critical);
 734        }
 735        if (old.rbld == MYRB_BG_CHECK_IN_PROGRESS)
 736                switch (new->rbld) {
 737                case MYRB_NO_STDBY_RBLD_OR_CHECK_IN_PROGRESS:
 738                        shost_printk(KERN_INFO, cb->host,
 739                                     "Consistency Check Completed Successfully\n");
 740                        break;
 741                case MYRB_STDBY_RBLD_IN_PROGRESS:
 742                case MYRB_BG_RBLD_IN_PROGRESS:
 743                        break;
 744                case MYRB_BG_CHECK_IN_PROGRESS:
 745                        cb->need_cc_status = true;
 746                        break;
 747                case MYRB_STDBY_RBLD_COMPLETED_WITH_ERROR:
 748                        shost_printk(KERN_INFO, cb->host,
 749                                     "Consistency Check Completed with Error\n");
 750                        break;
 751                case MYRB_BG_RBLD_OR_CHECK_FAILED_DRIVE_FAILED:
 752                        shost_printk(KERN_INFO, cb->host,
 753                                     "Consistency Check Failed - Physical Device Failed\n");
 754                        break;
 755                case MYRB_BG_RBLD_OR_CHECK_FAILED_LDEV_FAILED:
 756                        shost_printk(KERN_INFO, cb->host,
 757                                     "Consistency Check Failed - Logical Drive Failed\n");
 758                        break;
 759                case MYRB_BG_RBLD_OR_CHECK_FAILED_OTHER:
 760                        shost_printk(KERN_INFO, cb->host,
 761                                     "Consistency Check Failed - Other Causes\n");
 762                        break;
 763                case MYRB_BG_RBLD_OR_CHECK_SUCCESS_TERMINATED:
 764                        shost_printk(KERN_INFO, cb->host,
 765                                     "Consistency Check Successfully Terminated\n");
 766                        break;
 767                }
 768        else if (new->rbld == MYRB_BG_CHECK_IN_PROGRESS)
 769                cb->need_cc_status = true;
 770
 771        return MYRB_STATUS_SUCCESS;
 772}
 773
 774/*
 775 * myrb_set_pdev_state - sets the device state for a physical device
 776 *
 777 * Return: command status
 778 */
 779static unsigned short myrb_set_pdev_state(struct myrb_hba *cb,
 780                struct scsi_device *sdev, enum myrb_devstate state)
 781{
 782        struct myrb_cmdblk *cmd_blk = &cb->dcmd_blk;
 783        union myrb_cmd_mbox *mbox = &cmd_blk->mbox;
 784        unsigned short status;
 785
 786        mutex_lock(&cb->dcmd_mutex);
 787        mbox->type3D.opcode = MYRB_CMD_START_DEVICE;
 788        mbox->type3D.id = MYRB_DCMD_TAG;
 789        mbox->type3D.channel = sdev->channel;
 790        mbox->type3D.target = sdev->id;
 791        mbox->type3D.state = state & 0x1F;
 792        status = myrb_exec_cmd(cb, cmd_blk);
 793        mutex_unlock(&cb->dcmd_mutex);
 794
 795        return status;
 796}
 797
 798/*
 799 * myrb_enable_mmio - enables the Memory Mailbox Interface
 800 *
 801 * PD and P controller types have no memory mailbox, but still need the
 802 * other dma mapped memory.
 803 *
 804 * Return: true on success, false otherwise.
 805 */
 806static bool myrb_enable_mmio(struct myrb_hba *cb, mbox_mmio_init_t mmio_init_fn)
 807{
 808        void __iomem *base = cb->io_base;
 809        struct pci_dev *pdev = cb->pdev;
 810        size_t err_table_size;
 811        size_t ldev_info_size;
 812        union myrb_cmd_mbox *cmd_mbox_mem;
 813        struct myrb_stat_mbox *stat_mbox_mem;
 814        union myrb_cmd_mbox mbox;
 815        unsigned short status;
 816
 817        memset(&mbox, 0, sizeof(union myrb_cmd_mbox));
 818
 819        if (dma_set_mask(&pdev->dev, DMA_BIT_MASK(32))) {
 820                dev_err(&pdev->dev, "DMA mask out of range\n");
 821                return false;
 822        }
 823
 824        cb->enquiry = dma_alloc_coherent(&pdev->dev,
 825                                         sizeof(struct myrb_enquiry),
 826                                         &cb->enquiry_addr, GFP_KERNEL);
 827        if (!cb->enquiry)
 828                return false;
 829
 830        err_table_size = sizeof(struct myrb_error_entry) *
 831                MYRB_MAX_CHANNELS * MYRB_MAX_TARGETS;
 832        cb->err_table = dma_alloc_coherent(&pdev->dev, err_table_size,
 833                                           &cb->err_table_addr, GFP_KERNEL);
 834        if (!cb->err_table)
 835                return false;
 836
 837        ldev_info_size = sizeof(struct myrb_ldev_info) * MYRB_MAX_LDEVS;
 838        cb->ldev_info_buf = dma_alloc_coherent(&pdev->dev, ldev_info_size,
 839                                               &cb->ldev_info_addr, GFP_KERNEL);
 840        if (!cb->ldev_info_buf)
 841                return false;
 842
 843        /*
 844         * Skip mailbox initialisation for PD and P Controllers
 845         */
 846        if (!mmio_init_fn)
 847                return true;
 848
 849        /* These are the base addresses for the command memory mailbox array */
 850        cb->cmd_mbox_size =  MYRB_CMD_MBOX_COUNT * sizeof(union myrb_cmd_mbox);
 851        cb->first_cmd_mbox = dma_alloc_coherent(&pdev->dev,
 852                                                cb->cmd_mbox_size,
 853                                                &cb->cmd_mbox_addr,
 854                                                GFP_KERNEL);
 855        if (!cb->first_cmd_mbox)
 856                return false;
 857
 858        cmd_mbox_mem = cb->first_cmd_mbox;
 859        cmd_mbox_mem += MYRB_CMD_MBOX_COUNT - 1;
 860        cb->last_cmd_mbox = cmd_mbox_mem;
 861        cb->next_cmd_mbox = cb->first_cmd_mbox;
 862        cb->prev_cmd_mbox1 = cb->last_cmd_mbox;
 863        cb->prev_cmd_mbox2 = cb->last_cmd_mbox - 1;
 864
 865        /* These are the base addresses for the status memory mailbox array */
 866        cb->stat_mbox_size = MYRB_STAT_MBOX_COUNT *
 867            sizeof(struct myrb_stat_mbox);
 868        cb->first_stat_mbox = dma_alloc_coherent(&pdev->dev,
 869                                                 cb->stat_mbox_size,
 870                                                 &cb->stat_mbox_addr,
 871                                                 GFP_KERNEL);
 872        if (!cb->first_stat_mbox)
 873                return false;
 874
 875        stat_mbox_mem = cb->first_stat_mbox;
 876        stat_mbox_mem += MYRB_STAT_MBOX_COUNT - 1;
 877        cb->last_stat_mbox = stat_mbox_mem;
 878        cb->next_stat_mbox = cb->first_stat_mbox;
 879
 880        /* Enable the Memory Mailbox Interface. */
 881        cb->dual_mode_interface = true;
 882        mbox.typeX.opcode = 0x2B;
 883        mbox.typeX.id = 0;
 884        mbox.typeX.opcode2 = 0x14;
 885        mbox.typeX.cmd_mbox_addr = cb->cmd_mbox_addr;
 886        mbox.typeX.stat_mbox_addr = cb->stat_mbox_addr;
 887
 888        status = mmio_init_fn(pdev, base, &mbox);
 889        if (status != MYRB_STATUS_SUCCESS) {
 890                cb->dual_mode_interface = false;
 891                mbox.typeX.opcode2 = 0x10;
 892                status = mmio_init_fn(pdev, base, &mbox);
 893                if (status != MYRB_STATUS_SUCCESS) {
 894                        dev_err(&pdev->dev,
 895                                "Failed to enable mailbox, statux %02X\n",
 896                                status);
 897                        return false;
 898                }
 899        }
 900        return true;
 901}
 902
 903/*
 904 * myrb_get_hba_config - reads the configuration information
 905 *
 906 * Reads the configuration information from the controller and
 907 * initializes the controller structure.
 908 *
 909 * Return: 0 on success, errno otherwise
 910 */
 911static int myrb_get_hba_config(struct myrb_hba *cb)
 912{
 913        struct myrb_enquiry2 *enquiry2;
 914        dma_addr_t enquiry2_addr;
 915        struct myrb_config2 *config2;
 916        dma_addr_t config2_addr;
 917        struct Scsi_Host *shost = cb->host;
 918        struct pci_dev *pdev = cb->pdev;
 919        int pchan_max = 0, pchan_cur = 0;
 920        unsigned short status;
 921        int ret = -ENODEV, memsize = 0;
 922
 923        enquiry2 = dma_alloc_coherent(&pdev->dev, sizeof(struct myrb_enquiry2),
 924                                      &enquiry2_addr, GFP_KERNEL);
 925        if (!enquiry2) {
 926                shost_printk(KERN_ERR, cb->host,
 927                             "Failed to allocate V1 enquiry2 memory\n");
 928                return -ENOMEM;
 929        }
 930        config2 = dma_alloc_coherent(&pdev->dev, sizeof(struct myrb_config2),
 931                                     &config2_addr, GFP_KERNEL);
 932        if (!config2) {
 933                shost_printk(KERN_ERR, cb->host,
 934                             "Failed to allocate V1 config2 memory\n");
 935                dma_free_coherent(&pdev->dev, sizeof(struct myrb_enquiry2),
 936                                  enquiry2, enquiry2_addr);
 937                return -ENOMEM;
 938        }
 939        mutex_lock(&cb->dma_mutex);
 940        status = myrb_hba_enquiry(cb);
 941        mutex_unlock(&cb->dma_mutex);
 942        if (status != MYRB_STATUS_SUCCESS) {
 943                shost_printk(KERN_WARNING, cb->host,
 944                             "Failed it issue V1 Enquiry\n");
 945                goto out_free;
 946        }
 947
 948        status = myrb_exec_type3(cb, MYRB_CMD_ENQUIRY2, enquiry2_addr);
 949        if (status != MYRB_STATUS_SUCCESS) {
 950                shost_printk(KERN_WARNING, cb->host,
 951                             "Failed to issue V1 Enquiry2\n");
 952                goto out_free;
 953        }
 954
 955        status = myrb_exec_type3(cb, MYRB_CMD_READ_CONFIG2, config2_addr);
 956        if (status != MYRB_STATUS_SUCCESS) {
 957                shost_printk(KERN_WARNING, cb->host,
 958                             "Failed to issue ReadConfig2\n");
 959                goto out_free;
 960        }
 961
 962        status = myrb_get_ldev_info(cb);
 963        if (status != MYRB_STATUS_SUCCESS) {
 964                shost_printk(KERN_WARNING, cb->host,
 965                             "Failed to get logical drive information\n");
 966                goto out_free;
 967        }
 968
 969        /*
 970         * Initialize the Controller Model Name and Full Model Name fields.
 971         */
 972        switch (enquiry2->hw.sub_model) {
 973        case DAC960_V1_P_PD_PU:
 974                if (enquiry2->scsi_cap.bus_speed == MYRB_SCSI_SPEED_ULTRA)
 975                        strcpy(cb->model_name, "DAC960PU");
 976                else
 977                        strcpy(cb->model_name, "DAC960PD");
 978                break;
 979        case DAC960_V1_PL:
 980                strcpy(cb->model_name, "DAC960PL");
 981                break;
 982        case DAC960_V1_PG:
 983                strcpy(cb->model_name, "DAC960PG");
 984                break;
 985        case DAC960_V1_PJ:
 986                strcpy(cb->model_name, "DAC960PJ");
 987                break;
 988        case DAC960_V1_PR:
 989                strcpy(cb->model_name, "DAC960PR");
 990                break;
 991        case DAC960_V1_PT:
 992                strcpy(cb->model_name, "DAC960PT");
 993                break;
 994        case DAC960_V1_PTL0:
 995                strcpy(cb->model_name, "DAC960PTL0");
 996                break;
 997        case DAC960_V1_PRL:
 998                strcpy(cb->model_name, "DAC960PRL");
 999                break;
1000        case DAC960_V1_PTL1:
1001                strcpy(cb->model_name, "DAC960PTL1");
1002                break;
1003        case DAC960_V1_1164P:
1004                strcpy(cb->model_name, "eXtremeRAID 1100");
1005                break;
1006        default:
1007                shost_printk(KERN_WARNING, cb->host,
1008                             "Unknown Model %X\n",
1009                             enquiry2->hw.sub_model);
1010                goto out;
1011        }
1012        /*
1013         * Initialize the Controller Firmware Version field and verify that it
1014         * is a supported firmware version.
1015         * The supported firmware versions are:
1016         *
1017         * DAC1164P                 5.06 and above
1018         * DAC960PTL/PRL/PJ/PG      4.06 and above
1019         * DAC960PU/PD/PL           3.51 and above
1020         * DAC960PU/PD/PL/P         2.73 and above
1021         */
1022#if defined(CONFIG_ALPHA)
1023        /*
1024         * DEC Alpha machines were often equipped with DAC960 cards that were
1025         * OEMed from Mylex, and had their own custom firmware. Version 2.70,
1026         * the last custom FW revision to be released by DEC for these older
1027         * controllers, appears to work quite well with this driver.
1028         *
1029         * Cards tested successfully were several versions each of the PD and
1030         * PU, called by DEC the KZPSC and KZPAC, respectively, and having
1031         * the Manufacturer Numbers (from Mylex), usually on a sticker on the
1032         * back of the board, of:
1033         *
1034         * KZPSC:  D040347 (1-channel) or D040348 (2-channel)
1035         *         or D040349 (3-channel)
1036         * KZPAC:  D040395 (1-channel) or D040396 (2-channel)
1037         *         or D040397 (3-channel)
1038         */
1039# define FIRMWARE_27X   "2.70"
1040#else
1041# define FIRMWARE_27X   "2.73"
1042#endif
1043
1044        if (enquiry2->fw.major_version == 0) {
1045                enquiry2->fw.major_version = cb->enquiry->fw_major_version;
1046                enquiry2->fw.minor_version = cb->enquiry->fw_minor_version;
1047                enquiry2->fw.firmware_type = '0';
1048                enquiry2->fw.turn_id = 0;
1049        }
1050        snprintf(cb->fw_version, sizeof(cb->fw_version),
1051                "%u.%02u-%c-%02u",
1052                enquiry2->fw.major_version,
1053                enquiry2->fw.minor_version,
1054                enquiry2->fw.firmware_type,
1055                enquiry2->fw.turn_id);
1056        if (!((enquiry2->fw.major_version == 5 &&
1057               enquiry2->fw.minor_version >= 6) ||
1058              (enquiry2->fw.major_version == 4 &&
1059               enquiry2->fw.minor_version >= 6) ||
1060              (enquiry2->fw.major_version == 3 &&
1061               enquiry2->fw.minor_version >= 51) ||
1062              (enquiry2->fw.major_version == 2 &&
1063               strcmp(cb->fw_version, FIRMWARE_27X) >= 0))) {
1064                shost_printk(KERN_WARNING, cb->host,
1065                        "Firmware Version '%s' unsupported\n",
1066                        cb->fw_version);
1067                goto out;
1068        }
1069        /*
1070         * Initialize the Channels, Targets, Memory Size, and SAF-TE
1071         * Enclosure Management Enabled fields.
1072         */
1073        switch (enquiry2->hw.model) {
1074        case MYRB_5_CHANNEL_BOARD:
1075                pchan_max = 5;
1076                break;
1077        case MYRB_3_CHANNEL_BOARD:
1078        case MYRB_3_CHANNEL_ASIC_DAC:
1079                pchan_max = 3;
1080                break;
1081        case MYRB_2_CHANNEL_BOARD:
1082                pchan_max = 2;
1083                break;
1084        default:
1085                pchan_max = enquiry2->cfg_chan;
1086                break;
1087        }
1088        pchan_cur = enquiry2->cur_chan;
1089        if (enquiry2->scsi_cap.bus_width == MYRB_WIDTH_WIDE_32BIT)
1090                cb->bus_width = 32;
1091        else if (enquiry2->scsi_cap.bus_width == MYRB_WIDTH_WIDE_16BIT)
1092                cb->bus_width = 16;
1093        else
1094                cb->bus_width = 8;
1095        cb->ldev_block_size = enquiry2->ldev_block_size;
1096        shost->max_channel = pchan_cur;
1097        shost->max_id = enquiry2->max_targets;
1098        memsize = enquiry2->mem_size >> 20;
1099        cb->safte_enabled = (enquiry2->fault_mgmt == MYRB_FAULT_SAFTE);
1100        /*
1101         * Initialize the Controller Queue Depth, Driver Queue Depth,
1102         * Logical Drive Count, Maximum Blocks per Command, Controller
1103         * Scatter/Gather Limit, and Driver Scatter/Gather Limit.
1104         * The Driver Queue Depth must be at most one less than the
1105         * Controller Queue Depth to allow for an automatic drive
1106         * rebuild operation.
1107         */
1108        shost->can_queue = cb->enquiry->max_tcq;
1109        if (shost->can_queue < 3)
1110                shost->can_queue = enquiry2->max_cmds;
1111        if (shost->can_queue < 3)
1112                /* Play safe and disable TCQ */
1113                shost->can_queue = 1;
1114
1115        if (shost->can_queue > MYRB_CMD_MBOX_COUNT - 2)
1116                shost->can_queue = MYRB_CMD_MBOX_COUNT - 2;
1117        shost->max_sectors = enquiry2->max_sectors;
1118        shost->sg_tablesize = enquiry2->max_sge;
1119        if (shost->sg_tablesize > MYRB_SCATTER_GATHER_LIMIT)
1120                shost->sg_tablesize = MYRB_SCATTER_GATHER_LIMIT;
1121        /*
1122         * Initialize the Stripe Size, Segment Size, and Geometry Translation.
1123         */
1124        cb->stripe_size = config2->blocks_per_stripe * config2->block_factor
1125                >> (10 - MYRB_BLKSIZE_BITS);
1126        cb->segment_size = config2->blocks_per_cacheline * config2->block_factor
1127                >> (10 - MYRB_BLKSIZE_BITS);
1128        /* Assume 255/63 translation */
1129        cb->ldev_geom_heads = 255;
1130        cb->ldev_geom_sectors = 63;
1131        if (config2->drive_geometry) {
1132                cb->ldev_geom_heads = 128;
1133                cb->ldev_geom_sectors = 32;
1134        }
1135
1136        /*
1137         * Initialize the Background Initialization Status.
1138         */
1139        if ((cb->fw_version[0] == '4' &&
1140             strcmp(cb->fw_version, "4.08") >= 0) ||
1141            (cb->fw_version[0] == '5' &&
1142             strcmp(cb->fw_version, "5.08") >= 0)) {
1143                cb->bgi_status_supported = true;
1144                myrb_bgi_control(cb);
1145        }
1146        cb->last_rbld_status = MYRB_NO_STDBY_RBLD_OR_CHECK_IN_PROGRESS;
1147        ret = 0;
1148
1149out:
1150        shost_printk(KERN_INFO, cb->host,
1151                "Configuring %s PCI RAID Controller\n", cb->model_name);
1152        shost_printk(KERN_INFO, cb->host,
1153                "  Firmware Version: %s, Memory Size: %dMB\n",
1154                cb->fw_version, memsize);
1155        if (cb->io_addr == 0)
1156                shost_printk(KERN_INFO, cb->host,
1157                        "  I/O Address: n/a, PCI Address: 0x%lX, IRQ Channel: %d\n",
1158                        (unsigned long)cb->pci_addr, cb->irq);
1159        else
1160                shost_printk(KERN_INFO, cb->host,
1161                        "  I/O Address: 0x%lX, PCI Address: 0x%lX, IRQ Channel: %d\n",
1162                        (unsigned long)cb->io_addr, (unsigned long)cb->pci_addr,
1163                        cb->irq);
1164        shost_printk(KERN_INFO, cb->host,
1165                "  Controller Queue Depth: %d, Maximum Blocks per Command: %d\n",
1166                cb->host->can_queue, cb->host->max_sectors);
1167        shost_printk(KERN_INFO, cb->host,
1168                     "  Driver Queue Depth: %d, Scatter/Gather Limit: %d of %d Segments\n",
1169                     cb->host->can_queue, cb->host->sg_tablesize,
1170                     MYRB_SCATTER_GATHER_LIMIT);
1171        shost_printk(KERN_INFO, cb->host,
1172                     "  Stripe Size: %dKB, Segment Size: %dKB, BIOS Geometry: %d/%d%s\n",
1173                     cb->stripe_size, cb->segment_size,
1174                     cb->ldev_geom_heads, cb->ldev_geom_sectors,
1175                     cb->safte_enabled ?
1176                     "  SAF-TE Enclosure Management Enabled" : "");
1177        shost_printk(KERN_INFO, cb->host,
1178                     "  Physical: %d/%d channels %d/%d/%d devices\n",
1179                     pchan_cur, pchan_max, 0, cb->enquiry->pdev_dead,
1180                     cb->host->max_id);
1181
1182        shost_printk(KERN_INFO, cb->host,
1183                     "  Logical: 1/1 channels, %d/%d disks\n",
1184                     cb->enquiry->ldev_count, MYRB_MAX_LDEVS);
1185
1186out_free:
1187        dma_free_coherent(&pdev->dev, sizeof(struct myrb_enquiry2),
1188                          enquiry2, enquiry2_addr);
1189        dma_free_coherent(&pdev->dev, sizeof(struct myrb_config2),
1190                          config2, config2_addr);
1191
1192        return ret;
1193}
1194
1195/*
1196 * myrb_unmap - unmaps controller structures
1197 */
1198static void myrb_unmap(struct myrb_hba *cb)
1199{
1200        if (cb->ldev_info_buf) {
1201                size_t ldev_info_size = sizeof(struct myrb_ldev_info) *
1202                        MYRB_MAX_LDEVS;
1203                dma_free_coherent(&cb->pdev->dev, ldev_info_size,
1204                                  cb->ldev_info_buf, cb->ldev_info_addr);
1205                cb->ldev_info_buf = NULL;
1206        }
1207        if (cb->err_table) {
1208                size_t err_table_size = sizeof(struct myrb_error_entry) *
1209                        MYRB_MAX_CHANNELS * MYRB_MAX_TARGETS;
1210                dma_free_coherent(&cb->pdev->dev, err_table_size,
1211                                  cb->err_table, cb->err_table_addr);
1212                cb->err_table = NULL;
1213        }
1214        if (cb->enquiry) {
1215                dma_free_coherent(&cb->pdev->dev, sizeof(struct myrb_enquiry),
1216                                  cb->enquiry, cb->enquiry_addr);
1217                cb->enquiry = NULL;
1218        }
1219        if (cb->first_stat_mbox) {
1220                dma_free_coherent(&cb->pdev->dev, cb->stat_mbox_size,
1221                                  cb->first_stat_mbox, cb->stat_mbox_addr);
1222                cb->first_stat_mbox = NULL;
1223        }
1224        if (cb->first_cmd_mbox) {
1225                dma_free_coherent(&cb->pdev->dev, cb->cmd_mbox_size,
1226                                  cb->first_cmd_mbox, cb->cmd_mbox_addr);
1227                cb->first_cmd_mbox = NULL;
1228        }
1229}
1230
1231/*
1232 * myrb_cleanup - cleanup controller structures
1233 */
1234static void myrb_cleanup(struct myrb_hba *cb)
1235{
1236        struct pci_dev *pdev = cb->pdev;
1237
1238        /* Free the memory mailbox, status, and related structures */
1239        myrb_unmap(cb);
1240
1241        if (cb->mmio_base) {
1242                cb->disable_intr(cb->io_base);
1243                iounmap(cb->mmio_base);
1244        }
1245        if (cb->irq)
1246                free_irq(cb->irq, cb);
1247        if (cb->io_addr)
1248                release_region(cb->io_addr, 0x80);
1249        pci_set_drvdata(pdev, NULL);
1250        pci_disable_device(pdev);
1251        scsi_host_put(cb->host);
1252}
1253
1254static int myrb_host_reset(struct scsi_cmnd *scmd)
1255{
1256        struct Scsi_Host *shost = scmd->device->host;
1257        struct myrb_hba *cb = shost_priv(shost);
1258
1259        cb->reset(cb->io_base);
1260        return SUCCESS;
1261}
1262
1263static int myrb_pthru_queuecommand(struct Scsi_Host *shost,
1264                struct scsi_cmnd *scmd)
1265{
1266        struct myrb_hba *cb = shost_priv(shost);
1267        struct myrb_cmdblk *cmd_blk = scsi_cmd_priv(scmd);
1268        union myrb_cmd_mbox *mbox = &cmd_blk->mbox;
1269        struct myrb_dcdb *dcdb;
1270        dma_addr_t dcdb_addr;
1271        struct scsi_device *sdev = scmd->device;
1272        struct scatterlist *sgl;
1273        unsigned long flags;
1274        int nsge;
1275
1276        myrb_reset_cmd(cmd_blk);
1277        dcdb = dma_pool_alloc(cb->dcdb_pool, GFP_ATOMIC, &dcdb_addr);
1278        if (!dcdb)
1279                return SCSI_MLQUEUE_HOST_BUSY;
1280        nsge = scsi_dma_map(scmd);
1281        if (nsge > 1) {
1282                dma_pool_free(cb->dcdb_pool, dcdb, dcdb_addr);
1283                scmd->result = (DID_ERROR << 16);
1284                scmd->scsi_done(scmd);
1285                return 0;
1286        }
1287
1288        mbox->type3.opcode = MYRB_CMD_DCDB;
1289        mbox->type3.id = scmd->request->tag + 3;
1290        mbox->type3.addr = dcdb_addr;
1291        dcdb->channel = sdev->channel;
1292        dcdb->target = sdev->id;
1293        switch (scmd->sc_data_direction) {
1294        case DMA_NONE:
1295                dcdb->data_xfer = MYRB_DCDB_XFER_NONE;
1296                break;
1297        case DMA_TO_DEVICE:
1298                dcdb->data_xfer = MYRB_DCDB_XFER_SYSTEM_TO_DEVICE;
1299                break;
1300        case DMA_FROM_DEVICE:
1301                dcdb->data_xfer = MYRB_DCDB_XFER_DEVICE_TO_SYSTEM;
1302                break;
1303        default:
1304                dcdb->data_xfer = MYRB_DCDB_XFER_ILLEGAL;
1305                break;
1306        }
1307        dcdb->early_status = false;
1308        if (scmd->request->timeout <= 10)
1309                dcdb->timeout = MYRB_DCDB_TMO_10_SECS;
1310        else if (scmd->request->timeout <= 60)
1311                dcdb->timeout = MYRB_DCDB_TMO_60_SECS;
1312        else if (scmd->request->timeout <= 600)
1313                dcdb->timeout = MYRB_DCDB_TMO_10_MINS;
1314        else
1315                dcdb->timeout = MYRB_DCDB_TMO_24_HRS;
1316        dcdb->no_autosense = false;
1317        dcdb->allow_disconnect = true;
1318        sgl = scsi_sglist(scmd);
1319        dcdb->dma_addr = sg_dma_address(sgl);
1320        if (sg_dma_len(sgl) > USHRT_MAX) {
1321                dcdb->xfer_len_lo = sg_dma_len(sgl) & 0xffff;
1322                dcdb->xfer_len_hi4 = sg_dma_len(sgl) >> 16;
1323        } else {
1324                dcdb->xfer_len_lo = sg_dma_len(sgl);
1325                dcdb->xfer_len_hi4 = 0;
1326        }
1327        dcdb->cdb_len = scmd->cmd_len;
1328        dcdb->sense_len = sizeof(dcdb->sense);
1329        memcpy(&dcdb->cdb, scmd->cmnd, scmd->cmd_len);
1330
1331        spin_lock_irqsave(&cb->queue_lock, flags);
1332        cb->qcmd(cb, cmd_blk);
1333        spin_unlock_irqrestore(&cb->queue_lock, flags);
1334        return 0;
1335}
1336
1337static void myrb_inquiry(struct myrb_hba *cb,
1338                struct scsi_cmnd *scmd)
1339{
1340        unsigned char inq[36] = {
1341                0x00, 0x00, 0x03, 0x02, 0x20, 0x00, 0x01, 0x00,
1342                0x4d, 0x59, 0x4c, 0x45, 0x58, 0x20, 0x20, 0x20,
1343                0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
1344                0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
1345                0x20, 0x20, 0x20, 0x20,
1346        };
1347
1348        if (cb->bus_width > 16)
1349                inq[7] |= 1 << 6;
1350        if (cb->bus_width > 8)
1351                inq[7] |= 1 << 5;
1352        memcpy(&inq[16], cb->model_name, 16);
1353        memcpy(&inq[32], cb->fw_version, 1);
1354        memcpy(&inq[33], &cb->fw_version[2], 2);
1355        memcpy(&inq[35], &cb->fw_version[7], 1);
1356
1357        scsi_sg_copy_from_buffer(scmd, (void *)inq, 36);
1358}
1359
1360static void
1361myrb_mode_sense(struct myrb_hba *cb, struct scsi_cmnd *scmd,
1362                struct myrb_ldev_info *ldev_info)
1363{
1364        unsigned char modes[32], *mode_pg;
1365        bool dbd;
1366        size_t mode_len;
1367
1368        dbd = (scmd->cmnd[1] & 0x08) == 0x08;
1369        if (dbd) {
1370                mode_len = 24;
1371                mode_pg = &modes[4];
1372        } else {
1373                mode_len = 32;
1374                mode_pg = &modes[12];
1375        }
1376        memset(modes, 0, sizeof(modes));
1377        modes[0] = mode_len - 1;
1378        if (!dbd) {
1379                unsigned char *block_desc = &modes[4];
1380
1381                modes[3] = 8;
1382                put_unaligned_be32(ldev_info->size, &block_desc[0]);
1383                put_unaligned_be32(cb->ldev_block_size, &block_desc[5]);
1384        }
1385        mode_pg[0] = 0x08;
1386        mode_pg[1] = 0x12;
1387        if (ldev_info->wb_enabled)
1388                mode_pg[2] |= 0x04;
1389        if (cb->segment_size) {
1390                mode_pg[2] |= 0x08;
1391                put_unaligned_be16(cb->segment_size, &mode_pg[14]);
1392        }
1393
1394        scsi_sg_copy_from_buffer(scmd, modes, mode_len);
1395}
1396
1397static void myrb_request_sense(struct myrb_hba *cb,
1398                struct scsi_cmnd *scmd)
1399{
1400        scsi_build_sense(scmd, 0, NO_SENSE, 0, 0);
1401        scsi_sg_copy_from_buffer(scmd, scmd->sense_buffer,
1402                                 SCSI_SENSE_BUFFERSIZE);
1403}
1404
1405static void myrb_read_capacity(struct myrb_hba *cb, struct scsi_cmnd *scmd,
1406                struct myrb_ldev_info *ldev_info)
1407{
1408        unsigned char data[8];
1409
1410        dev_dbg(&scmd->device->sdev_gendev,
1411                "Capacity %u, blocksize %u\n",
1412                ldev_info->size, cb->ldev_block_size);
1413        put_unaligned_be32(ldev_info->size - 1, &data[0]);
1414        put_unaligned_be32(cb->ldev_block_size, &data[4]);
1415        scsi_sg_copy_from_buffer(scmd, data, 8);
1416}
1417
1418static int myrb_ldev_queuecommand(struct Scsi_Host *shost,
1419                struct scsi_cmnd *scmd)
1420{
1421        struct myrb_hba *cb = shost_priv(shost);
1422        struct myrb_cmdblk *cmd_blk = scsi_cmd_priv(scmd);
1423        union myrb_cmd_mbox *mbox = &cmd_blk->mbox;
1424        struct myrb_ldev_info *ldev_info;
1425        struct scsi_device *sdev = scmd->device;
1426        struct scatterlist *sgl;
1427        unsigned long flags;
1428        u64 lba;
1429        u32 block_cnt;
1430        int nsge;
1431
1432        ldev_info = sdev->hostdata;
1433        if (ldev_info->state != MYRB_DEVICE_ONLINE &&
1434            ldev_info->state != MYRB_DEVICE_WO) {
1435                dev_dbg(&shost->shost_gendev, "ldev %u in state %x, skip\n",
1436                        sdev->id, ldev_info ? ldev_info->state : 0xff);
1437                scmd->result = (DID_BAD_TARGET << 16);
1438                scmd->scsi_done(scmd);
1439                return 0;
1440        }
1441        switch (scmd->cmnd[0]) {
1442        case TEST_UNIT_READY:
1443                scmd->result = (DID_OK << 16);
1444                scmd->scsi_done(scmd);
1445                return 0;
1446        case INQUIRY:
1447                if (scmd->cmnd[1] & 1) {
1448                        /* Illegal request, invalid field in CDB */
1449                        scsi_build_sense(scmd, 0, ILLEGAL_REQUEST, 0x24, 0);
1450                } else {
1451                        myrb_inquiry(cb, scmd);
1452                        scmd->result = (DID_OK << 16);
1453                }
1454                scmd->scsi_done(scmd);
1455                return 0;
1456        case SYNCHRONIZE_CACHE:
1457                scmd->result = (DID_OK << 16);
1458                scmd->scsi_done(scmd);
1459                return 0;
1460        case MODE_SENSE:
1461                if ((scmd->cmnd[2] & 0x3F) != 0x3F &&
1462                    (scmd->cmnd[2] & 0x3F) != 0x08) {
1463                        /* Illegal request, invalid field in CDB */
1464                        scsi_build_sense(scmd, 0, ILLEGAL_REQUEST, 0x24, 0);
1465                } else {
1466                        myrb_mode_sense(cb, scmd, ldev_info);
1467                        scmd->result = (DID_OK << 16);
1468                }
1469                scmd->scsi_done(scmd);
1470                return 0;
1471        case READ_CAPACITY:
1472                if ((scmd->cmnd[1] & 1) ||
1473                    (scmd->cmnd[8] & 1)) {
1474                        /* Illegal request, invalid field in CDB */
1475                        scsi_build_sense(scmd, 0, ILLEGAL_REQUEST, 0x24, 0);
1476                        scmd->scsi_done(scmd);
1477                        return 0;
1478                }
1479                lba = get_unaligned_be32(&scmd->cmnd[2]);
1480                if (lba) {
1481                        /* Illegal request, invalid field in CDB */
1482                        scsi_build_sense(scmd, 0, ILLEGAL_REQUEST, 0x24, 0);
1483                        scmd->scsi_done(scmd);
1484                        return 0;
1485                }
1486                myrb_read_capacity(cb, scmd, ldev_info);
1487                scmd->scsi_done(scmd);
1488                return 0;
1489        case REQUEST_SENSE:
1490                myrb_request_sense(cb, scmd);
1491                scmd->result = (DID_OK << 16);
1492                return 0;
1493        case SEND_DIAGNOSTIC:
1494                if (scmd->cmnd[1] != 0x04) {
1495                        /* Illegal request, invalid field in CDB */
1496                        scsi_build_sense(scmd, 0, ILLEGAL_REQUEST, 0x24, 0);
1497                } else {
1498                        /* Assume good status */
1499                        scmd->result = (DID_OK << 16);
1500                }
1501                scmd->scsi_done(scmd);
1502                return 0;
1503        case READ_6:
1504                if (ldev_info->state == MYRB_DEVICE_WO) {
1505                        /* Data protect, attempt to read invalid data */
1506                        scsi_build_sense(scmd, 0, DATA_PROTECT, 0x21, 0x06);
1507                        scmd->scsi_done(scmd);
1508                        return 0;
1509                }
1510                fallthrough;
1511        case WRITE_6:
1512                lba = (((scmd->cmnd[1] & 0x1F) << 16) |
1513                       (scmd->cmnd[2] << 8) |
1514                       scmd->cmnd[3]);
1515                block_cnt = scmd->cmnd[4];
1516                break;
1517        case READ_10:
1518                if (ldev_info->state == MYRB_DEVICE_WO) {
1519                        /* Data protect, attempt to read invalid data */
1520                        scsi_build_sense(scmd, 0, DATA_PROTECT, 0x21, 0x06);
1521                        scmd->scsi_done(scmd);
1522                        return 0;
1523                }
1524                fallthrough;
1525        case WRITE_10:
1526        case VERIFY:            /* 0x2F */
1527        case WRITE_VERIFY:      /* 0x2E */
1528                lba = get_unaligned_be32(&scmd->cmnd[2]);
1529                block_cnt = get_unaligned_be16(&scmd->cmnd[7]);
1530                break;
1531        case READ_12:
1532                if (ldev_info->state == MYRB_DEVICE_WO) {
1533                        /* Data protect, attempt to read invalid data */
1534                        scsi_build_sense(scmd, 0, DATA_PROTECT, 0x21, 0x06);
1535                        scmd->scsi_done(scmd);
1536                        return 0;
1537                }
1538                fallthrough;
1539        case WRITE_12:
1540        case VERIFY_12: /* 0xAF */
1541        case WRITE_VERIFY_12:   /* 0xAE */
1542                lba = get_unaligned_be32(&scmd->cmnd[2]);
1543                block_cnt = get_unaligned_be32(&scmd->cmnd[6]);
1544                break;
1545        default:
1546                /* Illegal request, invalid opcode */
1547                scsi_build_sense(scmd, 0, ILLEGAL_REQUEST, 0x20, 0);
1548                scmd->scsi_done(scmd);
1549                return 0;
1550        }
1551
1552        myrb_reset_cmd(cmd_blk);
1553        mbox->type5.id = scmd->request->tag + 3;
1554        if (scmd->sc_data_direction == DMA_NONE)
1555                goto submit;
1556        nsge = scsi_dma_map(scmd);
1557        if (nsge == 1) {
1558                sgl = scsi_sglist(scmd);
1559                if (scmd->sc_data_direction == DMA_FROM_DEVICE)
1560                        mbox->type5.opcode = MYRB_CMD_READ;
1561                else
1562                        mbox->type5.opcode = MYRB_CMD_WRITE;
1563
1564                mbox->type5.ld.xfer_len = block_cnt;
1565                mbox->type5.ld.ldev_num = sdev->id;
1566                mbox->type5.lba = lba;
1567                mbox->type5.addr = (u32)sg_dma_address(sgl);
1568        } else {
1569                struct myrb_sge *hw_sgl;
1570                dma_addr_t hw_sgl_addr;
1571                int i;
1572
1573                hw_sgl = dma_pool_alloc(cb->sg_pool, GFP_ATOMIC, &hw_sgl_addr);
1574                if (!hw_sgl)
1575                        return SCSI_MLQUEUE_HOST_BUSY;
1576
1577                cmd_blk->sgl = hw_sgl;
1578                cmd_blk->sgl_addr = hw_sgl_addr;
1579
1580                if (scmd->sc_data_direction == DMA_FROM_DEVICE)
1581                        mbox->type5.opcode = MYRB_CMD_READ_SG;
1582                else
1583                        mbox->type5.opcode = MYRB_CMD_WRITE_SG;
1584
1585                mbox->type5.ld.xfer_len = block_cnt;
1586                mbox->type5.ld.ldev_num = sdev->id;
1587                mbox->type5.lba = lba;
1588                mbox->type5.addr = hw_sgl_addr;
1589                mbox->type5.sg_count = nsge;
1590
1591                scsi_for_each_sg(scmd, sgl, nsge, i) {
1592                        hw_sgl->sge_addr = (u32)sg_dma_address(sgl);
1593                        hw_sgl->sge_count = (u32)sg_dma_len(sgl);
1594                        hw_sgl++;
1595                }
1596        }
1597submit:
1598        spin_lock_irqsave(&cb->queue_lock, flags);
1599        cb->qcmd(cb, cmd_blk);
1600        spin_unlock_irqrestore(&cb->queue_lock, flags);
1601
1602        return 0;
1603}
1604
1605static int myrb_queuecommand(struct Scsi_Host *shost,
1606                struct scsi_cmnd *scmd)
1607{
1608        struct scsi_device *sdev = scmd->device;
1609
1610        if (sdev->channel > myrb_logical_channel(shost)) {
1611                scmd->result = (DID_BAD_TARGET << 16);
1612                scmd->scsi_done(scmd);
1613                return 0;
1614        }
1615        if (sdev->channel == myrb_logical_channel(shost))
1616                return myrb_ldev_queuecommand(shost, scmd);
1617
1618        return myrb_pthru_queuecommand(shost, scmd);
1619}
1620
1621static int myrb_ldev_slave_alloc(struct scsi_device *sdev)
1622{
1623        struct myrb_hba *cb = shost_priv(sdev->host);
1624        struct myrb_ldev_info *ldev_info;
1625        unsigned short ldev_num = sdev->id;
1626        enum raid_level level;
1627
1628        ldev_info = cb->ldev_info_buf + ldev_num;
1629        if (!ldev_info)
1630                return -ENXIO;
1631
1632        sdev->hostdata = kzalloc(sizeof(*ldev_info), GFP_KERNEL);
1633        if (!sdev->hostdata)
1634                return -ENOMEM;
1635        dev_dbg(&sdev->sdev_gendev,
1636                "slave alloc ldev %d state %x\n",
1637                ldev_num, ldev_info->state);
1638        memcpy(sdev->hostdata, ldev_info,
1639               sizeof(*ldev_info));
1640        switch (ldev_info->raid_level) {
1641        case MYRB_RAID_LEVEL0:
1642                level = RAID_LEVEL_LINEAR;
1643                break;
1644        case MYRB_RAID_LEVEL1:
1645                level = RAID_LEVEL_1;
1646                break;
1647        case MYRB_RAID_LEVEL3:
1648                level = RAID_LEVEL_3;
1649                break;
1650        case MYRB_RAID_LEVEL5:
1651                level = RAID_LEVEL_5;
1652                break;
1653        case MYRB_RAID_LEVEL6:
1654                level = RAID_LEVEL_6;
1655                break;
1656        case MYRB_RAID_JBOD:
1657                level = RAID_LEVEL_JBOD;
1658                break;
1659        default:
1660                level = RAID_LEVEL_UNKNOWN;
1661                break;
1662        }
1663        raid_set_level(myrb_raid_template, &sdev->sdev_gendev, level);
1664        return 0;
1665}
1666
1667static int myrb_pdev_slave_alloc(struct scsi_device *sdev)
1668{
1669        struct myrb_hba *cb = shost_priv(sdev->host);
1670        struct myrb_pdev_state *pdev_info;
1671        unsigned short status;
1672
1673        if (sdev->id > MYRB_MAX_TARGETS)
1674                return -ENXIO;
1675
1676        pdev_info = kzalloc(sizeof(*pdev_info), GFP_KERNEL|GFP_DMA);
1677        if (!pdev_info)
1678                return -ENOMEM;
1679
1680        status = myrb_exec_type3D(cb, MYRB_CMD_GET_DEVICE_STATE,
1681                                  sdev, pdev_info);
1682        if (status != MYRB_STATUS_SUCCESS) {
1683                dev_dbg(&sdev->sdev_gendev,
1684                        "Failed to get device state, status %x\n",
1685                        status);
1686                kfree(pdev_info);
1687                return -ENXIO;
1688        }
1689        if (!pdev_info->present) {
1690                dev_dbg(&sdev->sdev_gendev,
1691                        "device not present, skip\n");
1692                kfree(pdev_info);
1693                return -ENXIO;
1694        }
1695        dev_dbg(&sdev->sdev_gendev,
1696                "slave alloc pdev %d:%d state %x\n",
1697                sdev->channel, sdev->id, pdev_info->state);
1698        sdev->hostdata = pdev_info;
1699
1700        return 0;
1701}
1702
1703static int myrb_slave_alloc(struct scsi_device *sdev)
1704{
1705        if (sdev->channel > myrb_logical_channel(sdev->host))
1706                return -ENXIO;
1707
1708        if (sdev->lun > 0)
1709                return -ENXIO;
1710
1711        if (sdev->channel == myrb_logical_channel(sdev->host))
1712                return myrb_ldev_slave_alloc(sdev);
1713
1714        return myrb_pdev_slave_alloc(sdev);
1715}
1716
1717static int myrb_slave_configure(struct scsi_device *sdev)
1718{
1719        struct myrb_ldev_info *ldev_info;
1720
1721        if (sdev->channel > myrb_logical_channel(sdev->host))
1722                return -ENXIO;
1723
1724        if (sdev->channel < myrb_logical_channel(sdev->host)) {
1725                sdev->no_uld_attach = 1;
1726                return 0;
1727        }
1728        if (sdev->lun != 0)
1729                return -ENXIO;
1730
1731        ldev_info = sdev->hostdata;
1732        if (!ldev_info)
1733                return -ENXIO;
1734        if (ldev_info->state != MYRB_DEVICE_ONLINE)
1735                sdev_printk(KERN_INFO, sdev,
1736                            "Logical drive is %s\n",
1737                            myrb_devstate_name(ldev_info->state));
1738
1739        sdev->tagged_supported = 1;
1740        return 0;
1741}
1742
1743static void myrb_slave_destroy(struct scsi_device *sdev)
1744{
1745        kfree(sdev->hostdata);
1746}
1747
1748static int myrb_biosparam(struct scsi_device *sdev, struct block_device *bdev,
1749                sector_t capacity, int geom[])
1750{
1751        struct myrb_hba *cb = shost_priv(sdev->host);
1752
1753        geom[0] = cb->ldev_geom_heads;
1754        geom[1] = cb->ldev_geom_sectors;
1755        geom[2] = sector_div(capacity, geom[0] * geom[1]);
1756
1757        return 0;
1758}
1759
1760static ssize_t raid_state_show(struct device *dev,
1761                struct device_attribute *attr, char *buf)
1762{
1763        struct scsi_device *sdev = to_scsi_device(dev);
1764        struct myrb_hba *cb = shost_priv(sdev->host);
1765        int ret;
1766
1767        if (!sdev->hostdata)
1768                return snprintf(buf, 16, "Unknown\n");
1769
1770        if (sdev->channel == myrb_logical_channel(sdev->host)) {
1771                struct myrb_ldev_info *ldev_info = sdev->hostdata;
1772                const char *name;
1773
1774                name = myrb_devstate_name(ldev_info->state);
1775                if (name)
1776                        ret = snprintf(buf, 32, "%s\n", name);
1777                else
1778                        ret = snprintf(buf, 32, "Invalid (%02X)\n",
1779                                       ldev_info->state);
1780        } else {
1781                struct myrb_pdev_state *pdev_info = sdev->hostdata;
1782                unsigned short status;
1783                const char *name;
1784
1785                status = myrb_exec_type3D(cb, MYRB_CMD_GET_DEVICE_STATE,
1786                                          sdev, pdev_info);
1787                if (status != MYRB_STATUS_SUCCESS)
1788                        sdev_printk(KERN_INFO, sdev,
1789                                    "Failed to get device state, status %x\n",
1790                                    status);
1791
1792                if (!pdev_info->present)
1793                        name = "Removed";
1794                else
1795                        name = myrb_devstate_name(pdev_info->state);
1796                if (name)
1797                        ret = snprintf(buf, 32, "%s\n", name);
1798                else
1799                        ret = snprintf(buf, 32, "Invalid (%02X)\n",
1800                                       pdev_info->state);
1801        }
1802        return ret;
1803}
1804
1805static ssize_t raid_state_store(struct device *dev,
1806                struct device_attribute *attr, const char *buf, size_t count)
1807{
1808        struct scsi_device *sdev = to_scsi_device(dev);
1809        struct myrb_hba *cb = shost_priv(sdev->host);
1810        struct myrb_pdev_state *pdev_info;
1811        enum myrb_devstate new_state;
1812        unsigned short status;
1813
1814        if (!strncmp(buf, "kill", 4) ||
1815            !strncmp(buf, "offline", 7))
1816                new_state = MYRB_DEVICE_DEAD;
1817        else if (!strncmp(buf, "online", 6))
1818                new_state = MYRB_DEVICE_ONLINE;
1819        else if (!strncmp(buf, "standby", 7))
1820                new_state = MYRB_DEVICE_STANDBY;
1821        else
1822                return -EINVAL;
1823
1824        pdev_info = sdev->hostdata;
1825        if (!pdev_info) {
1826                sdev_printk(KERN_INFO, sdev,
1827                            "Failed - no physical device information\n");
1828                return -ENXIO;
1829        }
1830        if (!pdev_info->present) {
1831                sdev_printk(KERN_INFO, sdev,
1832                            "Failed - device not present\n");
1833                return -ENXIO;
1834        }
1835
1836        if (pdev_info->state == new_state)
1837                return count;
1838
1839        status = myrb_set_pdev_state(cb, sdev, new_state);
1840        switch (status) {
1841        case MYRB_STATUS_SUCCESS:
1842                break;
1843        case MYRB_STATUS_START_DEVICE_FAILED:
1844                sdev_printk(KERN_INFO, sdev,
1845                             "Failed - Unable to Start Device\n");
1846                count = -EAGAIN;
1847                break;
1848        case MYRB_STATUS_NO_DEVICE:
1849                sdev_printk(KERN_INFO, sdev,
1850                            "Failed - No Device at Address\n");
1851                count = -ENODEV;
1852                break;
1853        case MYRB_STATUS_INVALID_CHANNEL_OR_TARGET:
1854                sdev_printk(KERN_INFO, sdev,
1855                         "Failed - Invalid Channel or Target or Modifier\n");
1856                count = -EINVAL;
1857                break;
1858        case MYRB_STATUS_CHANNEL_BUSY:
1859                sdev_printk(KERN_INFO, sdev,
1860                         "Failed - Channel Busy\n");
1861                count = -EBUSY;
1862                break;
1863        default:
1864                sdev_printk(KERN_INFO, sdev,
1865                         "Failed - Unexpected Status %04X\n", status);
1866                count = -EIO;
1867                break;
1868        }
1869        return count;
1870}
1871static DEVICE_ATTR_RW(raid_state);
1872
1873static ssize_t raid_level_show(struct device *dev,
1874                struct device_attribute *attr, char *buf)
1875{
1876        struct scsi_device *sdev = to_scsi_device(dev);
1877
1878        if (sdev->channel == myrb_logical_channel(sdev->host)) {
1879                struct myrb_ldev_info *ldev_info = sdev->hostdata;
1880                const char *name;
1881
1882                if (!ldev_info)
1883                        return -ENXIO;
1884
1885                name = myrb_raidlevel_name(ldev_info->raid_level);
1886                if (!name)
1887                        return snprintf(buf, 32, "Invalid (%02X)\n",
1888                                        ldev_info->state);
1889                return snprintf(buf, 32, "%s\n", name);
1890        }
1891        return snprintf(buf, 32, "Physical Drive\n");
1892}
1893static DEVICE_ATTR_RO(raid_level);
1894
1895static ssize_t rebuild_show(struct device *dev,
1896                struct device_attribute *attr, char *buf)
1897{
1898        struct scsi_device *sdev = to_scsi_device(dev);
1899        struct myrb_hba *cb = shost_priv(sdev->host);
1900        struct myrb_rbld_progress rbld_buf;
1901        unsigned char status;
1902
1903        if (sdev->channel < myrb_logical_channel(sdev->host))
1904                return snprintf(buf, 32, "physical device - not rebuilding\n");
1905
1906        status = myrb_get_rbld_progress(cb, &rbld_buf);
1907
1908        if (rbld_buf.ldev_num != sdev->id ||
1909            status != MYRB_STATUS_SUCCESS)
1910                return snprintf(buf, 32, "not rebuilding\n");
1911
1912        return snprintf(buf, 32, "rebuilding block %u of %u\n",
1913                        rbld_buf.ldev_size - rbld_buf.blocks_left,
1914                        rbld_buf.ldev_size);
1915}
1916
1917static ssize_t rebuild_store(struct device *dev,
1918                struct device_attribute *attr, const char *buf, size_t count)
1919{
1920        struct scsi_device *sdev = to_scsi_device(dev);
1921        struct myrb_hba *cb = shost_priv(sdev->host);
1922        struct myrb_cmdblk *cmd_blk;
1923        union myrb_cmd_mbox *mbox;
1924        unsigned short status;
1925        int rc, start;
1926        const char *msg;
1927
1928        rc = kstrtoint(buf, 0, &start);
1929        if (rc)
1930                return rc;
1931
1932        if (sdev->channel >= myrb_logical_channel(sdev->host))
1933                return -ENXIO;
1934
1935        status = myrb_get_rbld_progress(cb, NULL);
1936        if (start) {
1937                if (status == MYRB_STATUS_SUCCESS) {
1938                        sdev_printk(KERN_INFO, sdev,
1939                                    "Rebuild Not Initiated; already in progress\n");
1940                        return -EALREADY;
1941                }
1942                mutex_lock(&cb->dcmd_mutex);
1943                cmd_blk = &cb->dcmd_blk;
1944                myrb_reset_cmd(cmd_blk);
1945                mbox = &cmd_blk->mbox;
1946                mbox->type3D.opcode = MYRB_CMD_REBUILD_ASYNC;
1947                mbox->type3D.id = MYRB_DCMD_TAG;
1948                mbox->type3D.channel = sdev->channel;
1949                mbox->type3D.target = sdev->id;
1950                status = myrb_exec_cmd(cb, cmd_blk);
1951                mutex_unlock(&cb->dcmd_mutex);
1952        } else {
1953                struct pci_dev *pdev = cb->pdev;
1954                unsigned char *rate;
1955                dma_addr_t rate_addr;
1956
1957                if (status != MYRB_STATUS_SUCCESS) {
1958                        sdev_printk(KERN_INFO, sdev,
1959                                    "Rebuild Not Cancelled; not in progress\n");
1960                        return 0;
1961                }
1962
1963                rate = dma_alloc_coherent(&pdev->dev, sizeof(char),
1964                                          &rate_addr, GFP_KERNEL);
1965                if (rate == NULL) {
1966                        sdev_printk(KERN_INFO, sdev,
1967                                    "Cancellation of Rebuild Failed - Out of Memory\n");
1968                        return -ENOMEM;
1969                }
1970                mutex_lock(&cb->dcmd_mutex);
1971                cmd_blk = &cb->dcmd_blk;
1972                myrb_reset_cmd(cmd_blk);
1973                mbox = &cmd_blk->mbox;
1974                mbox->type3R.opcode = MYRB_CMD_REBUILD_CONTROL;
1975                mbox->type3R.id = MYRB_DCMD_TAG;
1976                mbox->type3R.rbld_rate = 0xFF;
1977                mbox->type3R.addr = rate_addr;
1978                status = myrb_exec_cmd(cb, cmd_blk);
1979                dma_free_coherent(&pdev->dev, sizeof(char), rate, rate_addr);
1980                mutex_unlock(&cb->dcmd_mutex);
1981        }
1982        if (status == MYRB_STATUS_SUCCESS) {
1983                sdev_printk(KERN_INFO, sdev, "Rebuild %s\n",
1984                            start ? "Initiated" : "Cancelled");
1985                return count;
1986        }
1987        if (!start) {
1988                sdev_printk(KERN_INFO, sdev,
1989                            "Rebuild Not Cancelled, status 0x%x\n",
1990                            status);
1991                return -EIO;
1992        }
1993
1994        switch (status) {
1995        case MYRB_STATUS_ATTEMPT_TO_RBLD_ONLINE_DRIVE:
1996                msg = "Attempt to Rebuild Online or Unresponsive Drive";
1997                break;
1998        case MYRB_STATUS_RBLD_NEW_DISK_FAILED:
1999                msg = "New Disk Failed During Rebuild";
2000                break;
2001        case MYRB_STATUS_INVALID_ADDRESS:
2002                msg = "Invalid Device Address";
2003                break;
2004        case MYRB_STATUS_RBLD_OR_CHECK_INPROGRESS:
2005                msg = "Already in Progress";
2006                break;
2007        default:
2008                msg = NULL;
2009                break;
2010        }
2011        if (msg)
2012                sdev_printk(KERN_INFO, sdev,
2013                            "Rebuild Failed - %s\n", msg);
2014        else
2015                sdev_printk(KERN_INFO, sdev,
2016                            "Rebuild Failed, status 0x%x\n", status);
2017
2018        return -EIO;
2019}
2020static DEVICE_ATTR_RW(rebuild);
2021
2022static ssize_t consistency_check_store(struct device *dev,
2023                struct device_attribute *attr, const char *buf, size_t count)
2024{
2025        struct scsi_device *sdev = to_scsi_device(dev);
2026        struct myrb_hba *cb = shost_priv(sdev->host);
2027        struct myrb_rbld_progress rbld_buf;
2028        struct myrb_cmdblk *cmd_blk;
2029        union myrb_cmd_mbox *mbox;
2030        unsigned short ldev_num = 0xFFFF;
2031        unsigned short status;
2032        int rc, start;
2033        const char *msg;
2034
2035        rc = kstrtoint(buf, 0, &start);
2036        if (rc)
2037                return rc;
2038
2039        if (sdev->channel < myrb_logical_channel(sdev->host))
2040                return -ENXIO;
2041
2042        status = myrb_get_rbld_progress(cb, &rbld_buf);
2043        if (start) {
2044                if (status == MYRB_STATUS_SUCCESS) {
2045                        sdev_printk(KERN_INFO, sdev,
2046                                    "Check Consistency Not Initiated; already in progress\n");
2047                        return -EALREADY;
2048                }
2049                mutex_lock(&cb->dcmd_mutex);
2050                cmd_blk = &cb->dcmd_blk;
2051                myrb_reset_cmd(cmd_blk);
2052                mbox = &cmd_blk->mbox;
2053                mbox->type3C.opcode = MYRB_CMD_CHECK_CONSISTENCY_ASYNC;
2054                mbox->type3C.id = MYRB_DCMD_TAG;
2055                mbox->type3C.ldev_num = sdev->id;
2056                mbox->type3C.auto_restore = true;
2057
2058                status = myrb_exec_cmd(cb, cmd_blk);
2059                mutex_unlock(&cb->dcmd_mutex);
2060        } else {
2061                struct pci_dev *pdev = cb->pdev;
2062                unsigned char *rate;
2063                dma_addr_t rate_addr;
2064
2065                if (ldev_num != sdev->id) {
2066                        sdev_printk(KERN_INFO, sdev,
2067                                    "Check Consistency Not Cancelled; not in progress\n");
2068                        return 0;
2069                }
2070                rate = dma_alloc_coherent(&pdev->dev, sizeof(char),
2071                                          &rate_addr, GFP_KERNEL);
2072                if (rate == NULL) {
2073                        sdev_printk(KERN_INFO, sdev,
2074                                    "Cancellation of Check Consistency Failed - Out of Memory\n");
2075                        return -ENOMEM;
2076                }
2077                mutex_lock(&cb->dcmd_mutex);
2078                cmd_blk = &cb->dcmd_blk;
2079                myrb_reset_cmd(cmd_blk);
2080                mbox = &cmd_blk->mbox;
2081                mbox->type3R.opcode = MYRB_CMD_REBUILD_CONTROL;
2082                mbox->type3R.id = MYRB_DCMD_TAG;
2083                mbox->type3R.rbld_rate = 0xFF;
2084                mbox->type3R.addr = rate_addr;
2085                status = myrb_exec_cmd(cb, cmd_blk);
2086                dma_free_coherent(&pdev->dev, sizeof(char), rate, rate_addr);
2087                mutex_unlock(&cb->dcmd_mutex);
2088        }
2089        if (status == MYRB_STATUS_SUCCESS) {
2090                sdev_printk(KERN_INFO, sdev, "Check Consistency %s\n",
2091                            start ? "Initiated" : "Cancelled");
2092                return count;
2093        }
2094        if (!start) {
2095                sdev_printk(KERN_INFO, sdev,
2096                            "Check Consistency Not Cancelled, status 0x%x\n",
2097                            status);
2098                return -EIO;
2099        }
2100
2101        switch (status) {
2102        case MYRB_STATUS_ATTEMPT_TO_RBLD_ONLINE_DRIVE:
2103                msg = "Dependent Physical Device is DEAD";
2104                break;
2105        case MYRB_STATUS_RBLD_NEW_DISK_FAILED:
2106                msg = "New Disk Failed During Rebuild";
2107                break;
2108        case MYRB_STATUS_INVALID_ADDRESS:
2109                msg = "Invalid or Nonredundant Logical Drive";
2110                break;
2111        case MYRB_STATUS_RBLD_OR_CHECK_INPROGRESS:
2112                msg = "Already in Progress";
2113                break;
2114        default:
2115                msg = NULL;
2116                break;
2117        }
2118        if (msg)
2119                sdev_printk(KERN_INFO, sdev,
2120                            "Check Consistency Failed - %s\n", msg);
2121        else
2122                sdev_printk(KERN_INFO, sdev,
2123                            "Check Consistency Failed, status 0x%x\n", status);
2124
2125        return -EIO;
2126}
2127
2128static ssize_t consistency_check_show(struct device *dev,
2129                struct device_attribute *attr, char *buf)
2130{
2131        return rebuild_show(dev, attr, buf);
2132}
2133static DEVICE_ATTR_RW(consistency_check);
2134
2135static ssize_t ctlr_num_show(struct device *dev,
2136                struct device_attribute *attr, char *buf)
2137{
2138        struct Scsi_Host *shost = class_to_shost(dev);
2139        struct myrb_hba *cb = shost_priv(shost);
2140
2141        return snprintf(buf, 20, "%u\n", cb->ctlr_num);
2142}
2143static DEVICE_ATTR_RO(ctlr_num);
2144
2145static ssize_t firmware_show(struct device *dev,
2146                struct device_attribute *attr, char *buf)
2147{
2148        struct Scsi_Host *shost = class_to_shost(dev);
2149        struct myrb_hba *cb = shost_priv(shost);
2150
2151        return snprintf(buf, 16, "%s\n", cb->fw_version);
2152}
2153static DEVICE_ATTR_RO(firmware);
2154
2155static ssize_t model_show(struct device *dev,
2156                struct device_attribute *attr, char *buf)
2157{
2158        struct Scsi_Host *shost = class_to_shost(dev);
2159        struct myrb_hba *cb = shost_priv(shost);
2160
2161        return snprintf(buf, 16, "%s\n", cb->model_name);
2162}
2163static DEVICE_ATTR_RO(model);
2164
2165static ssize_t flush_cache_store(struct device *dev,
2166                struct device_attribute *attr, const char *buf, size_t count)
2167{
2168        struct Scsi_Host *shost = class_to_shost(dev);
2169        struct myrb_hba *cb = shost_priv(shost);
2170        unsigned short status;
2171
2172        status = myrb_exec_type3(cb, MYRB_CMD_FLUSH, 0);
2173        if (status == MYRB_STATUS_SUCCESS) {
2174                shost_printk(KERN_INFO, shost,
2175                             "Cache Flush Completed\n");
2176                return count;
2177        }
2178        shost_printk(KERN_INFO, shost,
2179                     "Cache Flush Failed, status %x\n", status);
2180        return -EIO;
2181}
2182static DEVICE_ATTR_WO(flush_cache);
2183
2184static struct device_attribute *myrb_sdev_attrs[] = {
2185        &dev_attr_rebuild,
2186        &dev_attr_consistency_check,
2187        &dev_attr_raid_state,
2188        &dev_attr_raid_level,
2189        NULL,
2190};
2191
2192static struct device_attribute *myrb_shost_attrs[] = {
2193        &dev_attr_ctlr_num,
2194        &dev_attr_model,
2195        &dev_attr_firmware,
2196        &dev_attr_flush_cache,
2197        NULL,
2198};
2199
2200static struct scsi_host_template myrb_template = {
2201        .module                 = THIS_MODULE,
2202        .name                   = "DAC960",
2203        .proc_name              = "myrb",
2204        .queuecommand           = myrb_queuecommand,
2205        .eh_host_reset_handler  = myrb_host_reset,
2206        .slave_alloc            = myrb_slave_alloc,
2207        .slave_configure        = myrb_slave_configure,
2208        .slave_destroy          = myrb_slave_destroy,
2209        .bios_param             = myrb_biosparam,
2210        .cmd_size               = sizeof(struct myrb_cmdblk),
2211        .shost_attrs            = myrb_shost_attrs,
2212        .sdev_attrs             = myrb_sdev_attrs,
2213        .this_id                = -1,
2214};
2215
2216/**
2217 * myrb_is_raid - return boolean indicating device is raid volume
2218 * @dev: the device struct object
2219 */
2220static int myrb_is_raid(struct device *dev)
2221{
2222        struct scsi_device *sdev = to_scsi_device(dev);
2223
2224        return sdev->channel == myrb_logical_channel(sdev->host);
2225}
2226
2227/**
2228 * myrb_get_resync - get raid volume resync percent complete
2229 * @dev: the device struct object
2230 */
2231static void myrb_get_resync(struct device *dev)
2232{
2233        struct scsi_device *sdev = to_scsi_device(dev);
2234        struct myrb_hba *cb = shost_priv(sdev->host);
2235        struct myrb_rbld_progress rbld_buf;
2236        unsigned int percent_complete = 0;
2237        unsigned short status;
2238        unsigned int ldev_size = 0, remaining = 0;
2239
2240        if (sdev->channel < myrb_logical_channel(sdev->host))
2241                return;
2242        status = myrb_get_rbld_progress(cb, &rbld_buf);
2243        if (status == MYRB_STATUS_SUCCESS) {
2244                if (rbld_buf.ldev_num == sdev->id) {
2245                        ldev_size = rbld_buf.ldev_size;
2246                        remaining = rbld_buf.blocks_left;
2247                }
2248        }
2249        if (remaining && ldev_size)
2250                percent_complete = (ldev_size - remaining) * 100 / ldev_size;
2251        raid_set_resync(myrb_raid_template, dev, percent_complete);
2252}
2253
2254/**
2255 * myrb_get_state - get raid volume status
2256 * @dev: the device struct object
2257 */
2258static void myrb_get_state(struct device *dev)
2259{
2260        struct scsi_device *sdev = to_scsi_device(dev);
2261        struct myrb_hba *cb = shost_priv(sdev->host);
2262        struct myrb_ldev_info *ldev_info = sdev->hostdata;
2263        enum raid_state state = RAID_STATE_UNKNOWN;
2264        unsigned short status;
2265
2266        if (sdev->channel < myrb_logical_channel(sdev->host) || !ldev_info)
2267                state = RAID_STATE_UNKNOWN;
2268        else {
2269                status = myrb_get_rbld_progress(cb, NULL);
2270                if (status == MYRB_STATUS_SUCCESS)
2271                        state = RAID_STATE_RESYNCING;
2272                else {
2273                        switch (ldev_info->state) {
2274                        case MYRB_DEVICE_ONLINE:
2275                                state = RAID_STATE_ACTIVE;
2276                                break;
2277                        case MYRB_DEVICE_WO:
2278                        case MYRB_DEVICE_CRITICAL:
2279                                state = RAID_STATE_DEGRADED;
2280                                break;
2281                        default:
2282                                state = RAID_STATE_OFFLINE;
2283                        }
2284                }
2285        }
2286        raid_set_state(myrb_raid_template, dev, state);
2287}
2288
2289static struct raid_function_template myrb_raid_functions = {
2290        .cookie         = &myrb_template,
2291        .is_raid        = myrb_is_raid,
2292        .get_resync     = myrb_get_resync,
2293        .get_state      = myrb_get_state,
2294};
2295
2296static void myrb_handle_scsi(struct myrb_hba *cb, struct myrb_cmdblk *cmd_blk,
2297                struct scsi_cmnd *scmd)
2298{
2299        unsigned short status;
2300
2301        if (!cmd_blk)
2302                return;
2303
2304        scsi_dma_unmap(scmd);
2305
2306        if (cmd_blk->dcdb) {
2307                memcpy(scmd->sense_buffer, &cmd_blk->dcdb->sense, 64);
2308                dma_pool_free(cb->dcdb_pool, cmd_blk->dcdb,
2309                              cmd_blk->dcdb_addr);
2310                cmd_blk->dcdb = NULL;
2311        }
2312        if (cmd_blk->sgl) {
2313                dma_pool_free(cb->sg_pool, cmd_blk->sgl, cmd_blk->sgl_addr);
2314                cmd_blk->sgl = NULL;
2315                cmd_blk->sgl_addr = 0;
2316        }
2317        status = cmd_blk->status;
2318        switch (status) {
2319        case MYRB_STATUS_SUCCESS:
2320        case MYRB_STATUS_DEVICE_BUSY:
2321                scmd->result = (DID_OK << 16) | status;
2322                break;
2323        case MYRB_STATUS_BAD_DATA:
2324                dev_dbg(&scmd->device->sdev_gendev,
2325                        "Bad Data Encountered\n");
2326                if (scmd->sc_data_direction == DMA_FROM_DEVICE)
2327                        /* Unrecovered read error */
2328                        scsi_build_sense(scmd, 0, MEDIUM_ERROR, 0x11, 0);
2329                else
2330                        /* Write error */
2331                        scsi_build_sense(scmd, 0, MEDIUM_ERROR, 0x0C, 0);
2332                break;
2333        case MYRB_STATUS_IRRECOVERABLE_DATA_ERROR:
2334                scmd_printk(KERN_ERR, scmd, "Irrecoverable Data Error\n");
2335                if (scmd->sc_data_direction == DMA_FROM_DEVICE)
2336                        /* Unrecovered read error, auto-reallocation failed */
2337                        scsi_build_sense(scmd, 0, MEDIUM_ERROR, 0x11, 0x04);
2338                else
2339                        /* Write error, auto-reallocation failed */
2340                        scsi_build_sense(scmd, 0, MEDIUM_ERROR, 0x0C, 0x02);
2341                break;
2342        case MYRB_STATUS_LDRV_NONEXISTENT_OR_OFFLINE:
2343                dev_dbg(&scmd->device->sdev_gendev,
2344                            "Logical Drive Nonexistent or Offline");
2345                scmd->result = (DID_BAD_TARGET << 16);
2346                break;
2347        case MYRB_STATUS_ACCESS_BEYOND_END_OF_LDRV:
2348                dev_dbg(&scmd->device->sdev_gendev,
2349                            "Attempt to Access Beyond End of Logical Drive");
2350                /* Logical block address out of range */
2351                scsi_build_sense(scmd, 0, NOT_READY, 0x21, 0);
2352                break;
2353        case MYRB_STATUS_DEVICE_NONRESPONSIVE:
2354                dev_dbg(&scmd->device->sdev_gendev, "Device nonresponsive\n");
2355                scmd->result = (DID_BAD_TARGET << 16);
2356                break;
2357        default:
2358                scmd_printk(KERN_ERR, scmd,
2359                            "Unexpected Error Status %04X", status);
2360                scmd->result = (DID_ERROR << 16);
2361                break;
2362        }
2363        scmd->scsi_done(scmd);
2364}
2365
2366static void myrb_handle_cmdblk(struct myrb_hba *cb, struct myrb_cmdblk *cmd_blk)
2367{
2368        if (!cmd_blk)
2369                return;
2370
2371        if (cmd_blk->completion) {
2372                complete(cmd_blk->completion);
2373                cmd_blk->completion = NULL;
2374        }
2375}
2376
2377static void myrb_monitor(struct work_struct *work)
2378{
2379        struct myrb_hba *cb = container_of(work,
2380                        struct myrb_hba, monitor_work.work);
2381        struct Scsi_Host *shost = cb->host;
2382        unsigned long interval = MYRB_PRIMARY_MONITOR_INTERVAL;
2383
2384        dev_dbg(&shost->shost_gendev, "monitor tick\n");
2385
2386        if (cb->new_ev_seq > cb->old_ev_seq) {
2387                int event = cb->old_ev_seq;
2388
2389                dev_dbg(&shost->shost_gendev,
2390                        "get event log no %d/%d\n",
2391                        cb->new_ev_seq, event);
2392                myrb_get_event(cb, event);
2393                cb->old_ev_seq = event + 1;
2394                interval = 10;
2395        } else if (cb->need_err_info) {
2396                cb->need_err_info = false;
2397                dev_dbg(&shost->shost_gendev, "get error table\n");
2398                myrb_get_errtable(cb);
2399                interval = 10;
2400        } else if (cb->need_rbld && cb->rbld_first) {
2401                cb->need_rbld = false;
2402                dev_dbg(&shost->shost_gendev,
2403                        "get rebuild progress\n");
2404                myrb_update_rbld_progress(cb);
2405                interval = 10;
2406        } else if (cb->need_ldev_info) {
2407                cb->need_ldev_info = false;
2408                dev_dbg(&shost->shost_gendev,
2409                        "get logical drive info\n");
2410                myrb_get_ldev_info(cb);
2411                interval = 10;
2412        } else if (cb->need_rbld) {
2413                cb->need_rbld = false;
2414                dev_dbg(&shost->shost_gendev,
2415                        "get rebuild progress\n");
2416                myrb_update_rbld_progress(cb);
2417                interval = 10;
2418        } else if (cb->need_cc_status) {
2419                cb->need_cc_status = false;
2420                dev_dbg(&shost->shost_gendev,
2421                        "get consistency check progress\n");
2422                myrb_get_cc_progress(cb);
2423                interval = 10;
2424        } else if (cb->need_bgi_status) {
2425                cb->need_bgi_status = false;
2426                dev_dbg(&shost->shost_gendev, "get background init status\n");
2427                myrb_bgi_control(cb);
2428                interval = 10;
2429        } else {
2430                dev_dbg(&shost->shost_gendev, "new enquiry\n");
2431                mutex_lock(&cb->dma_mutex);
2432                myrb_hba_enquiry(cb);
2433                mutex_unlock(&cb->dma_mutex);
2434                if ((cb->new_ev_seq - cb->old_ev_seq > 0) ||
2435                    cb->need_err_info || cb->need_rbld ||
2436                    cb->need_ldev_info || cb->need_cc_status ||
2437                    cb->need_bgi_status) {
2438                        dev_dbg(&shost->shost_gendev,
2439                                "reschedule monitor\n");
2440                        interval = 0;
2441                }
2442        }
2443        if (interval > 1)
2444                cb->primary_monitor_time = jiffies;
2445        queue_delayed_work(cb->work_q, &cb->monitor_work, interval);
2446}
2447
2448/*
2449 * myrb_err_status - reports controller BIOS messages
2450 *
2451 * Controller BIOS messages are passed through the Error Status Register
2452 * when the driver performs the BIOS handshaking.
2453 *
2454 * Return: true for fatal errors and false otherwise.
2455 */
2456static bool myrb_err_status(struct myrb_hba *cb, unsigned char error,
2457                unsigned char parm0, unsigned char parm1)
2458{
2459        struct pci_dev *pdev = cb->pdev;
2460
2461        switch (error) {
2462        case 0x00:
2463                dev_info(&pdev->dev,
2464                         "Physical Device %d:%d Not Responding\n",
2465                         parm1, parm0);
2466                break;
2467        case 0x08:
2468                dev_notice(&pdev->dev, "Spinning Up Drives\n");
2469                break;
2470        case 0x30:
2471                dev_notice(&pdev->dev, "Configuration Checksum Error\n");
2472                break;
2473        case 0x60:
2474                dev_notice(&pdev->dev, "Mirror Race Recovery Failed\n");
2475                break;
2476        case 0x70:
2477                dev_notice(&pdev->dev, "Mirror Race Recovery In Progress\n");
2478                break;
2479        case 0x90:
2480                dev_notice(&pdev->dev, "Physical Device %d:%d COD Mismatch\n",
2481                           parm1, parm0);
2482                break;
2483        case 0xA0:
2484                dev_notice(&pdev->dev, "Logical Drive Installation Aborted\n");
2485                break;
2486        case 0xB0:
2487                dev_notice(&pdev->dev, "Mirror Race On A Critical Logical Drive\n");
2488                break;
2489        case 0xD0:
2490                dev_notice(&pdev->dev, "New Controller Configuration Found\n");
2491                break;
2492        case 0xF0:
2493                dev_err(&pdev->dev, "Fatal Memory Parity Error\n");
2494                return true;
2495        default:
2496                dev_err(&pdev->dev, "Unknown Initialization Error %02X\n",
2497                        error);
2498                return true;
2499        }
2500        return false;
2501}
2502
2503/*
2504 * Hardware-specific functions
2505 */
2506
2507/*
2508 * DAC960 LA Series Controllers
2509 */
2510
2511static inline void DAC960_LA_hw_mbox_new_cmd(void __iomem *base)
2512{
2513        writeb(DAC960_LA_IDB_HWMBOX_NEW_CMD, base + DAC960_LA_IDB_OFFSET);
2514}
2515
2516static inline void DAC960_LA_ack_hw_mbox_status(void __iomem *base)
2517{
2518        writeb(DAC960_LA_IDB_HWMBOX_ACK_STS, base + DAC960_LA_IDB_OFFSET);
2519}
2520
2521static inline void DAC960_LA_reset_ctrl(void __iomem *base)
2522{
2523        writeb(DAC960_LA_IDB_CTRL_RESET, base + DAC960_LA_IDB_OFFSET);
2524}
2525
2526static inline void DAC960_LA_mem_mbox_new_cmd(void __iomem *base)
2527{
2528        writeb(DAC960_LA_IDB_MMBOX_NEW_CMD, base + DAC960_LA_IDB_OFFSET);
2529}
2530
2531static inline bool DAC960_LA_hw_mbox_is_full(void __iomem *base)
2532{
2533        unsigned char idb = readb(base + DAC960_LA_IDB_OFFSET);
2534
2535        return !(idb & DAC960_LA_IDB_HWMBOX_EMPTY);
2536}
2537
2538static inline bool DAC960_LA_init_in_progress(void __iomem *base)
2539{
2540        unsigned char idb = readb(base + DAC960_LA_IDB_OFFSET);
2541
2542        return !(idb & DAC960_LA_IDB_INIT_DONE);
2543}
2544
2545static inline void DAC960_LA_ack_hw_mbox_intr(void __iomem *base)
2546{
2547        writeb(DAC960_LA_ODB_HWMBOX_ACK_IRQ, base + DAC960_LA_ODB_OFFSET);
2548}
2549
2550static inline void DAC960_LA_ack_intr(void __iomem *base)
2551{
2552        writeb(DAC960_LA_ODB_HWMBOX_ACK_IRQ | DAC960_LA_ODB_MMBOX_ACK_IRQ,
2553               base + DAC960_LA_ODB_OFFSET);
2554}
2555
2556static inline bool DAC960_LA_hw_mbox_status_available(void __iomem *base)
2557{
2558        unsigned char odb = readb(base + DAC960_LA_ODB_OFFSET);
2559
2560        return odb & DAC960_LA_ODB_HWMBOX_STS_AVAIL;
2561}
2562
2563static inline void DAC960_LA_enable_intr(void __iomem *base)
2564{
2565        unsigned char odb = 0xFF;
2566
2567        odb &= ~DAC960_LA_IRQMASK_DISABLE_IRQ;
2568        writeb(odb, base + DAC960_LA_IRQMASK_OFFSET);
2569}
2570
2571static inline void DAC960_LA_disable_intr(void __iomem *base)
2572{
2573        unsigned char odb = 0xFF;
2574
2575        odb |= DAC960_LA_IRQMASK_DISABLE_IRQ;
2576        writeb(odb, base + DAC960_LA_IRQMASK_OFFSET);
2577}
2578
2579static inline void DAC960_LA_write_cmd_mbox(union myrb_cmd_mbox *mem_mbox,
2580                union myrb_cmd_mbox *mbox)
2581{
2582        mem_mbox->words[1] = mbox->words[1];
2583        mem_mbox->words[2] = mbox->words[2];
2584        mem_mbox->words[3] = mbox->words[3];
2585        /* Memory barrier to prevent reordering */
2586        wmb();
2587        mem_mbox->words[0] = mbox->words[0];
2588        /* Memory barrier to force PCI access */
2589        mb();
2590}
2591
2592static inline void DAC960_LA_write_hw_mbox(void __iomem *base,
2593                union myrb_cmd_mbox *mbox)
2594{
2595        writel(mbox->words[0], base + DAC960_LA_CMDOP_OFFSET);
2596        writel(mbox->words[1], base + DAC960_LA_MBOX4_OFFSET);
2597        writel(mbox->words[2], base + DAC960_LA_MBOX8_OFFSET);
2598        writeb(mbox->bytes[12], base + DAC960_LA_MBOX12_OFFSET);
2599}
2600
2601static inline unsigned short DAC960_LA_read_status(void __iomem *base)
2602{
2603        return readw(base + DAC960_LA_STS_OFFSET);
2604}
2605
2606static inline bool
2607DAC960_LA_read_error_status(void __iomem *base, unsigned char *error,
2608                unsigned char *param0, unsigned char *param1)
2609{
2610        unsigned char errsts = readb(base + DAC960_LA_ERRSTS_OFFSET);
2611
2612        if (!(errsts & DAC960_LA_ERRSTS_PENDING))
2613                return false;
2614        errsts &= ~DAC960_LA_ERRSTS_PENDING;
2615
2616        *error = errsts;
2617        *param0 = readb(base + DAC960_LA_CMDOP_OFFSET);
2618        *param1 = readb(base + DAC960_LA_CMDID_OFFSET);
2619        writeb(0xFF, base + DAC960_LA_ERRSTS_OFFSET);
2620        return true;
2621}
2622
2623static inline unsigned short
2624DAC960_LA_mbox_init(struct pci_dev *pdev, void __iomem *base,
2625                union myrb_cmd_mbox *mbox)
2626{
2627        unsigned short status;
2628        int timeout = 0;
2629
2630        while (timeout < MYRB_MAILBOX_TIMEOUT) {
2631                if (!DAC960_LA_hw_mbox_is_full(base))
2632                        break;
2633                udelay(10);
2634                timeout++;
2635        }
2636        if (DAC960_LA_hw_mbox_is_full(base)) {
2637                dev_err(&pdev->dev,
2638                        "Timeout waiting for empty mailbox\n");
2639                return MYRB_STATUS_SUBSYS_TIMEOUT;
2640        }
2641        DAC960_LA_write_hw_mbox(base, mbox);
2642        DAC960_LA_hw_mbox_new_cmd(base);
2643        timeout = 0;
2644        while (timeout < MYRB_MAILBOX_TIMEOUT) {
2645                if (DAC960_LA_hw_mbox_status_available(base))
2646                        break;
2647                udelay(10);
2648                timeout++;
2649        }
2650        if (!DAC960_LA_hw_mbox_status_available(base)) {
2651                dev_err(&pdev->dev, "Timeout waiting for mailbox status\n");
2652                return MYRB_STATUS_SUBSYS_TIMEOUT;
2653        }
2654        status = DAC960_LA_read_status(base);
2655        DAC960_LA_ack_hw_mbox_intr(base);
2656        DAC960_LA_ack_hw_mbox_status(base);
2657
2658        return status;
2659}
2660
2661static int DAC960_LA_hw_init(struct pci_dev *pdev,
2662                struct myrb_hba *cb, void __iomem *base)
2663{
2664        int timeout = 0;
2665        unsigned char error, parm0, parm1;
2666
2667        DAC960_LA_disable_intr(base);
2668        DAC960_LA_ack_hw_mbox_status(base);
2669        udelay(1000);
2670        while (DAC960_LA_init_in_progress(base) &&
2671               timeout < MYRB_MAILBOX_TIMEOUT) {
2672                if (DAC960_LA_read_error_status(base, &error,
2673                                              &parm0, &parm1) &&
2674                    myrb_err_status(cb, error, parm0, parm1))
2675                        return -ENODEV;
2676                udelay(10);
2677                timeout++;
2678        }
2679        if (timeout == MYRB_MAILBOX_TIMEOUT) {
2680                dev_err(&pdev->dev,
2681                        "Timeout waiting for Controller Initialisation\n");
2682                return -ETIMEDOUT;
2683        }
2684        if (!myrb_enable_mmio(cb, DAC960_LA_mbox_init)) {
2685                dev_err(&pdev->dev,
2686                        "Unable to Enable Memory Mailbox Interface\n");
2687                DAC960_LA_reset_ctrl(base);
2688                return -ENODEV;
2689        }
2690        DAC960_LA_enable_intr(base);
2691        cb->qcmd = myrb_qcmd;
2692        cb->write_cmd_mbox = DAC960_LA_write_cmd_mbox;
2693        if (cb->dual_mode_interface)
2694                cb->get_cmd_mbox = DAC960_LA_mem_mbox_new_cmd;
2695        else
2696                cb->get_cmd_mbox = DAC960_LA_hw_mbox_new_cmd;
2697        cb->disable_intr = DAC960_LA_disable_intr;
2698        cb->reset = DAC960_LA_reset_ctrl;
2699
2700        return 0;
2701}
2702
2703static irqreturn_t DAC960_LA_intr_handler(int irq, void *arg)
2704{
2705        struct myrb_hba *cb = arg;
2706        void __iomem *base = cb->io_base;
2707        struct myrb_stat_mbox *next_stat_mbox;
2708        unsigned long flags;
2709
2710        spin_lock_irqsave(&cb->queue_lock, flags);
2711        DAC960_LA_ack_intr(base);
2712        next_stat_mbox = cb->next_stat_mbox;
2713        while (next_stat_mbox->valid) {
2714                unsigned char id = next_stat_mbox->id;
2715                struct scsi_cmnd *scmd = NULL;
2716                struct myrb_cmdblk *cmd_blk = NULL;
2717
2718                if (id == MYRB_DCMD_TAG)
2719                        cmd_blk = &cb->dcmd_blk;
2720                else if (id == MYRB_MCMD_TAG)
2721                        cmd_blk = &cb->mcmd_blk;
2722                else {
2723                        scmd = scsi_host_find_tag(cb->host, id - 3);
2724                        if (scmd)
2725                                cmd_blk = scsi_cmd_priv(scmd);
2726                }
2727                if (cmd_blk)
2728                        cmd_blk->status = next_stat_mbox->status;
2729                else
2730                        dev_err(&cb->pdev->dev,
2731                                "Unhandled command completion %d\n", id);
2732
2733                memset(next_stat_mbox, 0, sizeof(struct myrb_stat_mbox));
2734                if (++next_stat_mbox > cb->last_stat_mbox)
2735                        next_stat_mbox = cb->first_stat_mbox;
2736
2737                if (cmd_blk) {
2738                        if (id < 3)
2739                                myrb_handle_cmdblk(cb, cmd_blk);
2740                        else
2741                                myrb_handle_scsi(cb, cmd_blk, scmd);
2742                }
2743        }
2744        cb->next_stat_mbox = next_stat_mbox;
2745        spin_unlock_irqrestore(&cb->queue_lock, flags);
2746        return IRQ_HANDLED;
2747}
2748
2749static struct myrb_privdata DAC960_LA_privdata = {
2750        .hw_init =      DAC960_LA_hw_init,
2751        .irq_handler =  DAC960_LA_intr_handler,
2752        .mmio_size =    DAC960_LA_mmio_size,
2753};
2754
2755/*
2756 * DAC960 PG Series Controllers
2757 */
2758static inline void DAC960_PG_hw_mbox_new_cmd(void __iomem *base)
2759{
2760        writel(DAC960_PG_IDB_HWMBOX_NEW_CMD, base + DAC960_PG_IDB_OFFSET);
2761}
2762
2763static inline void DAC960_PG_ack_hw_mbox_status(void __iomem *base)
2764{
2765        writel(DAC960_PG_IDB_HWMBOX_ACK_STS, base + DAC960_PG_IDB_OFFSET);
2766}
2767
2768static inline void DAC960_PG_reset_ctrl(void __iomem *base)
2769{
2770        writel(DAC960_PG_IDB_CTRL_RESET, base + DAC960_PG_IDB_OFFSET);
2771}
2772
2773static inline void DAC960_PG_mem_mbox_new_cmd(void __iomem *base)
2774{
2775        writel(DAC960_PG_IDB_MMBOX_NEW_CMD, base + DAC960_PG_IDB_OFFSET);
2776}
2777
2778static inline bool DAC960_PG_hw_mbox_is_full(void __iomem *base)
2779{
2780        unsigned char idb = readl(base + DAC960_PG_IDB_OFFSET);
2781
2782        return idb & DAC960_PG_IDB_HWMBOX_FULL;
2783}
2784
2785static inline bool DAC960_PG_init_in_progress(void __iomem *base)
2786{
2787        unsigned char idb = readl(base + DAC960_PG_IDB_OFFSET);
2788
2789        return idb & DAC960_PG_IDB_INIT_IN_PROGRESS;
2790}
2791
2792static inline void DAC960_PG_ack_hw_mbox_intr(void __iomem *base)
2793{
2794        writel(DAC960_PG_ODB_HWMBOX_ACK_IRQ, base + DAC960_PG_ODB_OFFSET);
2795}
2796
2797static inline void DAC960_PG_ack_intr(void __iomem *base)
2798{
2799        writel(DAC960_PG_ODB_HWMBOX_ACK_IRQ | DAC960_PG_ODB_MMBOX_ACK_IRQ,
2800               base + DAC960_PG_ODB_OFFSET);
2801}
2802
2803static inline bool DAC960_PG_hw_mbox_status_available(void __iomem *base)
2804{
2805        unsigned char odb = readl(base + DAC960_PG_ODB_OFFSET);
2806
2807        return odb & DAC960_PG_ODB_HWMBOX_STS_AVAIL;
2808}
2809
2810static inline void DAC960_PG_enable_intr(void __iomem *base)
2811{
2812        unsigned int imask = (unsigned int)-1;
2813
2814        imask &= ~DAC960_PG_IRQMASK_DISABLE_IRQ;
2815        writel(imask, base + DAC960_PG_IRQMASK_OFFSET);
2816}
2817
2818static inline void DAC960_PG_disable_intr(void __iomem *base)
2819{
2820        unsigned int imask = (unsigned int)-1;
2821
2822        writel(imask, base + DAC960_PG_IRQMASK_OFFSET);
2823}
2824
2825static inline void DAC960_PG_write_cmd_mbox(union myrb_cmd_mbox *mem_mbox,
2826                union myrb_cmd_mbox *mbox)
2827{
2828        mem_mbox->words[1] = mbox->words[1];
2829        mem_mbox->words[2] = mbox->words[2];
2830        mem_mbox->words[3] = mbox->words[3];
2831        /* Memory barrier to prevent reordering */
2832        wmb();
2833        mem_mbox->words[0] = mbox->words[0];
2834        /* Memory barrier to force PCI access */
2835        mb();
2836}
2837
2838static inline void DAC960_PG_write_hw_mbox(void __iomem *base,
2839                union myrb_cmd_mbox *mbox)
2840{
2841        writel(mbox->words[0], base + DAC960_PG_CMDOP_OFFSET);
2842        writel(mbox->words[1], base + DAC960_PG_MBOX4_OFFSET);
2843        writel(mbox->words[2], base + DAC960_PG_MBOX8_OFFSET);
2844        writeb(mbox->bytes[12], base + DAC960_PG_MBOX12_OFFSET);
2845}
2846
2847static inline unsigned short
2848DAC960_PG_read_status(void __iomem *base)
2849{
2850        return readw(base + DAC960_PG_STS_OFFSET);
2851}
2852
2853static inline bool
2854DAC960_PG_read_error_status(void __iomem *base, unsigned char *error,
2855                unsigned char *param0, unsigned char *param1)
2856{
2857        unsigned char errsts = readb(base + DAC960_PG_ERRSTS_OFFSET);
2858
2859        if (!(errsts & DAC960_PG_ERRSTS_PENDING))
2860                return false;
2861        errsts &= ~DAC960_PG_ERRSTS_PENDING;
2862        *error = errsts;
2863        *param0 = readb(base + DAC960_PG_CMDOP_OFFSET);
2864        *param1 = readb(base + DAC960_PG_CMDID_OFFSET);
2865        writeb(0, base + DAC960_PG_ERRSTS_OFFSET);
2866        return true;
2867}
2868
2869static inline unsigned short
2870DAC960_PG_mbox_init(struct pci_dev *pdev, void __iomem *base,
2871                union myrb_cmd_mbox *mbox)
2872{
2873        unsigned short status;
2874        int timeout = 0;
2875
2876        while (timeout < MYRB_MAILBOX_TIMEOUT) {
2877                if (!DAC960_PG_hw_mbox_is_full(base))
2878                        break;
2879                udelay(10);
2880                timeout++;
2881        }
2882        if (DAC960_PG_hw_mbox_is_full(base)) {
2883                dev_err(&pdev->dev,
2884                        "Timeout waiting for empty mailbox\n");
2885                return MYRB_STATUS_SUBSYS_TIMEOUT;
2886        }
2887        DAC960_PG_write_hw_mbox(base, mbox);
2888        DAC960_PG_hw_mbox_new_cmd(base);
2889
2890        timeout = 0;
2891        while (timeout < MYRB_MAILBOX_TIMEOUT) {
2892                if (DAC960_PG_hw_mbox_status_available(base))
2893                        break;
2894                udelay(10);
2895                timeout++;
2896        }
2897        if (!DAC960_PG_hw_mbox_status_available(base)) {
2898                dev_err(&pdev->dev,
2899                        "Timeout waiting for mailbox status\n");
2900                return MYRB_STATUS_SUBSYS_TIMEOUT;
2901        }
2902        status = DAC960_PG_read_status(base);
2903        DAC960_PG_ack_hw_mbox_intr(base);
2904        DAC960_PG_ack_hw_mbox_status(base);
2905
2906        return status;
2907}
2908
2909static int DAC960_PG_hw_init(struct pci_dev *pdev,
2910                struct myrb_hba *cb, void __iomem *base)
2911{
2912        int timeout = 0;
2913        unsigned char error, parm0, parm1;
2914
2915        DAC960_PG_disable_intr(base);
2916        DAC960_PG_ack_hw_mbox_status(base);
2917        udelay(1000);
2918        while (DAC960_PG_init_in_progress(base) &&
2919               timeout < MYRB_MAILBOX_TIMEOUT) {
2920                if (DAC960_PG_read_error_status(base, &error,
2921                                                &parm0, &parm1) &&
2922                    myrb_err_status(cb, error, parm0, parm1))
2923                        return -EIO;
2924                udelay(10);
2925                timeout++;
2926        }
2927        if (timeout == MYRB_MAILBOX_TIMEOUT) {
2928                dev_err(&pdev->dev,
2929                        "Timeout waiting for Controller Initialisation\n");
2930                return -ETIMEDOUT;
2931        }
2932        if (!myrb_enable_mmio(cb, DAC960_PG_mbox_init)) {
2933                dev_err(&pdev->dev,
2934                        "Unable to Enable Memory Mailbox Interface\n");
2935                DAC960_PG_reset_ctrl(base);
2936                return -ENODEV;
2937        }
2938        DAC960_PG_enable_intr(base);
2939        cb->qcmd = myrb_qcmd;
2940        cb->write_cmd_mbox = DAC960_PG_write_cmd_mbox;
2941        if (cb->dual_mode_interface)
2942                cb->get_cmd_mbox = DAC960_PG_mem_mbox_new_cmd;
2943        else
2944                cb->get_cmd_mbox = DAC960_PG_hw_mbox_new_cmd;
2945        cb->disable_intr = DAC960_PG_disable_intr;
2946        cb->reset = DAC960_PG_reset_ctrl;
2947
2948        return 0;
2949}
2950
2951static irqreturn_t DAC960_PG_intr_handler(int irq, void *arg)
2952{
2953        struct myrb_hba *cb = arg;
2954        void __iomem *base = cb->io_base;
2955        struct myrb_stat_mbox *next_stat_mbox;
2956        unsigned long flags;
2957
2958        spin_lock_irqsave(&cb->queue_lock, flags);
2959        DAC960_PG_ack_intr(base);
2960        next_stat_mbox = cb->next_stat_mbox;
2961        while (next_stat_mbox->valid) {
2962                unsigned char id = next_stat_mbox->id;
2963                struct scsi_cmnd *scmd = NULL;
2964                struct myrb_cmdblk *cmd_blk = NULL;
2965
2966                if (id == MYRB_DCMD_TAG)
2967                        cmd_blk = &cb->dcmd_blk;
2968                else if (id == MYRB_MCMD_TAG)
2969                        cmd_blk = &cb->mcmd_blk;
2970                else {
2971                        scmd = scsi_host_find_tag(cb->host, id - 3);
2972                        if (scmd)
2973                                cmd_blk = scsi_cmd_priv(scmd);
2974                }
2975                if (cmd_blk)
2976                        cmd_blk->status = next_stat_mbox->status;
2977                else
2978                        dev_err(&cb->pdev->dev,
2979                                "Unhandled command completion %d\n", id);
2980
2981                memset(next_stat_mbox, 0, sizeof(struct myrb_stat_mbox));
2982                if (++next_stat_mbox > cb->last_stat_mbox)
2983                        next_stat_mbox = cb->first_stat_mbox;
2984
2985                if (id < 3)
2986                        myrb_handle_cmdblk(cb, cmd_blk);
2987                else
2988                        myrb_handle_scsi(cb, cmd_blk, scmd);
2989        }
2990        cb->next_stat_mbox = next_stat_mbox;
2991        spin_unlock_irqrestore(&cb->queue_lock, flags);
2992        return IRQ_HANDLED;
2993}
2994
2995static struct myrb_privdata DAC960_PG_privdata = {
2996        .hw_init =      DAC960_PG_hw_init,
2997        .irq_handler =  DAC960_PG_intr_handler,
2998        .mmio_size =    DAC960_PG_mmio_size,
2999};
3000
3001
3002/*
3003 * DAC960 PD Series Controllers
3004 */
3005
3006static inline void DAC960_PD_hw_mbox_new_cmd(void __iomem *base)
3007{
3008        writeb(DAC960_PD_IDB_HWMBOX_NEW_CMD, base + DAC960_PD_IDB_OFFSET);
3009}
3010
3011static inline void DAC960_PD_ack_hw_mbox_status(void __iomem *base)
3012{
3013        writeb(DAC960_PD_IDB_HWMBOX_ACK_STS, base + DAC960_PD_IDB_OFFSET);
3014}
3015
3016static inline void DAC960_PD_reset_ctrl(void __iomem *base)
3017{
3018        writeb(DAC960_PD_IDB_CTRL_RESET, base + DAC960_PD_IDB_OFFSET);
3019}
3020
3021static inline bool DAC960_PD_hw_mbox_is_full(void __iomem *base)
3022{
3023        unsigned char idb = readb(base + DAC960_PD_IDB_OFFSET);
3024
3025        return idb & DAC960_PD_IDB_HWMBOX_FULL;
3026}
3027
3028static inline bool DAC960_PD_init_in_progress(void __iomem *base)
3029{
3030        unsigned char idb = readb(base + DAC960_PD_IDB_OFFSET);
3031
3032        return idb & DAC960_PD_IDB_INIT_IN_PROGRESS;
3033}
3034
3035static inline void DAC960_PD_ack_intr(void __iomem *base)
3036{
3037        writeb(DAC960_PD_ODB_HWMBOX_ACK_IRQ, base + DAC960_PD_ODB_OFFSET);
3038}
3039
3040static inline bool DAC960_PD_hw_mbox_status_available(void __iomem *base)
3041{
3042        unsigned char odb = readb(base + DAC960_PD_ODB_OFFSET);
3043
3044        return odb & DAC960_PD_ODB_HWMBOX_STS_AVAIL;
3045}
3046
3047static inline void DAC960_PD_enable_intr(void __iomem *base)
3048{
3049        writeb(DAC960_PD_IRQMASK_ENABLE_IRQ, base + DAC960_PD_IRQEN_OFFSET);
3050}
3051
3052static inline void DAC960_PD_disable_intr(void __iomem *base)
3053{
3054        writeb(0, base + DAC960_PD_IRQEN_OFFSET);
3055}
3056
3057static inline void DAC960_PD_write_cmd_mbox(void __iomem *base,
3058                union myrb_cmd_mbox *mbox)
3059{
3060        writel(mbox->words[0], base + DAC960_PD_CMDOP_OFFSET);
3061        writel(mbox->words[1], base + DAC960_PD_MBOX4_OFFSET);
3062        writel(mbox->words[2], base + DAC960_PD_MBOX8_OFFSET);
3063        writeb(mbox->bytes[12], base + DAC960_PD_MBOX12_OFFSET);
3064}
3065
3066static inline unsigned char
3067DAC960_PD_read_status_cmd_ident(void __iomem *base)
3068{
3069        return readb(base + DAC960_PD_STSID_OFFSET);
3070}
3071
3072static inline unsigned short
3073DAC960_PD_read_status(void __iomem *base)
3074{
3075        return readw(base + DAC960_PD_STS_OFFSET);
3076}
3077
3078static inline bool
3079DAC960_PD_read_error_status(void __iomem *base, unsigned char *error,
3080                unsigned char *param0, unsigned char *param1)
3081{
3082        unsigned char errsts = readb(base + DAC960_PD_ERRSTS_OFFSET);
3083
3084        if (!(errsts & DAC960_PD_ERRSTS_PENDING))
3085                return false;
3086        errsts &= ~DAC960_PD_ERRSTS_PENDING;
3087        *error = errsts;
3088        *param0 = readb(base + DAC960_PD_CMDOP_OFFSET);
3089        *param1 = readb(base + DAC960_PD_CMDID_OFFSET);
3090        writeb(0, base + DAC960_PD_ERRSTS_OFFSET);
3091        return true;
3092}
3093
3094static void DAC960_PD_qcmd(struct myrb_hba *cb, struct myrb_cmdblk *cmd_blk)
3095{
3096        void __iomem *base = cb->io_base;
3097        union myrb_cmd_mbox *mbox = &cmd_blk->mbox;
3098
3099        while (DAC960_PD_hw_mbox_is_full(base))
3100                udelay(1);
3101        DAC960_PD_write_cmd_mbox(base, mbox);
3102        DAC960_PD_hw_mbox_new_cmd(base);
3103}
3104
3105static int DAC960_PD_hw_init(struct pci_dev *pdev,
3106                struct myrb_hba *cb, void __iomem *base)
3107{
3108        int timeout = 0;
3109        unsigned char error, parm0, parm1;
3110
3111        if (!request_region(cb->io_addr, 0x80, "myrb")) {
3112                dev_err(&pdev->dev, "IO port 0x%lx busy\n",
3113                        (unsigned long)cb->io_addr);
3114                return -EBUSY;
3115        }
3116        DAC960_PD_disable_intr(base);
3117        DAC960_PD_ack_hw_mbox_status(base);
3118        udelay(1000);
3119        while (DAC960_PD_init_in_progress(base) &&
3120               timeout < MYRB_MAILBOX_TIMEOUT) {
3121                if (DAC960_PD_read_error_status(base, &error,
3122                                              &parm0, &parm1) &&
3123                    myrb_err_status(cb, error, parm0, parm1))
3124                        return -EIO;
3125                udelay(10);
3126                timeout++;
3127        }
3128        if (timeout == MYRB_MAILBOX_TIMEOUT) {
3129                dev_err(&pdev->dev,
3130                        "Timeout waiting for Controller Initialisation\n");
3131                return -ETIMEDOUT;
3132        }
3133        if (!myrb_enable_mmio(cb, NULL)) {
3134                dev_err(&pdev->dev,
3135                        "Unable to Enable Memory Mailbox Interface\n");
3136                DAC960_PD_reset_ctrl(base);
3137                return -ENODEV;
3138        }
3139        DAC960_PD_enable_intr(base);
3140        cb->qcmd = DAC960_PD_qcmd;
3141        cb->disable_intr = DAC960_PD_disable_intr;
3142        cb->reset = DAC960_PD_reset_ctrl;
3143
3144        return 0;
3145}
3146
3147static irqreturn_t DAC960_PD_intr_handler(int irq, void *arg)
3148{
3149        struct myrb_hba *cb = arg;
3150        void __iomem *base = cb->io_base;
3151        unsigned long flags;
3152
3153        spin_lock_irqsave(&cb->queue_lock, flags);
3154        while (DAC960_PD_hw_mbox_status_available(base)) {
3155                unsigned char id = DAC960_PD_read_status_cmd_ident(base);
3156                struct scsi_cmnd *scmd = NULL;
3157                struct myrb_cmdblk *cmd_blk = NULL;
3158
3159                if (id == MYRB_DCMD_TAG)
3160                        cmd_blk = &cb->dcmd_blk;
3161                else if (id == MYRB_MCMD_TAG)
3162                        cmd_blk = &cb->mcmd_blk;
3163                else {
3164                        scmd = scsi_host_find_tag(cb->host, id - 3);
3165                        if (scmd)
3166                                cmd_blk = scsi_cmd_priv(scmd);
3167                }
3168                if (cmd_blk)
3169                        cmd_blk->status = DAC960_PD_read_status(base);
3170                else
3171                        dev_err(&cb->pdev->dev,
3172                                "Unhandled command completion %d\n", id);
3173
3174                DAC960_PD_ack_intr(base);
3175                DAC960_PD_ack_hw_mbox_status(base);
3176
3177                if (id < 3)
3178                        myrb_handle_cmdblk(cb, cmd_blk);
3179                else
3180                        myrb_handle_scsi(cb, cmd_blk, scmd);
3181        }
3182        spin_unlock_irqrestore(&cb->queue_lock, flags);
3183        return IRQ_HANDLED;
3184}
3185
3186static struct myrb_privdata DAC960_PD_privdata = {
3187        .hw_init =      DAC960_PD_hw_init,
3188        .irq_handler =  DAC960_PD_intr_handler,
3189        .mmio_size =    DAC960_PD_mmio_size,
3190};
3191
3192
3193/*
3194 * DAC960 P Series Controllers
3195 *
3196 * Similar to the DAC960 PD Series Controllers, but some commands have
3197 * to be translated.
3198 */
3199
3200static inline void myrb_translate_enquiry(void *enq)
3201{
3202        memcpy(enq + 132, enq + 36, 64);
3203        memset(enq + 36, 0, 96);
3204}
3205
3206static inline void myrb_translate_devstate(void *state)
3207{
3208        memcpy(state + 2, state + 3, 1);
3209        memmove(state + 4, state + 5, 2);
3210        memmove(state + 6, state + 8, 4);
3211}
3212
3213static inline void myrb_translate_to_rw_command(struct myrb_cmdblk *cmd_blk)
3214{
3215        union myrb_cmd_mbox *mbox = &cmd_blk->mbox;
3216        int ldev_num = mbox->type5.ld.ldev_num;
3217
3218        mbox->bytes[3] &= 0x7;
3219        mbox->bytes[3] |= mbox->bytes[7] << 6;
3220        mbox->bytes[7] = ldev_num;
3221}
3222
3223static inline void myrb_translate_from_rw_command(struct myrb_cmdblk *cmd_blk)
3224{
3225        union myrb_cmd_mbox *mbox = &cmd_blk->mbox;
3226        int ldev_num = mbox->bytes[7];
3227
3228        mbox->bytes[7] = mbox->bytes[3] >> 6;
3229        mbox->bytes[3] &= 0x7;
3230        mbox->bytes[3] |= ldev_num << 3;
3231}
3232
3233static void DAC960_P_qcmd(struct myrb_hba *cb, struct myrb_cmdblk *cmd_blk)
3234{
3235        void __iomem *base = cb->io_base;
3236        union myrb_cmd_mbox *mbox = &cmd_blk->mbox;
3237
3238        switch (mbox->common.opcode) {
3239        case MYRB_CMD_ENQUIRY:
3240                mbox->common.opcode = MYRB_CMD_ENQUIRY_OLD;
3241                break;
3242        case MYRB_CMD_GET_DEVICE_STATE:
3243                mbox->common.opcode = MYRB_CMD_GET_DEVICE_STATE_OLD;
3244                break;
3245        case MYRB_CMD_READ:
3246                mbox->common.opcode = MYRB_CMD_READ_OLD;
3247                myrb_translate_to_rw_command(cmd_blk);
3248                break;
3249        case MYRB_CMD_WRITE:
3250                mbox->common.opcode = MYRB_CMD_WRITE_OLD;
3251                myrb_translate_to_rw_command(cmd_blk);
3252                break;
3253        case MYRB_CMD_READ_SG:
3254                mbox->common.opcode = MYRB_CMD_READ_SG_OLD;
3255                myrb_translate_to_rw_command(cmd_blk);
3256                break;
3257        case MYRB_CMD_WRITE_SG:
3258                mbox->common.opcode = MYRB_CMD_WRITE_SG_OLD;
3259                myrb_translate_to_rw_command(cmd_blk);
3260                break;
3261        default:
3262                break;
3263        }
3264        while (DAC960_PD_hw_mbox_is_full(base))
3265                udelay(1);
3266        DAC960_PD_write_cmd_mbox(base, mbox);
3267        DAC960_PD_hw_mbox_new_cmd(base);
3268}
3269
3270
3271static int DAC960_P_hw_init(struct pci_dev *pdev,
3272                struct myrb_hba *cb, void __iomem *base)
3273{
3274        int timeout = 0;
3275        unsigned char error, parm0, parm1;
3276
3277        if (!request_region(cb->io_addr, 0x80, "myrb")) {
3278                dev_err(&pdev->dev, "IO port 0x%lx busy\n",
3279                        (unsigned long)cb->io_addr);
3280                return -EBUSY;
3281        }
3282        DAC960_PD_disable_intr(base);
3283        DAC960_PD_ack_hw_mbox_status(base);
3284        udelay(1000);
3285        while (DAC960_PD_init_in_progress(base) &&
3286               timeout < MYRB_MAILBOX_TIMEOUT) {
3287                if (DAC960_PD_read_error_status(base, &error,
3288                                                &parm0, &parm1) &&
3289                    myrb_err_status(cb, error, parm0, parm1))
3290                        return -EAGAIN;
3291                udelay(10);
3292                timeout++;
3293        }
3294        if (timeout == MYRB_MAILBOX_TIMEOUT) {
3295                dev_err(&pdev->dev,
3296                        "Timeout waiting for Controller Initialisation\n");
3297                return -ETIMEDOUT;
3298        }
3299        if (!myrb_enable_mmio(cb, NULL)) {
3300                dev_err(&pdev->dev,
3301                        "Unable to allocate DMA mapped memory\n");
3302                DAC960_PD_reset_ctrl(base);
3303                return -ETIMEDOUT;
3304        }
3305        DAC960_PD_enable_intr(base);
3306        cb->qcmd = DAC960_P_qcmd;
3307        cb->disable_intr = DAC960_PD_disable_intr;
3308        cb->reset = DAC960_PD_reset_ctrl;
3309
3310        return 0;
3311}
3312
3313static irqreturn_t DAC960_P_intr_handler(int irq, void *arg)
3314{
3315        struct myrb_hba *cb = arg;
3316        void __iomem *base = cb->io_base;
3317        unsigned long flags;
3318
3319        spin_lock_irqsave(&cb->queue_lock, flags);
3320        while (DAC960_PD_hw_mbox_status_available(base)) {
3321                unsigned char id = DAC960_PD_read_status_cmd_ident(base);
3322                struct scsi_cmnd *scmd = NULL;
3323                struct myrb_cmdblk *cmd_blk = NULL;
3324                union myrb_cmd_mbox *mbox;
3325                enum myrb_cmd_opcode op;
3326
3327
3328                if (id == MYRB_DCMD_TAG)
3329                        cmd_blk = &cb->dcmd_blk;
3330                else if (id == MYRB_MCMD_TAG)
3331                        cmd_blk = &cb->mcmd_blk;
3332                else {
3333                        scmd = scsi_host_find_tag(cb->host, id - 3);
3334                        if (scmd)
3335                                cmd_blk = scsi_cmd_priv(scmd);
3336                }
3337                if (cmd_blk)
3338                        cmd_blk->status = DAC960_PD_read_status(base);
3339                else
3340                        dev_err(&cb->pdev->dev,
3341                                "Unhandled command completion %d\n", id);
3342
3343                DAC960_PD_ack_intr(base);
3344                DAC960_PD_ack_hw_mbox_status(base);
3345
3346                if (!cmd_blk)
3347                        continue;
3348
3349                mbox = &cmd_blk->mbox;
3350                op = mbox->common.opcode;
3351                switch (op) {
3352                case MYRB_CMD_ENQUIRY_OLD:
3353                        mbox->common.opcode = MYRB_CMD_ENQUIRY;
3354                        myrb_translate_enquiry(cb->enquiry);
3355                        break;
3356                case MYRB_CMD_READ_OLD:
3357                        mbox->common.opcode = MYRB_CMD_READ;
3358                        myrb_translate_from_rw_command(cmd_blk);
3359                        break;
3360                case MYRB_CMD_WRITE_OLD:
3361                        mbox->common.opcode = MYRB_CMD_WRITE;
3362                        myrb_translate_from_rw_command(cmd_blk);
3363                        break;
3364                case MYRB_CMD_READ_SG_OLD:
3365                        mbox->common.opcode = MYRB_CMD_READ_SG;
3366                        myrb_translate_from_rw_command(cmd_blk);
3367                        break;
3368                case MYRB_CMD_WRITE_SG_OLD:
3369                        mbox->common.opcode = MYRB_CMD_WRITE_SG;
3370                        myrb_translate_from_rw_command(cmd_blk);
3371                        break;
3372                default:
3373                        break;
3374                }
3375                if (id < 3)
3376                        myrb_handle_cmdblk(cb, cmd_blk);
3377                else
3378                        myrb_handle_scsi(cb, cmd_blk, scmd);
3379        }
3380        spin_unlock_irqrestore(&cb->queue_lock, flags);
3381        return IRQ_HANDLED;
3382}
3383
3384static struct myrb_privdata DAC960_P_privdata = {
3385        .hw_init =      DAC960_P_hw_init,
3386        .irq_handler =  DAC960_P_intr_handler,
3387        .mmio_size =    DAC960_PD_mmio_size,
3388};
3389
3390static struct myrb_hba *myrb_detect(struct pci_dev *pdev,
3391                const struct pci_device_id *entry)
3392{
3393        struct myrb_privdata *privdata =
3394                (struct myrb_privdata *)entry->driver_data;
3395        irq_handler_t irq_handler = privdata->irq_handler;
3396        unsigned int mmio_size = privdata->mmio_size;
3397        struct Scsi_Host *shost;
3398        struct myrb_hba *cb = NULL;
3399
3400        shost = scsi_host_alloc(&myrb_template, sizeof(struct myrb_hba));
3401        if (!shost) {
3402                dev_err(&pdev->dev, "Unable to allocate Controller\n");
3403                return NULL;
3404        }
3405        shost->max_cmd_len = 12;
3406        shost->max_lun = 256;
3407        cb = shost_priv(shost);
3408        mutex_init(&cb->dcmd_mutex);
3409        mutex_init(&cb->dma_mutex);
3410        cb->pdev = pdev;
3411
3412        if (pci_enable_device(pdev))
3413                goto failure;
3414
3415        if (privdata->hw_init == DAC960_PD_hw_init ||
3416            privdata->hw_init == DAC960_P_hw_init) {
3417                cb->io_addr = pci_resource_start(pdev, 0);
3418                cb->pci_addr = pci_resource_start(pdev, 1);
3419        } else
3420                cb->pci_addr = pci_resource_start(pdev, 0);
3421
3422        pci_set_drvdata(pdev, cb);
3423        spin_lock_init(&cb->queue_lock);
3424        if (mmio_size < PAGE_SIZE)
3425                mmio_size = PAGE_SIZE;
3426        cb->mmio_base = ioremap(cb->pci_addr & PAGE_MASK, mmio_size);
3427        if (cb->mmio_base == NULL) {
3428                dev_err(&pdev->dev,
3429                        "Unable to map Controller Register Window\n");
3430                goto failure;
3431        }
3432
3433        cb->io_base = cb->mmio_base + (cb->pci_addr & ~PAGE_MASK);
3434        if (privdata->hw_init(pdev, cb, cb->io_base))
3435                goto failure;
3436
3437        if (request_irq(pdev->irq, irq_handler, IRQF_SHARED, "myrb", cb) < 0) {
3438                dev_err(&pdev->dev,
3439                        "Unable to acquire IRQ Channel %d\n", pdev->irq);
3440                goto failure;
3441        }
3442        cb->irq = pdev->irq;
3443        return cb;
3444
3445failure:
3446        dev_err(&pdev->dev,
3447                "Failed to initialize Controller\n");
3448        myrb_cleanup(cb);
3449        return NULL;
3450}
3451
3452static int myrb_probe(struct pci_dev *dev, const struct pci_device_id *entry)
3453{
3454        struct myrb_hba *cb;
3455        int ret;
3456
3457        cb = myrb_detect(dev, entry);
3458        if (!cb)
3459                return -ENODEV;
3460
3461        ret = myrb_get_hba_config(cb);
3462        if (ret < 0) {
3463                myrb_cleanup(cb);
3464                return ret;
3465        }
3466
3467        if (!myrb_create_mempools(dev, cb)) {
3468                ret = -ENOMEM;
3469                goto failed;
3470        }
3471
3472        ret = scsi_add_host(cb->host, &dev->dev);
3473        if (ret) {
3474                dev_err(&dev->dev, "scsi_add_host failed with %d\n", ret);
3475                myrb_destroy_mempools(cb);
3476                goto failed;
3477        }
3478        scsi_scan_host(cb->host);
3479        return 0;
3480failed:
3481        myrb_cleanup(cb);
3482        return ret;
3483}
3484
3485
3486static void myrb_remove(struct pci_dev *pdev)
3487{
3488        struct myrb_hba *cb = pci_get_drvdata(pdev);
3489
3490        shost_printk(KERN_NOTICE, cb->host, "Flushing Cache...");
3491        myrb_exec_type3(cb, MYRB_CMD_FLUSH, 0);
3492        myrb_cleanup(cb);
3493        myrb_destroy_mempools(cb);
3494}
3495
3496
3497static const struct pci_device_id myrb_id_table[] = {
3498        {
3499                PCI_DEVICE_SUB(PCI_VENDOR_ID_DEC,
3500                               PCI_DEVICE_ID_DEC_21285,
3501                               PCI_VENDOR_ID_MYLEX,
3502                               PCI_DEVICE_ID_MYLEX_DAC960_LA),
3503                .driver_data    = (unsigned long) &DAC960_LA_privdata,
3504        },
3505        {
3506                PCI_DEVICE_DATA(MYLEX, DAC960_PG, &DAC960_PG_privdata),
3507        },
3508        {
3509                PCI_DEVICE_DATA(MYLEX, DAC960_PD, &DAC960_PD_privdata),
3510        },
3511        {
3512                PCI_DEVICE_DATA(MYLEX, DAC960_P, &DAC960_P_privdata),
3513        },
3514        {0, },
3515};
3516
3517MODULE_DEVICE_TABLE(pci, myrb_id_table);
3518
3519static struct pci_driver myrb_pci_driver = {
3520        .name           = "myrb",
3521        .id_table       = myrb_id_table,
3522        .probe          = myrb_probe,
3523        .remove         = myrb_remove,
3524};
3525
3526static int __init myrb_init_module(void)
3527{
3528        int ret;
3529
3530        myrb_raid_template = raid_class_attach(&myrb_raid_functions);
3531        if (!myrb_raid_template)
3532                return -ENODEV;
3533
3534        ret = pci_register_driver(&myrb_pci_driver);
3535        if (ret)
3536                raid_class_release(myrb_raid_template);
3537
3538        return ret;
3539}
3540
3541static void __exit myrb_cleanup_module(void)
3542{
3543        pci_unregister_driver(&myrb_pci_driver);
3544        raid_class_release(myrb_raid_template);
3545}
3546
3547module_init(myrb_init_module);
3548module_exit(myrb_cleanup_module);
3549
3550MODULE_DESCRIPTION("Mylex DAC960/AcceleRAID/eXtremeRAID driver (Block interface)");
3551MODULE_AUTHOR("Hannes Reinecke <hare@suse.com>");
3552MODULE_LICENSE("GPL");
3553