9526f36026
While running 'sg_reset -H' back to back the following exception was seen: [ 735.115695] Faulting instruction address: 0xd0000000098c0864 cpu 0x0: Vector: 300 (Data Access) at [c000000ffffafa80] pc: d0000000098c0864: cxlflash_async_err_irq+0x84/0x5c0 [cxlflash] lr: c00000000013aed0: handle_irq_event_percpu+0xa0/0x310 sp: c000000ffffafd00 msr: 9000000000009033 dar: 2010000 dsisr: 40000000 current = 0xc000000001510880 paca = 0xc00000000fb80000 softe: 0 irq_happened: 0x01 pid = 0, comm = swapper/0 Linux version 4.5.0-491-26f710d+ enter ? for help [c000000ffffafe10] c00000000013aed0 handle_irq_event_percpu+0xa0/0x310 [c000000ffffafed0] c00000000013b1a8 handle_irq_event+0x68/0xc0 [c000000ffffaff00] c0000000001404ec handle_fasteoi_irq+0xec/0x2a0 [c000000ffffaff30] c00000000013a084 generic_handle_irq+0x54/0x80 [c000000ffffaff60] c000000000011130 __do_irq+0x80/0x1d0 [c000000ffffaff90] c000000000024d40 call_do_irq+0x14/0x24 [c000000001573a20] c000000000011318 do_IRQ+0x98/0x140 [c000000001573a70] c000000000002594 hardware_interrupt_common+0x114/0x180 This exception is being hit because the async_err interrupt path performs an MMIO to read the interrupt status register. The MMIO region in this case is not available. Commit6ded8b3cbd
("cxlflash: Unmap problem state area before detaching master context") re-ordered the sequence in which term_mc() and stop_afu() are called. This introduces a window for interrupts to come in with the problem space area unmapped, that did not exist previously. The fix is to separate the disabling of all AFU interrupts to a distinct function, term_intr() so that it is the first thing that is done in the tear down process. To keep the initialization process symmetric, separate the AFU interrupt setup also to a distinct function: init_intr(). Fixes:6ded8b3cbd
("cxlflash: Unmap problem state area before detaching master context") Signed-off-by: Manoj N. Kumar <manoj@linux.vnet.ibm.com> Acked-by: Matthew R. Ochs <mrochs@linux.vnet.ibm.com> Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de> Signed-off-by: Uma Krishnan <ukrishn@linux.vnet.ibm.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
108 lines
2.6 KiB
C
108 lines
2.6 KiB
C
/*
|
|
* CXL Flash Device Driver
|
|
*
|
|
* Written by: Manoj N. Kumar <manoj@linux.vnet.ibm.com>, IBM Corporation
|
|
* Matthew R. Ochs <mrochs@linux.vnet.ibm.com>, IBM Corporation
|
|
*
|
|
* Copyright (C) 2015 IBM Corporation
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation; either version
|
|
* 2 of the License, or (at your option) any later version.
|
|
*/
|
|
|
|
#ifndef _CXLFLASH_MAIN_H
|
|
#define _CXLFLASH_MAIN_H
|
|
|
|
#include <linux/list.h>
|
|
#include <linux/types.h>
|
|
#include <scsi/scsi.h>
|
|
#include <scsi/scsi_device.h>
|
|
|
|
#define CXLFLASH_NAME "cxlflash"
|
|
#define CXLFLASH_ADAPTER_NAME "IBM POWER CXL Flash Adapter"
|
|
|
|
#define PCI_DEVICE_ID_IBM_CORSA 0x04F0
|
|
#define PCI_DEVICE_ID_IBM_FLASH_GT 0x0600
|
|
|
|
/* Since there is only one target, make it 0 */
|
|
#define CXLFLASH_TARGET 0
|
|
#define CXLFLASH_MAX_CDB_LEN 16
|
|
|
|
/* Really only one target per bus since the Texan is directly attached */
|
|
#define CXLFLASH_MAX_NUM_TARGETS_PER_BUS 1
|
|
#define CXLFLASH_MAX_NUM_LUNS_PER_TARGET 65536
|
|
|
|
#define CXLFLASH_PCI_ERROR_RECOVERY_TIMEOUT (120 * HZ)
|
|
|
|
#define NUM_FC_PORTS CXLFLASH_NUM_FC_PORTS /* ports per AFU */
|
|
|
|
/* FC defines */
|
|
#define FC_MTIP_CMDCONFIG 0x010
|
|
#define FC_MTIP_STATUS 0x018
|
|
|
|
#define FC_PNAME 0x300
|
|
#define FC_CONFIG 0x320
|
|
#define FC_CONFIG2 0x328
|
|
#define FC_STATUS 0x330
|
|
#define FC_ERROR 0x380
|
|
#define FC_ERRCAP 0x388
|
|
#define FC_ERRMSK 0x390
|
|
#define FC_CNT_CRCERR 0x538
|
|
#define FC_CRC_THRESH 0x580
|
|
|
|
#define FC_MTIP_CMDCONFIG_ONLINE 0x20ULL
|
|
#define FC_MTIP_CMDCONFIG_OFFLINE 0x40ULL
|
|
|
|
#define FC_MTIP_STATUS_MASK 0x30ULL
|
|
#define FC_MTIP_STATUS_ONLINE 0x20ULL
|
|
#define FC_MTIP_STATUS_OFFLINE 0x10ULL
|
|
|
|
/* TIMEOUT and RETRY definitions */
|
|
|
|
/* AFU command timeout values */
|
|
#define MC_AFU_SYNC_TIMEOUT 5 /* 5 secs */
|
|
|
|
/* AFU command room retry limit */
|
|
#define MC_ROOM_RETRY_CNT 10
|
|
|
|
/* FC CRC clear periodic timer */
|
|
#define MC_CRC_THRESH 100 /* threshold in 5 mins */
|
|
|
|
#define FC_PORT_STATUS_RETRY_CNT 100 /* 100 100ms retries = 10 seconds */
|
|
#define FC_PORT_STATUS_RETRY_INTERVAL_US 100000 /* microseconds */
|
|
|
|
/* VPD defines */
|
|
#define CXLFLASH_VPD_LEN 256
|
|
#define WWPN_LEN 16
|
|
#define WWPN_BUF_LEN (WWPN_LEN + 1)
|
|
|
|
enum undo_level {
|
|
UNDO_NOOP = 0,
|
|
FREE_IRQ,
|
|
UNMAP_ONE,
|
|
UNMAP_TWO,
|
|
UNMAP_THREE
|
|
};
|
|
|
|
struct dev_dependent_vals {
|
|
u64 max_sectors;
|
|
};
|
|
|
|
struct asyc_intr_info {
|
|
u64 status;
|
|
char *desc;
|
|
u8 port;
|
|
u8 action;
|
|
#define CLR_FC_ERROR 0x01
|
|
#define LINK_RESET 0x02
|
|
#define SCAN_HOST 0x04
|
|
};
|
|
|
|
#ifndef CONFIG_CXL_EEH
|
|
#define cxl_perst_reloads_same_image(_a, _b) do { } while (0)
|
|
#endif
|
|
|
|
#endif /* _CXLFLASH_MAIN_H */
|