linux/drivers/scsi/esas2r/esas2r_int.c
<<
>>
Prefs
   1/*
   2 *  linux/drivers/scsi/esas2r/esas2r_int.c
   3 *      esas2r interrupt handling
   4 *
   5 *  Copyright (c) 2001-2013 ATTO Technology, Inc.
   6 *  (mailto:linuxdrivers@attotech.com)
   7 */
   8/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
   9/*
  10 *  This program is free software; you can redistribute it and/or modify
  11 *  it under the terms of the GNU General Public License as published by
  12 *  the Free Software Foundation; version 2 of the License.
  13 *
  14 *  This program is distributed in the hope that it will be useful,
  15 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  16 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17 *  GNU General Public License for more details.
  18 *
  19 *  NO WARRANTY
  20 *  THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR
  21 *  CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT
  22 *  LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT,
  23 *  MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is
  24 *  solely responsible for determining the appropriateness of using and
  25 *  distributing the Program and assumes all risks associated with its
  26 *  exercise of rights under this Agreement, including but not limited to
  27 *  the risks and costs of program errors, damage to or loss of data,
  28 *  programs or equipment, and unavailability or interruption of operations.
  29 *
  30 *  DISCLAIMER OF LIABILITY
  31 *  NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY
  32 *  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  33 *  DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND
  34 *  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
  35 *  TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
  36 *  USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
  37 *  HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES
  38 *
  39 *  You should have received a copy of the GNU General Public License
  40 *  along with this program; if not, write to the Free Software
  41 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  42 */
  43/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
  44
  45#include "esas2r.h"
  46
  47/* Local function prototypes */
  48static void esas2r_doorbell_interrupt(struct esas2r_adapter *a, u32 doorbell);
  49static void esas2r_get_outbound_responses(struct esas2r_adapter *a);
  50static void esas2r_process_bus_reset(struct esas2r_adapter *a);
  51
  52/*
  53 * Poll the adapter for interrupts and service them.
  54 * This function handles both legacy interrupts and MSI.
  55 */
  56void esas2r_polled_interrupt(struct esas2r_adapter *a)
  57{
  58        u32 intstat;
  59        u32 doorbell;
  60
  61        esas2r_disable_chip_interrupts(a);
  62
  63        intstat = esas2r_read_register_dword(a, MU_INT_STATUS_OUT);
  64
  65        if (intstat & MU_INTSTAT_POST_OUT) {
  66                /* clear the interrupt */
  67
  68                esas2r_write_register_dword(a, MU_OUT_LIST_INT_STAT,
  69                                            MU_OLIS_INT);
  70                esas2r_flush_register_dword(a, MU_OUT_LIST_INT_STAT);
  71
  72                esas2r_get_outbound_responses(a);
  73        }
  74
  75        if (intstat & MU_INTSTAT_DRBL) {
  76                doorbell = esas2r_read_register_dword(a, MU_DOORBELL_OUT);
  77                if (doorbell != 0)
  78                        esas2r_doorbell_interrupt(a, doorbell);
  79        }
  80
  81        esas2r_enable_chip_interrupts(a);
  82
  83        if (atomic_read(&a->disable_cnt) == 0)
  84                esas2r_do_deferred_processes(a);
  85}
  86
  87/*
  88 * Legacy and MSI interrupt handlers.  Note that the legacy interrupt handler
  89 * schedules a TASKLET to process events, whereas the MSI handler just
  90 * processes interrupt events directly.
  91 */
  92irqreturn_t esas2r_interrupt(int irq, void *dev_id)
  93{
  94        struct esas2r_adapter *a = (struct esas2r_adapter *)dev_id;
  95
  96        if (!esas2r_adapter_interrupt_pending(a))
  97                return IRQ_NONE;
  98
  99        set_bit(AF2_INT_PENDING, &a->flags2);
 100        esas2r_schedule_tasklet(a);
 101
 102        return IRQ_HANDLED;
 103}
 104
 105void esas2r_adapter_interrupt(struct esas2r_adapter *a)
 106{
 107        u32 doorbell;
 108
 109        if (likely(a->int_stat & MU_INTSTAT_POST_OUT)) {
 110                /* clear the interrupt */
 111                esas2r_write_register_dword(a, MU_OUT_LIST_INT_STAT,
 112                                            MU_OLIS_INT);
 113                esas2r_flush_register_dword(a, MU_OUT_LIST_INT_STAT);
 114                esas2r_get_outbound_responses(a);
 115        }
 116
 117        if (unlikely(a->int_stat & MU_INTSTAT_DRBL)) {
 118                doorbell = esas2r_read_register_dword(a, MU_DOORBELL_OUT);
 119                if (doorbell != 0)
 120                        esas2r_doorbell_interrupt(a, doorbell);
 121        }
 122
 123        a->int_mask = ESAS2R_INT_STS_MASK;
 124
 125        esas2r_enable_chip_interrupts(a);
 126
 127        if (likely(atomic_read(&a->disable_cnt) == 0))
 128                esas2r_do_deferred_processes(a);
 129}
 130
 131irqreturn_t esas2r_msi_interrupt(int irq, void *dev_id)
 132{
 133        struct esas2r_adapter *a = (struct esas2r_adapter *)dev_id;
 134        u32 intstat;
 135        u32 doorbell;
 136
 137        intstat = esas2r_read_register_dword(a, MU_INT_STATUS_OUT);
 138
 139        if (likely(intstat & MU_INTSTAT_POST_OUT)) {
 140                /* clear the interrupt */
 141
 142                esas2r_write_register_dword(a, MU_OUT_LIST_INT_STAT,
 143                                            MU_OLIS_INT);
 144                esas2r_flush_register_dword(a, MU_OUT_LIST_INT_STAT);
 145
 146                esas2r_get_outbound_responses(a);
 147        }
 148
 149        if (unlikely(intstat & MU_INTSTAT_DRBL)) {
 150                doorbell = esas2r_read_register_dword(a, MU_DOORBELL_OUT);
 151                if (doorbell != 0)
 152                        esas2r_doorbell_interrupt(a, doorbell);
 153        }
 154
 155        /*
 156         * Work around a chip bug and force a new MSI to be sent if one is
 157         * still pending.
 158         */
 159        esas2r_disable_chip_interrupts(a);
 160        esas2r_enable_chip_interrupts(a);
 161
 162        if (likely(atomic_read(&a->disable_cnt) == 0))
 163                esas2r_do_deferred_processes(a);
 164
 165        esas2r_do_tasklet_tasks(a);
 166
 167        return 1;
 168}
 169
 170
 171
 172static void esas2r_handle_outbound_rsp_err(struct esas2r_adapter *a,
 173                                           struct esas2r_request *rq,
 174                                           struct atto_vda_ob_rsp *rsp)
 175{
 176
 177        /*
 178         * For I/O requests, only copy the response if an error
 179         * occurred and setup a callback to do error processing.
 180         */
 181        if (unlikely(rq->req_stat != RS_SUCCESS)) {
 182                memcpy(&rq->func_rsp, &rsp->func_rsp, sizeof(rsp->func_rsp));
 183
 184                if (rq->req_stat == RS_ABORTED) {
 185                        if (rq->timeout > RQ_MAX_TIMEOUT)
 186                                rq->req_stat = RS_TIMEOUT;
 187                } else if (rq->req_stat == RS_SCSI_ERROR) {
 188                        u8 scsistatus = rq->func_rsp.scsi_rsp.scsi_stat;
 189
 190                        esas2r_trace("scsistatus: %x", scsistatus);
 191
 192                        /* Any of these are a good result. */
 193                        if (scsistatus == SAM_STAT_GOOD || scsistatus ==
 194                            SAM_STAT_CONDITION_MET || scsistatus ==
 195                            SAM_STAT_INTERMEDIATE || scsistatus ==
 196                            SAM_STAT_INTERMEDIATE_CONDITION_MET) {
 197                                rq->req_stat = RS_SUCCESS;
 198                                rq->func_rsp.scsi_rsp.scsi_stat =
 199                                        SAM_STAT_GOOD;
 200                        }
 201                }
 202        }
 203}
 204
 205static void esas2r_get_outbound_responses(struct esas2r_adapter *a)
 206{
 207        struct atto_vda_ob_rsp *rsp;
 208        u32 rspput_ptr;
 209        u32 rspget_ptr;
 210        struct esas2r_request *rq;
 211        u32 handle;
 212        unsigned long flags;
 213
 214        LIST_HEAD(comp_list);
 215
 216        esas2r_trace_enter();
 217
 218        spin_lock_irqsave(&a->queue_lock, flags);
 219
 220        /* Get the outbound limit and pointers */
 221        rspput_ptr = le32_to_cpu(*a->outbound_copy) & MU_OLC_WRT_PTR;
 222        rspget_ptr = a->last_read;
 223
 224        esas2r_trace("rspput_ptr: %x, rspget_ptr: %x", rspput_ptr, rspget_ptr);
 225
 226        /* If we don't have anything to process, get out */
 227        if (unlikely(rspget_ptr == rspput_ptr)) {
 228                spin_unlock_irqrestore(&a->queue_lock, flags);
 229                esas2r_trace_exit();
 230                return;
 231        }
 232
 233        /* Make sure the firmware is healthy */
 234        if (unlikely(rspput_ptr >= a->list_size)) {
 235                spin_unlock_irqrestore(&a->queue_lock, flags);
 236                esas2r_bugon();
 237                esas2r_local_reset_adapter(a);
 238                esas2r_trace_exit();
 239                return;
 240        }
 241
 242        do {
 243                rspget_ptr++;
 244
 245                if (rspget_ptr >= a->list_size)
 246                        rspget_ptr = 0;
 247
 248                rsp = (struct atto_vda_ob_rsp *)a->outbound_list_md.virt_addr
 249                      + rspget_ptr;
 250
 251                handle = rsp->handle;
 252
 253                /* Verify the handle range */
 254                if (unlikely(LOWORD(handle) == 0
 255                             || LOWORD(handle) > num_requests +
 256                             num_ae_requests + 1)) {
 257                        esas2r_bugon();
 258                        continue;
 259                }
 260
 261                /* Get the request for this handle */
 262                rq = a->req_table[LOWORD(handle)];
 263
 264                if (unlikely(rq == NULL || rq->vrq->scsi.handle != handle)) {
 265                        esas2r_bugon();
 266                        continue;
 267                }
 268
 269                list_del(&rq->req_list);
 270
 271                /* Get the completion status */
 272                rq->req_stat = rsp->req_stat;
 273
 274                esas2r_trace("handle: %x", handle);
 275                esas2r_trace("rq: %p", rq);
 276                esas2r_trace("req_status: %x", rq->req_stat);
 277
 278                if (likely(rq->vrq->scsi.function == VDA_FUNC_SCSI)) {
 279                        esas2r_handle_outbound_rsp_err(a, rq, rsp);
 280                } else {
 281                        /*
 282                         * Copy the outbound completion struct for non-I/O
 283                         * requests.
 284                         */
 285                        memcpy(&rq->func_rsp, &rsp->func_rsp,
 286                               sizeof(rsp->func_rsp));
 287                }
 288
 289                /* Queue the request for completion. */
 290                list_add_tail(&rq->comp_list, &comp_list);
 291
 292        } while (rspget_ptr != rspput_ptr);
 293
 294        a->last_read = rspget_ptr;
 295        spin_unlock_irqrestore(&a->queue_lock, flags);
 296
 297        esas2r_comp_list_drain(a, &comp_list);
 298        esas2r_trace_exit();
 299}
 300
 301/*
 302 * Perform all deferred processes for the adapter.  Deferred
 303 * processes can only be done while the current interrupt
 304 * disable_cnt for the adapter is zero.
 305 */
 306void esas2r_do_deferred_processes(struct esas2r_adapter *a)
 307{
 308        int startreqs = 2;
 309        struct esas2r_request *rq;
 310        unsigned long flags;
 311
 312        /*
 313         * startreqs is used to control starting requests
 314         * that are on the deferred queue
 315         *  = 0 - do not start any requests
 316         *  = 1 - can start discovery requests
 317         *  = 2 - can start any request
 318         */
 319
 320        if (test_bit(AF_CHPRST_PENDING, &a->flags) ||
 321            test_bit(AF_FLASHING, &a->flags))
 322                startreqs = 0;
 323        else if (test_bit(AF_DISC_PENDING, &a->flags))
 324                startreqs = 1;
 325
 326        atomic_inc(&a->disable_cnt);
 327
 328        /* Clear off the completed list to be processed later. */
 329
 330        if (esas2r_is_tasklet_pending(a)) {
 331                esas2r_schedule_tasklet(a);
 332
 333                startreqs = 0;
 334        }
 335
 336        /*
 337         * If we can start requests then traverse the defer queue
 338         * looking for requests to start or complete
 339         */
 340        if (startreqs && !list_empty(&a->defer_list)) {
 341                LIST_HEAD(comp_list);
 342                struct list_head *element, *next;
 343
 344                spin_lock_irqsave(&a->queue_lock, flags);
 345
 346                list_for_each_safe(element, next, &a->defer_list) {
 347                        rq = list_entry(element, struct esas2r_request,
 348                                        req_list);
 349
 350                        if (rq->req_stat != RS_PENDING) {
 351                                list_del(element);
 352                                list_add_tail(&rq->comp_list, &comp_list);
 353                        }
 354                        /*
 355                         * Process discovery and OS requests separately.  We
 356                         * can't hold up discovery requests when discovery is
 357                         * pending.  In general, there may be different sets of
 358                         * conditions for starting different types of requests.
 359                         */
 360                        else if (rq->req_type == RT_DISC_REQ) {
 361                                list_del(element);
 362                                esas2r_disc_local_start_request(a, rq);
 363                        } else if (startreqs == 2) {
 364                                list_del(element);
 365                                esas2r_local_start_request(a, rq);
 366
 367                                /*
 368                                 * Flashing could have been set by last local
 369                                 * start
 370                                 */
 371                                if (test_bit(AF_FLASHING, &a->flags))
 372                                        break;
 373                        }
 374                }
 375
 376                spin_unlock_irqrestore(&a->queue_lock, flags);
 377                esas2r_comp_list_drain(a, &comp_list);
 378        }
 379
 380        atomic_dec(&a->disable_cnt);
 381}
 382
 383/*
 384 * Process an adapter reset (or one that is about to happen)
 385 * by making sure all outstanding requests are completed that
 386 * haven't been already.
 387 */
 388void esas2r_process_adapter_reset(struct esas2r_adapter *a)
 389{
 390        struct esas2r_request *rq = &a->general_req;
 391        unsigned long flags;
 392        struct esas2r_disc_context *dc;
 393
 394        LIST_HEAD(comp_list);
 395        struct list_head *element;
 396
 397        esas2r_trace_enter();
 398
 399        spin_lock_irqsave(&a->queue_lock, flags);
 400
 401        /* abort the active discovery, if any.   */
 402
 403        if (rq->interrupt_cx) {
 404                dc = (struct esas2r_disc_context *)rq->interrupt_cx;
 405
 406                dc->disc_evt = 0;
 407
 408                clear_bit(AF_DISC_IN_PROG, &a->flags);
 409        }
 410
 411        /*
 412         * just clear the interrupt callback for now.  it will be dequeued if
 413         * and when we find it on the active queue and we don't want the
 414         * callback called.  also set the dummy completion callback in case we
 415         * were doing an I/O request.
 416         */
 417
 418        rq->interrupt_cx = NULL;
 419        rq->interrupt_cb = NULL;
 420
 421        rq->comp_cb = esas2r_dummy_complete;
 422
 423        /* Reset the read and write pointers */
 424
 425        *a->outbound_copy =
 426                a->last_write =
 427                        a->last_read = a->list_size - 1;
 428
 429        set_bit(AF_COMM_LIST_TOGGLE, &a->flags);
 430
 431        /* Kill all the requests on the active list */
 432        list_for_each(element, &a->defer_list) {
 433                rq = list_entry(element, struct esas2r_request, req_list);
 434
 435                if (rq->req_stat == RS_STARTED)
 436                        if (esas2r_ioreq_aborted(a, rq, RS_ABORTED))
 437                                list_add_tail(&rq->comp_list, &comp_list);
 438        }
 439
 440        spin_unlock_irqrestore(&a->queue_lock, flags);
 441        esas2r_comp_list_drain(a, &comp_list);
 442        esas2r_process_bus_reset(a);
 443        esas2r_trace_exit();
 444}
 445
 446static void esas2r_process_bus_reset(struct esas2r_adapter *a)
 447{
 448        struct esas2r_request *rq;
 449        struct list_head *element;
 450        unsigned long flags;
 451
 452        LIST_HEAD(comp_list);
 453
 454        esas2r_trace_enter();
 455
 456        esas2r_hdebug("reset detected");
 457
 458        spin_lock_irqsave(&a->queue_lock, flags);
 459
 460        /* kill all the requests on the deferred queue */
 461        list_for_each(element, &a->defer_list) {
 462                rq = list_entry(element, struct esas2r_request, req_list);
 463                if (esas2r_ioreq_aborted(a, rq, RS_ABORTED))
 464                        list_add_tail(&rq->comp_list, &comp_list);
 465        }
 466
 467        spin_unlock_irqrestore(&a->queue_lock, flags);
 468
 469        esas2r_comp_list_drain(a, &comp_list);
 470
 471        if (atomic_read(&a->disable_cnt) == 0)
 472                esas2r_do_deferred_processes(a);
 473
 474        clear_bit(AF_OS_RESET, &a->flags);
 475
 476        esas2r_trace_exit();
 477}
 478
 479static void esas2r_chip_rst_needed_during_tasklet(struct esas2r_adapter *a)
 480{
 481
 482        clear_bit(AF_CHPRST_NEEDED, &a->flags);
 483        clear_bit(AF_BUSRST_NEEDED, &a->flags);
 484        clear_bit(AF_BUSRST_DETECTED, &a->flags);
 485        clear_bit(AF_BUSRST_PENDING, &a->flags);
 486        /*
 487         * Make sure we don't get attempt more than 3 resets
 488         * when the uptime between resets does not exceed one
 489         * minute.  This will stop any situation where there is
 490         * really something wrong with the hardware.  The way
 491         * this works is that we start with uptime ticks at 0.
 492         * Each time we do a reset, we add 20 seconds worth to
 493         * the count.  Each time a timer tick occurs, as long
 494         * as a chip reset is not pending, we decrement the
 495         * tick count.  If the uptime ticks ever gets to 60
 496         * seconds worth, we disable the adapter from that
 497         * point forward.  Three strikes, you're out.
 498         */
 499        if (!esas2r_is_adapter_present(a) || (a->chip_uptime >=
 500                                              ESAS2R_CHP_UPTIME_MAX)) {
 501                esas2r_hdebug("*** adapter disabled ***");
 502
 503                /*
 504                 * Ok, some kind of hard failure.  Make sure we
 505                 * exit this loop with chip interrupts
 506                 * permanently disabled so we don't lock up the
 507                 * entire system.  Also flag degraded mode to
 508                 * prevent the heartbeat from trying to recover.
 509                 */
 510
 511                set_bit(AF_DEGRADED_MODE, &a->flags);
 512                set_bit(AF_DISABLED, &a->flags);
 513                clear_bit(AF_CHPRST_PENDING, &a->flags);
 514                clear_bit(AF_DISC_PENDING, &a->flags);
 515
 516                esas2r_disable_chip_interrupts(a);
 517                a->int_mask = 0;
 518                esas2r_process_adapter_reset(a);
 519
 520                esas2r_log(ESAS2R_LOG_CRIT,
 521                           "Adapter disabled because of hardware failure");
 522        } else {
 523                bool alrdyrst = test_and_set_bit(AF_CHPRST_STARTED, &a->flags);
 524
 525                if (!alrdyrst)
 526                        /*
 527                         * Only disable interrupts if this is
 528                         * the first reset attempt.
 529                         */
 530                        esas2r_disable_chip_interrupts(a);
 531
 532                if ((test_bit(AF_POWER_MGT, &a->flags)) &&
 533                    !test_bit(AF_FIRST_INIT, &a->flags) && !alrdyrst) {
 534                        /*
 535                         * Don't reset the chip on the first
 536                         * deferred power up attempt.
 537                         */
 538                } else {
 539                        esas2r_hdebug("*** resetting chip ***");
 540                        esas2r_reset_chip(a);
 541                }
 542
 543                /* Kick off the reinitialization */
 544                a->chip_uptime += ESAS2R_CHP_UPTIME_CNT;
 545                a->chip_init_time = jiffies_to_msecs(jiffies);
 546                if (!test_bit(AF_POWER_MGT, &a->flags)) {
 547                        esas2r_process_adapter_reset(a);
 548
 549                        if (!alrdyrst) {
 550                                /* Remove devices now that I/O is cleaned up. */
 551                                a->prev_dev_cnt =
 552                                        esas2r_targ_db_get_tgt_cnt(a);
 553                                esas2r_targ_db_remove_all(a, false);
 554                        }
 555                }
 556
 557                a->int_mask = 0;
 558        }
 559}
 560
 561static void esas2r_handle_chip_rst_during_tasklet(struct esas2r_adapter *a)
 562{
 563        while (test_bit(AF_CHPRST_DETECTED, &a->flags)) {
 564                /*
 565                 * Balance the enable in esas2r_initadapter_hw.
 566                 * Esas2r_power_down already took care of it for power
 567                 * management.
 568                 */
 569                if (!test_bit(AF_DEGRADED_MODE, &a->flags) &&
 570                    !test_bit(AF_POWER_MGT, &a->flags))
 571                        esas2r_disable_chip_interrupts(a);
 572
 573                /* Reinitialize the chip. */
 574                esas2r_check_adapter(a);
 575                esas2r_init_adapter_hw(a, 0);
 576
 577                if (test_bit(AF_CHPRST_NEEDED, &a->flags))
 578                        break;
 579
 580                if (test_bit(AF_POWER_MGT, &a->flags)) {
 581                        /* Recovery from power management. */
 582                        if (test_bit(AF_FIRST_INIT, &a->flags)) {
 583                                /* Chip reset during normal power up */
 584                                esas2r_log(ESAS2R_LOG_CRIT,
 585                                           "The firmware was reset during a normal power-up sequence");
 586                        } else {
 587                                /* Deferred power up complete. */
 588                                clear_bit(AF_POWER_MGT, &a->flags);
 589                                esas2r_send_reset_ae(a, true);
 590                        }
 591                } else {
 592                        /* Recovery from online chip reset. */
 593                        if (test_bit(AF_FIRST_INIT, &a->flags)) {
 594                                /* Chip reset during driver load */
 595                        } else {
 596                                /* Chip reset after driver load */
 597                                esas2r_send_reset_ae(a, false);
 598                        }
 599
 600                        esas2r_log(ESAS2R_LOG_CRIT,
 601                                   "Recovering from a chip reset while the chip was online");
 602                }
 603
 604                clear_bit(AF_CHPRST_STARTED, &a->flags);
 605                esas2r_enable_chip_interrupts(a);
 606
 607                /*
 608                 * Clear this flag last!  this indicates that the chip has been
 609                 * reset already during initialization.
 610                 */
 611                clear_bit(AF_CHPRST_DETECTED, &a->flags);
 612        }
 613}
 614
 615
 616/* Perform deferred tasks when chip interrupts are disabled */
 617void esas2r_do_tasklet_tasks(struct esas2r_adapter *a)
 618{
 619
 620        if (test_bit(AF_CHPRST_NEEDED, &a->flags) ||
 621            test_bit(AF_CHPRST_DETECTED, &a->flags)) {
 622                if (test_bit(AF_CHPRST_NEEDED, &a->flags))
 623                        esas2r_chip_rst_needed_during_tasklet(a);
 624
 625                esas2r_handle_chip_rst_during_tasklet(a);
 626        }
 627
 628        if (test_bit(AF_BUSRST_NEEDED, &a->flags)) {
 629                esas2r_hdebug("hard resetting bus");
 630
 631                clear_bit(AF_BUSRST_NEEDED, &a->flags);
 632
 633                if (test_bit(AF_FLASHING, &a->flags))
 634                        set_bit(AF_BUSRST_DETECTED, &a->flags);
 635                else
 636                        esas2r_write_register_dword(a, MU_DOORBELL_IN,
 637                                                    DRBL_RESET_BUS);
 638        }
 639
 640        if (test_bit(AF_BUSRST_DETECTED, &a->flags)) {
 641                esas2r_process_bus_reset(a);
 642
 643                esas2r_log_dev(ESAS2R_LOG_WARN,
 644                               &(a->host->shost_gendev),
 645                               "scsi_report_bus_reset() called");
 646
 647                scsi_report_bus_reset(a->host, 0);
 648
 649                clear_bit(AF_BUSRST_DETECTED, &a->flags);
 650                clear_bit(AF_BUSRST_PENDING, &a->flags);
 651
 652                esas2r_log(ESAS2R_LOG_WARN, "Bus reset complete");
 653        }
 654
 655        if (test_bit(AF_PORT_CHANGE, &a->flags)) {
 656                clear_bit(AF_PORT_CHANGE, &a->flags);
 657
 658                esas2r_targ_db_report_changes(a);
 659        }
 660
 661        if (atomic_read(&a->disable_cnt) == 0)
 662                esas2r_do_deferred_processes(a);
 663}
 664
 665static void esas2r_doorbell_interrupt(struct esas2r_adapter *a, u32 doorbell)
 666{
 667        if (!(doorbell & DRBL_FORCE_INT)) {
 668                esas2r_trace_enter();
 669                esas2r_trace("doorbell: %x", doorbell);
 670        }
 671
 672        /* First clear the doorbell bits */
 673        esas2r_write_register_dword(a, MU_DOORBELL_OUT, doorbell);
 674
 675        if (doorbell & DRBL_RESET_BUS)
 676                set_bit(AF_BUSRST_DETECTED, &a->flags);
 677
 678        if (doorbell & DRBL_FORCE_INT)
 679                clear_bit(AF_HEARTBEAT, &a->flags);
 680
 681        if (doorbell & DRBL_PANIC_REASON_MASK) {
 682                esas2r_hdebug("*** Firmware Panic ***");
 683                esas2r_log(ESAS2R_LOG_CRIT, "The firmware has panicked");
 684        }
 685
 686        if (doorbell & DRBL_FW_RESET) {
 687                set_bit(AF2_COREDUMP_AVAIL, &a->flags2);
 688                esas2r_local_reset_adapter(a);
 689        }
 690
 691        if (!(doorbell & DRBL_FORCE_INT)) {
 692                esas2r_trace_exit();
 693        }
 694}
 695
 696void esas2r_force_interrupt(struct esas2r_adapter *a)
 697{
 698        esas2r_write_register_dword(a, MU_DOORBELL_IN, DRBL_FORCE_INT |
 699                                    DRBL_DRV_VER);
 700}
 701
 702
 703static void esas2r_lun_event(struct esas2r_adapter *a, union atto_vda_ae *ae,
 704                             u16 target, u32 length)
 705{
 706        struct esas2r_target *t = a->targetdb + target;
 707        u32 cplen = length;
 708        unsigned long flags;
 709
 710        if (cplen > sizeof(t->lu_event))
 711                cplen = sizeof(t->lu_event);
 712
 713        esas2r_trace("ae->lu.dwevent: %x", ae->lu.dwevent);
 714        esas2r_trace("ae->lu.bystate: %x", ae->lu.bystate);
 715
 716        spin_lock_irqsave(&a->mem_lock, flags);
 717
 718        t->new_target_state = TS_INVALID;
 719
 720        if (ae->lu.dwevent  & VDAAE_LU_LOST) {
 721                t->new_target_state = TS_NOT_PRESENT;
 722        } else {
 723                switch (ae->lu.bystate) {
 724                case VDAAE_LU_NOT_PRESENT:
 725                case VDAAE_LU_OFFLINE:
 726                case VDAAE_LU_DELETED:
 727                case VDAAE_LU_FACTORY_DISABLED:
 728                        t->new_target_state = TS_NOT_PRESENT;
 729                        break;
 730
 731                case VDAAE_LU_ONLINE:
 732                case VDAAE_LU_DEGRADED:
 733                        t->new_target_state = TS_PRESENT;
 734                        break;
 735                }
 736        }
 737
 738        if (t->new_target_state != TS_INVALID) {
 739                memcpy(&t->lu_event, &ae->lu, cplen);
 740
 741                esas2r_disc_queue_event(a, DCDE_DEV_CHANGE);
 742        }
 743
 744        spin_unlock_irqrestore(&a->mem_lock, flags);
 745}
 746
 747
 748
 749void esas2r_ae_complete(struct esas2r_adapter *a, struct esas2r_request *rq)
 750{
 751        union atto_vda_ae *ae =
 752                (union atto_vda_ae *)rq->vda_rsp_data->ae_data.event_data;
 753        u32 length = le32_to_cpu(rq->func_rsp.ae_rsp.length);
 754        union atto_vda_ae *last =
 755                (union atto_vda_ae *)(rq->vda_rsp_data->ae_data.event_data
 756                                      + length);
 757
 758        esas2r_trace_enter();
 759        esas2r_trace("length: %d", length);
 760
 761        if (length > sizeof(struct atto_vda_ae_data)
 762            || (length & 3) != 0
 763            || length == 0) {
 764                esas2r_log(ESAS2R_LOG_WARN,
 765                           "The AE request response length (%p) is too long: %d",
 766                           rq, length);
 767
 768                esas2r_hdebug("aereq->length (0x%x) too long", length);
 769                esas2r_bugon();
 770
 771                last = ae;
 772        }
 773
 774        while (ae < last) {
 775                u16 target;
 776
 777                esas2r_trace("ae: %p", ae);
 778                esas2r_trace("ae->hdr: %p", &(ae->hdr));
 779
 780                length = ae->hdr.bylength;
 781
 782                if (length > (u32)((u8 *)last - (u8 *)ae)
 783                    || (length & 3) != 0
 784                    || length == 0) {
 785                        esas2r_log(ESAS2R_LOG_CRIT,
 786                                   "the async event length is invalid (%p): %d",
 787                                   ae, length);
 788
 789                        esas2r_hdebug("ae->hdr.length (0x%x) invalid", length);
 790                        esas2r_bugon();
 791
 792                        break;
 793                }
 794
 795                esas2r_nuxi_ae_data(ae);
 796
 797                esas2r_queue_fw_event(a, fw_event_vda_ae, ae,
 798                                      sizeof(union atto_vda_ae));
 799
 800                switch (ae->hdr.bytype) {
 801                case VDAAE_HDR_TYPE_RAID:
 802
 803                        if (ae->raid.dwflags & (VDAAE_GROUP_STATE
 804                                                | VDAAE_RBLD_STATE
 805                                                | VDAAE_MEMBER_CHG
 806                                                | VDAAE_PART_CHG)) {
 807                                esas2r_log(ESAS2R_LOG_INFO,
 808                                           "RAID event received - name:%s rebuild_state:%d group_state:%d",
 809                                           ae->raid.acname,
 810                                           ae->raid.byrebuild_state,
 811                                           ae->raid.bygroup_state);
 812                        }
 813
 814                        break;
 815
 816                case VDAAE_HDR_TYPE_LU:
 817                        esas2r_log(ESAS2R_LOG_INFO,
 818                                   "LUN event received: event:%d target_id:%d LUN:%d state:%d",
 819                                   ae->lu.dwevent,
 820                                   ae->lu.id.tgtlun.wtarget_id,
 821                                   ae->lu.id.tgtlun.bylun,
 822                                   ae->lu.bystate);
 823
 824                        target = ae->lu.id.tgtlun.wtarget_id;
 825
 826                        if (target < ESAS2R_MAX_TARGETS)
 827                                esas2r_lun_event(a, ae, target, length);
 828
 829                        break;
 830
 831                case VDAAE_HDR_TYPE_DISK:
 832                        esas2r_log(ESAS2R_LOG_INFO, "Disk event received");
 833                        break;
 834
 835                default:
 836
 837                        /* Silently ignore the rest and let the apps deal with
 838                         * them.
 839                         */
 840
 841                        break;
 842                }
 843
 844                ae = (union atto_vda_ae *)((u8 *)ae + length);
 845        }
 846
 847        /* Now requeue it. */
 848        esas2r_start_ae_request(a, rq);
 849        esas2r_trace_exit();
 850}
 851
 852/* Send an asynchronous event for a chip reset or power management. */
 853void esas2r_send_reset_ae(struct esas2r_adapter *a, bool pwr_mgt)
 854{
 855        struct atto_vda_ae_hdr ae;
 856
 857        if (pwr_mgt)
 858                ae.bytype = VDAAE_HDR_TYPE_PWRMGT;
 859        else
 860                ae.bytype = VDAAE_HDR_TYPE_RESET;
 861
 862        ae.byversion = VDAAE_HDR_VER_0;
 863        ae.byflags = 0;
 864        ae.bylength = (u8)sizeof(struct atto_vda_ae_hdr);
 865
 866        if (pwr_mgt) {
 867                esas2r_hdebug("*** sending power management AE ***");
 868        } else {
 869                esas2r_hdebug("*** sending reset AE ***");
 870        }
 871
 872        esas2r_queue_fw_event(a, fw_event_vda_ae, &ae,
 873                              sizeof(union atto_vda_ae));
 874}
 875
 876void esas2r_dummy_complete(struct esas2r_adapter *a, struct esas2r_request *rq)
 877{}
 878
 879static void esas2r_check_req_rsp_sense(struct esas2r_adapter *a,
 880                                       struct esas2r_request *rq)
 881{
 882        u8 snslen, snslen2;
 883
 884        snslen = snslen2 = rq->func_rsp.scsi_rsp.sense_len;
 885
 886        if (snslen > rq->sense_len)
 887                snslen = rq->sense_len;
 888
 889        if (snslen) {
 890                if (rq->sense_buf)
 891                        memcpy(rq->sense_buf, rq->data_buf, snslen);
 892                else
 893                        rq->sense_buf = (u8 *)rq->data_buf;
 894
 895                /* See about possible sense data */
 896                if (snslen2 > 0x0c) {
 897                        u8 *s = (u8 *)rq->data_buf;
 898
 899                        esas2r_trace_enter();
 900
 901                        /* Report LUNS data has changed */
 902                        if (s[0x0c] == 0x3f && s[0x0d] == 0x0E) {
 903                                esas2r_trace("rq->target_id: %d",
 904                                             rq->target_id);
 905                                esas2r_target_state_changed(a, rq->target_id,
 906                                                            TS_LUN_CHANGE);
 907                        }
 908
 909                        esas2r_trace("add_sense_key=%x", s[0x0c]);
 910                        esas2r_trace("add_sense_qual=%x", s[0x0d]);
 911                        esas2r_trace_exit();
 912                }
 913        }
 914
 915        rq->sense_len = snslen;
 916}
 917
 918
 919void esas2r_complete_request(struct esas2r_adapter *a,
 920                             struct esas2r_request *rq)
 921{
 922        if (rq->vrq->scsi.function == VDA_FUNC_FLASH
 923            && rq->vrq->flash.sub_func == VDA_FLASH_COMMIT)
 924                clear_bit(AF_FLASHING, &a->flags);
 925
 926        /* See if we setup a callback to do special processing */
 927
 928        if (rq->interrupt_cb) {
 929                (*rq->interrupt_cb)(a, rq);
 930
 931                if (rq->req_stat == RS_PENDING) {
 932                        esas2r_start_request(a, rq);
 933                        return;
 934                }
 935        }
 936
 937        if (likely(rq->vrq->scsi.function == VDA_FUNC_SCSI)
 938            && unlikely(rq->req_stat != RS_SUCCESS)) {
 939                esas2r_check_req_rsp_sense(a, rq);
 940                esas2r_log_request_failure(a, rq);
 941        }
 942
 943        (*rq->comp_cb)(a, rq);
 944}
 945