^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * driver for Microsemi PQI-based storage controllers
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * Copyright (c) 2019-2020 Microchip Technology Inc. and its subsidiaries
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Copyright (c) 2016-2018 Microsemi Corporation
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * Copyright (c) 2016 PMC-Sierra, Inc.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) * Questions/Comments/Bugfixes to storagedev@microchip.com
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include <linux/pci.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include <linux/delay.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #include <linux/interrupt.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #include <linux/sched.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #include <linux/rtc.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #include <linux/bcd.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #include <linux/reboot.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #include <linux/cciss_ioctl.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #include <linux/blk-mq-pci.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #include <scsi/scsi_host.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #include <scsi/scsi_cmnd.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #include <scsi/scsi_device.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) #include <scsi/scsi_eh.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #include <scsi/scsi_transport_sas.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #include <asm/unaligned.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) #include "smartpqi.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) #include "smartpqi_sis.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) #if !defined(BUILD_TIMESTAMP)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) #define BUILD_TIMESTAMP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) #define DRIVER_VERSION "1.2.16-010"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) #define DRIVER_MAJOR 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) #define DRIVER_MINOR 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) #define DRIVER_RELEASE 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) #define DRIVER_REVISION 10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) #define DRIVER_NAME "Microsemi PQI Driver (v" \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) DRIVER_VERSION BUILD_TIMESTAMP ")"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) #define DRIVER_NAME_SHORT "smartpqi"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) #define PQI_EXTRA_SGL_MEMORY (12 * sizeof(struct pqi_sg_descriptor))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) MODULE_AUTHOR("Microsemi");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) MODULE_DESCRIPTION("Driver for Microsemi Smart Family Controller version "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) DRIVER_VERSION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) MODULE_SUPPORTED_DEVICE("Microsemi Smart Family Controllers");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) MODULE_VERSION(DRIVER_VERSION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) MODULE_LICENSE("GPL");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) static void pqi_take_ctrl_offline(struct pqi_ctrl_info *ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) static void pqi_ctrl_offline_worker(struct work_struct *work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) static void pqi_retry_raid_bypass_requests(struct pqi_ctrl_info *ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) static int pqi_scan_scsi_devices(struct pqi_ctrl_info *ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) static void pqi_scan_start(struct Scsi_Host *shost);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) static void pqi_start_io(struct pqi_ctrl_info *ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) struct pqi_queue_group *queue_group, enum pqi_io_path path,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) struct pqi_io_request *io_request);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) static int pqi_submit_raid_request_synchronous(struct pqi_ctrl_info *ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) struct pqi_iu_header *request, unsigned int flags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) struct pqi_raid_error_info *error_info, unsigned long timeout_msecs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) static int pqi_aio_submit_io(struct pqi_ctrl_info *ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) struct scsi_cmnd *scmd, u32 aio_handle, u8 *cdb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) unsigned int cdb_length, struct pqi_queue_group *queue_group,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) struct pqi_encryption_info *encryption_info, bool raid_bypass);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) static void pqi_ofa_ctrl_quiesce(struct pqi_ctrl_info *ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) static void pqi_ofa_ctrl_unquiesce(struct pqi_ctrl_info *ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) static int pqi_ofa_ctrl_restart(struct pqi_ctrl_info *ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) static void pqi_ofa_setup_host_buffer(struct pqi_ctrl_info *ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) u32 bytes_requested);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) static void pqi_ofa_free_host_buffer(struct pqi_ctrl_info *ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) static int pqi_ofa_host_memory_update(struct pqi_ctrl_info *ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) static int pqi_device_wait_for_pending_io(struct pqi_ctrl_info *ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) struct pqi_scsi_dev *device, unsigned long timeout_secs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) /* for flags argument to pqi_submit_raid_request_synchronous() */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) #define PQI_SYNC_FLAGS_INTERRUPTABLE 0x1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) static struct scsi_transport_template *pqi_sas_transport_template;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) static atomic_t pqi_controller_count = ATOMIC_INIT(0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) enum pqi_lockup_action {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) NONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) REBOOT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) PANIC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) static enum pqi_lockup_action pqi_lockup_action = NONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) static struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) enum pqi_lockup_action action;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) char *name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) } pqi_lockup_actions[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) .action = NONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) .name = "none",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) .action = REBOOT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) .name = "reboot",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) .action = PANIC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) .name = "panic",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) static unsigned int pqi_supported_event_types[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) PQI_EVENT_TYPE_HOTPLUG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) PQI_EVENT_TYPE_HARDWARE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) PQI_EVENT_TYPE_PHYSICAL_DEVICE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) PQI_EVENT_TYPE_LOGICAL_DEVICE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) PQI_EVENT_TYPE_OFA,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) PQI_EVENT_TYPE_AIO_STATE_CHANGE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) PQI_EVENT_TYPE_AIO_CONFIG_CHANGE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) static int pqi_disable_device_id_wildcards;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) module_param_named(disable_device_id_wildcards,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) pqi_disable_device_id_wildcards, int, 0644);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) MODULE_PARM_DESC(disable_device_id_wildcards,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) "Disable device ID wildcards.");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) static int pqi_disable_heartbeat;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) module_param_named(disable_heartbeat,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) pqi_disable_heartbeat, int, 0644);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) MODULE_PARM_DESC(disable_heartbeat,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) "Disable heartbeat.");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) static int pqi_disable_ctrl_shutdown;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) module_param_named(disable_ctrl_shutdown,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) pqi_disable_ctrl_shutdown, int, 0644);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) MODULE_PARM_DESC(disable_ctrl_shutdown,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) "Disable controller shutdown when controller locked up.");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) static char *pqi_lockup_action_param;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) module_param_named(lockup_action,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) pqi_lockup_action_param, charp, 0644);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) MODULE_PARM_DESC(lockup_action, "Action to take when controller locked up.\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) "\t\tSupported: none, reboot, panic\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) "\t\tDefault: none");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) static int pqi_expose_ld_first;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) module_param_named(expose_ld_first,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) pqi_expose_ld_first, int, 0644);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) MODULE_PARM_DESC(expose_ld_first,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) "Expose logical drives before physical drives.");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) static int pqi_hide_vsep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) module_param_named(hide_vsep,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) pqi_hide_vsep, int, 0644);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) MODULE_PARM_DESC(hide_vsep,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) "Hide the virtual SEP for direct attached drives.");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) static char *raid_levels[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) "RAID-0",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) "RAID-4",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) "RAID-1(1+0)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) "RAID-5",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) "RAID-5+1",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) "RAID-ADG",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) "RAID-1(ADM)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) static char *pqi_raid_level_to_string(u8 raid_level)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) if (raid_level < ARRAY_SIZE(raid_levels))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) return raid_levels[raid_level];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) return "RAID UNKNOWN";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) #define SA_RAID_0 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) #define SA_RAID_4 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) #define SA_RAID_1 2 /* also used for RAID 10 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) #define SA_RAID_5 3 /* also used for RAID 50 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) #define SA_RAID_51 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) #define SA_RAID_6 5 /* also used for RAID 60 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) #define SA_RAID_ADM 6 /* also used for RAID 1+0 ADM */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) #define SA_RAID_MAX SA_RAID_ADM
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) #define SA_RAID_UNKNOWN 0xff
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) static inline void pqi_scsi_done(struct scsi_cmnd *scmd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) pqi_prep_for_scsi_done(scmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) scmd->scsi_done(scmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) static inline void pqi_disable_write_same(struct scsi_device *sdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) sdev->no_write_same = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) static inline bool pqi_scsi3addr_equal(u8 *scsi3addr1, u8 *scsi3addr2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) return memcmp(scsi3addr1, scsi3addr2, 8) == 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) static inline bool pqi_is_logical_device(struct pqi_scsi_dev *device)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) return !device->is_physical_device;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) static inline bool pqi_is_external_raid_addr(u8 *scsi3addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) return scsi3addr[2] != 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) static inline bool pqi_ctrl_offline(struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) return !ctrl_info->controller_online;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) static inline void pqi_check_ctrl_health(struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) if (ctrl_info->controller_online)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) if (!sis_is_firmware_running(ctrl_info))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) pqi_take_ctrl_offline(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) static inline bool pqi_is_hba_lunid(u8 *scsi3addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) return pqi_scsi3addr_equal(scsi3addr, RAID_CTLR_LUNID);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) static inline enum pqi_ctrl_mode pqi_get_ctrl_mode(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) return sis_read_driver_scratch(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) static inline void pqi_save_ctrl_mode(struct pqi_ctrl_info *ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) enum pqi_ctrl_mode mode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) sis_write_driver_scratch(ctrl_info, mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) static inline void pqi_ctrl_block_device_reset(struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) ctrl_info->block_device_reset = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) static inline bool pqi_device_reset_blocked(struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) return ctrl_info->block_device_reset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) static inline bool pqi_ctrl_blocked(struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) return ctrl_info->block_requests;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) static inline void pqi_ctrl_block_requests(struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) ctrl_info->block_requests = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) scsi_block_requests(ctrl_info->scsi_host);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) static inline void pqi_ctrl_unblock_requests(struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) ctrl_info->block_requests = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) wake_up_all(&ctrl_info->block_requests_wait);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) pqi_retry_raid_bypass_requests(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) scsi_unblock_requests(ctrl_info->scsi_host);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) static unsigned long pqi_wait_if_ctrl_blocked(struct pqi_ctrl_info *ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) unsigned long timeout_msecs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) unsigned long remaining_msecs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) if (!pqi_ctrl_blocked(ctrl_info))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) return timeout_msecs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) atomic_inc(&ctrl_info->num_blocked_threads);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) if (timeout_msecs == NO_TIMEOUT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) wait_event(ctrl_info->block_requests_wait,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) !pqi_ctrl_blocked(ctrl_info));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) remaining_msecs = timeout_msecs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) unsigned long remaining_jiffies;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) remaining_jiffies =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) wait_event_timeout(ctrl_info->block_requests_wait,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) !pqi_ctrl_blocked(ctrl_info),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) msecs_to_jiffies(timeout_msecs));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) remaining_msecs = jiffies_to_msecs(remaining_jiffies);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) atomic_dec(&ctrl_info->num_blocked_threads);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) return remaining_msecs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) static inline void pqi_ctrl_wait_until_quiesced(struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) while (atomic_read(&ctrl_info->num_busy_threads) >
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) atomic_read(&ctrl_info->num_blocked_threads))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) usleep_range(1000, 2000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) static inline bool pqi_device_offline(struct pqi_scsi_dev *device)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) return device->device_offline;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) static inline void pqi_device_reset_start(struct pqi_scsi_dev *device)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) device->in_reset = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) static inline void pqi_device_reset_done(struct pqi_scsi_dev *device)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) device->in_reset = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) static inline bool pqi_device_in_reset(struct pqi_scsi_dev *device)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) return device->in_reset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) static inline void pqi_ctrl_ofa_start(struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) ctrl_info->in_ofa = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) static inline void pqi_ctrl_ofa_done(struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) ctrl_info->in_ofa = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) static inline bool pqi_ctrl_in_ofa(struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) return ctrl_info->in_ofa;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) static inline void pqi_device_remove_start(struct pqi_scsi_dev *device)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) device->in_remove = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) static inline bool pqi_device_in_remove(struct pqi_ctrl_info *ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) struct pqi_scsi_dev *device)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) return device->in_remove && !ctrl_info->in_shutdown;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) static inline void pqi_ctrl_shutdown_start(struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) ctrl_info->in_shutdown = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) static inline bool pqi_ctrl_in_shutdown(struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) return ctrl_info->in_shutdown;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) static inline void pqi_schedule_rescan_worker_with_delay(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) struct pqi_ctrl_info *ctrl_info, unsigned long delay)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) if (pqi_ctrl_offline(ctrl_info))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) if (pqi_ctrl_in_ofa(ctrl_info))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) schedule_delayed_work(&ctrl_info->rescan_work, delay);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) static inline void pqi_schedule_rescan_worker(struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) pqi_schedule_rescan_worker_with_delay(ctrl_info, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) #define PQI_RESCAN_WORK_DELAY (10 * PQI_HZ)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) static inline void pqi_schedule_rescan_worker_delayed(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) pqi_schedule_rescan_worker_with_delay(ctrl_info, PQI_RESCAN_WORK_DELAY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) static inline void pqi_cancel_rescan_worker(struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) cancel_delayed_work_sync(&ctrl_info->rescan_work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) static inline void pqi_cancel_event_worker(struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) cancel_work_sync(&ctrl_info->event_work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) static inline u32 pqi_read_heartbeat_counter(struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) if (!ctrl_info->heartbeat_counter)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) return readl(ctrl_info->heartbeat_counter);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) static inline u8 pqi_read_soft_reset_status(struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) if (!ctrl_info->soft_reset_status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) return readb(ctrl_info->soft_reset_status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) static inline void pqi_clear_soft_reset_status(struct pqi_ctrl_info *ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) u8 clear)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) u8 status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) if (!ctrl_info->soft_reset_status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) status = pqi_read_soft_reset_status(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) status &= ~clear;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) writeb(status, ctrl_info->soft_reset_status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) static int pqi_map_single(struct pci_dev *pci_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) struct pqi_sg_descriptor *sg_descriptor, void *buffer,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) size_t buffer_length, enum dma_data_direction data_direction)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) dma_addr_t bus_address;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) if (!buffer || buffer_length == 0 || data_direction == DMA_NONE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) bus_address = dma_map_single(&pci_dev->dev, buffer, buffer_length,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) data_direction);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) if (dma_mapping_error(&pci_dev->dev, bus_address))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) put_unaligned_le64((u64)bus_address, &sg_descriptor->address);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) put_unaligned_le32(buffer_length, &sg_descriptor->length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) put_unaligned_le32(CISS_SG_LAST, &sg_descriptor->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) static void pqi_pci_unmap(struct pci_dev *pci_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) struct pqi_sg_descriptor *descriptors, int num_descriptors,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) enum dma_data_direction data_direction)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) if (data_direction == DMA_NONE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) for (i = 0; i < num_descriptors; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) dma_unmap_single(&pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) (dma_addr_t)get_unaligned_le64(&descriptors[i].address),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) get_unaligned_le32(&descriptors[i].length),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) data_direction);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) static int pqi_build_raid_path_request(struct pqi_ctrl_info *ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) struct pqi_raid_path_request *request, u8 cmd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) u8 *scsi3addr, void *buffer, size_t buffer_length,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) u16 vpd_page, enum dma_data_direction *dir)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) u8 *cdb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) size_t cdb_length = buffer_length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) memset(request, 0, sizeof(*request));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) request->header.iu_type = PQI_REQUEST_IU_RAID_PATH_IO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) put_unaligned_le16(offsetof(struct pqi_raid_path_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) sg_descriptors[1]) - PQI_REQUEST_HEADER_LENGTH,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) &request->header.iu_length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) put_unaligned_le32(buffer_length, &request->buffer_length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) memcpy(request->lun_number, scsi3addr, sizeof(request->lun_number));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) request->task_attribute = SOP_TASK_ATTRIBUTE_SIMPLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) request->additional_cdb_bytes_usage = SOP_ADDITIONAL_CDB_BYTES_0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) cdb = request->cdb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) switch (cmd) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) case INQUIRY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) request->data_direction = SOP_READ_FLAG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) cdb[0] = INQUIRY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) if (vpd_page & VPD_PAGE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) cdb[1] = 0x1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) cdb[2] = (u8)vpd_page;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) cdb[4] = (u8)cdb_length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) case CISS_REPORT_LOG:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) case CISS_REPORT_PHYS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) request->data_direction = SOP_READ_FLAG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) cdb[0] = cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) if (cmd == CISS_REPORT_PHYS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) cdb[1] = CISS_REPORT_PHYS_FLAG_OTHER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) cdb[1] = CISS_REPORT_LOG_FLAG_UNIQUE_LUN_ID;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) put_unaligned_be32(cdb_length, &cdb[6]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) case CISS_GET_RAID_MAP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) request->data_direction = SOP_READ_FLAG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) cdb[0] = CISS_READ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) cdb[1] = CISS_GET_RAID_MAP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) put_unaligned_be32(cdb_length, &cdb[6]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) case SA_FLUSH_CACHE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) request->data_direction = SOP_WRITE_FLAG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) cdb[0] = BMIC_WRITE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) cdb[6] = BMIC_FLUSH_CACHE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) put_unaligned_be16(cdb_length, &cdb[7]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) case BMIC_SENSE_DIAG_OPTIONS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) cdb_length = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) case BMIC_IDENTIFY_CONTROLLER:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) case BMIC_IDENTIFY_PHYSICAL_DEVICE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) case BMIC_SENSE_SUBSYSTEM_INFORMATION:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) request->data_direction = SOP_READ_FLAG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) cdb[0] = BMIC_READ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) cdb[6] = cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) put_unaligned_be16(cdb_length, &cdb[7]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) case BMIC_SET_DIAG_OPTIONS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) cdb_length = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) case BMIC_WRITE_HOST_WELLNESS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) request->data_direction = SOP_WRITE_FLAG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) cdb[0] = BMIC_WRITE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) cdb[6] = cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) put_unaligned_be16(cdb_length, &cdb[7]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) case BMIC_CSMI_PASSTHRU:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) request->data_direction = SOP_BIDIRECTIONAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) cdb[0] = BMIC_WRITE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) cdb[5] = CSMI_CC_SAS_SMP_PASSTHRU;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) cdb[6] = cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) put_unaligned_be16(cdb_length, &cdb[7]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) dev_err(&ctrl_info->pci_dev->dev, "unknown command 0x%c\n", cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) switch (request->data_direction) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) case SOP_READ_FLAG:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) *dir = DMA_FROM_DEVICE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) case SOP_WRITE_FLAG:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) *dir = DMA_TO_DEVICE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) case SOP_NO_DIRECTION_FLAG:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) *dir = DMA_NONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) *dir = DMA_BIDIRECTIONAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) return pqi_map_single(ctrl_info->pci_dev, &request->sg_descriptors[0],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) buffer, buffer_length, *dir);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) static inline void pqi_reinit_io_request(struct pqi_io_request *io_request)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) io_request->scmd = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) io_request->status = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) io_request->error_info = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) io_request->raid_bypass = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) static struct pqi_io_request *pqi_alloc_io_request(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) struct pqi_io_request *io_request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) u16 i = ctrl_info->next_io_request_slot; /* benignly racy */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) while (1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) io_request = &ctrl_info->io_request_pool[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) if (atomic_inc_return(&io_request->refcount) == 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) atomic_dec(&io_request->refcount);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) i = (i + 1) % ctrl_info->max_io_slots;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) /* benignly racy */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) ctrl_info->next_io_request_slot = (i + 1) % ctrl_info->max_io_slots;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) pqi_reinit_io_request(io_request);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) return io_request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) static void pqi_free_io_request(struct pqi_io_request *io_request)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) atomic_dec(&io_request->refcount);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) static int pqi_send_scsi_raid_request(struct pqi_ctrl_info *ctrl_info, u8 cmd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) u8 *scsi3addr, void *buffer, size_t buffer_length, u16 vpd_page,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) struct pqi_raid_error_info *error_info, unsigned long timeout_msecs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) struct pqi_raid_path_request request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) enum dma_data_direction dir;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) rc = pqi_build_raid_path_request(ctrl_info, &request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) cmd, scsi3addr, buffer,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) buffer_length, vpd_page, &dir);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) rc = pqi_submit_raid_request_synchronous(ctrl_info, &request.header, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) error_info, timeout_msecs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) pqi_pci_unmap(ctrl_info->pci_dev, request.sg_descriptors, 1, dir);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) /* helper functions for pqi_send_scsi_raid_request */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) static inline int pqi_send_ctrl_raid_request(struct pqi_ctrl_info *ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) u8 cmd, void *buffer, size_t buffer_length)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) return pqi_send_scsi_raid_request(ctrl_info, cmd, RAID_CTLR_LUNID,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) buffer, buffer_length, 0, NULL, NO_TIMEOUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) static inline int pqi_send_ctrl_raid_with_error(struct pqi_ctrl_info *ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) u8 cmd, void *buffer, size_t buffer_length,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) struct pqi_raid_error_info *error_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) return pqi_send_scsi_raid_request(ctrl_info, cmd, RAID_CTLR_LUNID,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) buffer, buffer_length, 0, error_info, NO_TIMEOUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) static inline int pqi_identify_controller(struct pqi_ctrl_info *ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) struct bmic_identify_controller *buffer)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) return pqi_send_ctrl_raid_request(ctrl_info, BMIC_IDENTIFY_CONTROLLER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) buffer, sizeof(*buffer));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) static inline int pqi_sense_subsystem_info(struct pqi_ctrl_info *ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) struct bmic_sense_subsystem_info *sense_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) return pqi_send_ctrl_raid_request(ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) BMIC_SENSE_SUBSYSTEM_INFORMATION, sense_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) sizeof(*sense_info));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) static inline int pqi_scsi_inquiry(struct pqi_ctrl_info *ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) u8 *scsi3addr, u16 vpd_page, void *buffer, size_t buffer_length)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) return pqi_send_scsi_raid_request(ctrl_info, INQUIRY, scsi3addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) buffer, buffer_length, vpd_page, NULL, NO_TIMEOUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) static int pqi_identify_physical_device(struct pqi_ctrl_info *ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) struct pqi_scsi_dev *device,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) struct bmic_identify_physical_device *buffer, size_t buffer_length)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) enum dma_data_direction dir;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) u16 bmic_device_index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) struct pqi_raid_path_request request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) rc = pqi_build_raid_path_request(ctrl_info, &request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) BMIC_IDENTIFY_PHYSICAL_DEVICE, RAID_CTLR_LUNID, buffer,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) buffer_length, 0, &dir);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) bmic_device_index = CISS_GET_DRIVE_NUMBER(device->scsi3addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) request.cdb[2] = (u8)bmic_device_index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) request.cdb[9] = (u8)(bmic_device_index >> 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) rc = pqi_submit_raid_request_synchronous(ctrl_info, &request.header,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) 0, NULL, NO_TIMEOUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) pqi_pci_unmap(ctrl_info->pci_dev, request.sg_descriptors, 1, dir);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) static int pqi_flush_cache(struct pqi_ctrl_info *ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) enum bmic_flush_cache_shutdown_event shutdown_event)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) struct bmic_flush_cache *flush_cache;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) * Don't bother trying to flush the cache if the controller is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) * locked up.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) if (pqi_ctrl_offline(ctrl_info))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) return -ENXIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) flush_cache = kzalloc(sizeof(*flush_cache), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) if (!flush_cache)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) flush_cache->shutdown_event = shutdown_event;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) rc = pqi_send_ctrl_raid_request(ctrl_info, SA_FLUSH_CACHE, flush_cache,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) sizeof(*flush_cache));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) kfree(flush_cache);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) int pqi_csmi_smp_passthru(struct pqi_ctrl_info *ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) struct bmic_csmi_smp_passthru_buffer *buffer, size_t buffer_length,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) struct pqi_raid_error_info *error_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) return pqi_send_ctrl_raid_with_error(ctrl_info, BMIC_CSMI_PASSTHRU,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) buffer, buffer_length, error_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) #define PQI_FETCH_PTRAID_DATA (1 << 31)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) static int pqi_set_diag_rescan(struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) struct bmic_diag_options *diag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) diag = kzalloc(sizeof(*diag), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) if (!diag)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) rc = pqi_send_ctrl_raid_request(ctrl_info, BMIC_SENSE_DIAG_OPTIONS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) diag, sizeof(*diag));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) diag->options |= cpu_to_le32(PQI_FETCH_PTRAID_DATA);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744) rc = pqi_send_ctrl_raid_request(ctrl_info, BMIC_SET_DIAG_OPTIONS, diag,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) sizeof(*diag));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) kfree(diag);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) static inline int pqi_write_host_wellness(struct pqi_ctrl_info *ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754) void *buffer, size_t buffer_length)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) return pqi_send_ctrl_raid_request(ctrl_info, BMIC_WRITE_HOST_WELLNESS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) buffer, buffer_length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) #pragma pack(1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) struct bmic_host_wellness_driver_version {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) u8 start_tag[4];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764) u8 driver_version_tag[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765) __le16 driver_version_length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766) char driver_version[32];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) u8 dont_write_tag[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768) u8 end_tag[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) #pragma pack()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) static int pqi_write_driver_version_to_host_wellness(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777) struct bmic_host_wellness_driver_version *buffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778) size_t buffer_length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780) buffer_length = sizeof(*buffer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) buffer = kmalloc(buffer_length, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783) if (!buffer)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786) buffer->start_tag[0] = '<';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787) buffer->start_tag[1] = 'H';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) buffer->start_tag[2] = 'W';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789) buffer->start_tag[3] = '>';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) buffer->driver_version_tag[0] = 'D';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791) buffer->driver_version_tag[1] = 'V';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) put_unaligned_le16(sizeof(buffer->driver_version),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793) &buffer->driver_version_length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) strncpy(buffer->driver_version, "Linux " DRIVER_VERSION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795) sizeof(buffer->driver_version) - 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796) buffer->driver_version[sizeof(buffer->driver_version) - 1] = '\0';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797) buffer->dont_write_tag[0] = 'D';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798) buffer->dont_write_tag[1] = 'W';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799) buffer->end_tag[0] = 'Z';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) buffer->end_tag[1] = 'Z';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) rc = pqi_write_host_wellness(ctrl_info, buffer, buffer_length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804) kfree(buffer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809) #pragma pack(1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811) struct bmic_host_wellness_time {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812) u8 start_tag[4];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813) u8 time_tag[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814) __le16 time_length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815) u8 time[8];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816) u8 dont_write_tag[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817) u8 end_tag[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820) #pragma pack()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822) static int pqi_write_current_time_to_host_wellness(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823) struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826) struct bmic_host_wellness_time *buffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827) size_t buffer_length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828) time64_t local_time;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829) unsigned int year;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830) struct tm tm;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832) buffer_length = sizeof(*buffer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834) buffer = kmalloc(buffer_length, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835) if (!buffer)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838) buffer->start_tag[0] = '<';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839) buffer->start_tag[1] = 'H';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840) buffer->start_tag[2] = 'W';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841) buffer->start_tag[3] = '>';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842) buffer->time_tag[0] = 'T';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843) buffer->time_tag[1] = 'D';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844) put_unaligned_le16(sizeof(buffer->time),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845) &buffer->time_length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847) local_time = ktime_get_real_seconds();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848) time64_to_tm(local_time, -sys_tz.tz_minuteswest * 60, &tm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849) year = tm.tm_year + 1900;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851) buffer->time[0] = bin2bcd(tm.tm_hour);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852) buffer->time[1] = bin2bcd(tm.tm_min);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853) buffer->time[2] = bin2bcd(tm.tm_sec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854) buffer->time[3] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855) buffer->time[4] = bin2bcd(tm.tm_mon + 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856) buffer->time[5] = bin2bcd(tm.tm_mday);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857) buffer->time[6] = bin2bcd(year / 100);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858) buffer->time[7] = bin2bcd(year % 100);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860) buffer->dont_write_tag[0] = 'D';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861) buffer->dont_write_tag[1] = 'W';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862) buffer->end_tag[0] = 'Z';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863) buffer->end_tag[1] = 'Z';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865) rc = pqi_write_host_wellness(ctrl_info, buffer, buffer_length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867) kfree(buffer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872) #define PQI_UPDATE_TIME_WORK_INTERVAL (24UL * 60 * 60 * PQI_HZ)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874) static void pqi_update_time_worker(struct work_struct *work)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877) struct pqi_ctrl_info *ctrl_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879) ctrl_info = container_of(to_delayed_work(work), struct pqi_ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880) update_time_work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882) if (pqi_ctrl_offline(ctrl_info))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885) rc = pqi_write_current_time_to_host_wellness(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887) dev_warn(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888) "error updating time on controller\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890) schedule_delayed_work(&ctrl_info->update_time_work,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891) PQI_UPDATE_TIME_WORK_INTERVAL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 894) static inline void pqi_schedule_update_time_worker(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 895) struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 896) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897) schedule_delayed_work(&ctrl_info->update_time_work, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900) static inline void pqi_cancel_update_time_worker(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901) struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 902) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 903) cancel_delayed_work_sync(&ctrl_info->update_time_work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 904) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 905)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 906) static inline int pqi_report_luns(struct pqi_ctrl_info *ctrl_info, u8 cmd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 907) void *buffer, size_t buffer_length)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 908) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 909) return pqi_send_ctrl_raid_request(ctrl_info, cmd, buffer,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 910) buffer_length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 911) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 912)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 913) static int pqi_report_phys_logical_luns(struct pqi_ctrl_info *ctrl_info, u8 cmd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 914) void **buffer)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 915) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 916) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 917) size_t lun_list_length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 918) size_t lun_data_length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 919) size_t new_lun_list_length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 920) void *lun_data = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 921) struct report_lun_header *report_lun_header;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 922)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 923) report_lun_header = kmalloc(sizeof(*report_lun_header), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 924) if (!report_lun_header) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 925) rc = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 926) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 927) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 928)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 929) rc = pqi_report_luns(ctrl_info, cmd, report_lun_header,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 930) sizeof(*report_lun_header));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 931) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 932) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 933)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 934) lun_list_length = get_unaligned_be32(&report_lun_header->list_length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 935)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 936) again:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 937) lun_data_length = sizeof(struct report_lun_header) + lun_list_length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 938)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 939) lun_data = kmalloc(lun_data_length, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 940) if (!lun_data) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 941) rc = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 942) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 943) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 944)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 945) if (lun_list_length == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 946) memcpy(lun_data, report_lun_header, sizeof(*report_lun_header));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 947) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 948) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 949)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 950) rc = pqi_report_luns(ctrl_info, cmd, lun_data, lun_data_length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 951) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 952) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 953)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 954) new_lun_list_length = get_unaligned_be32(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 955) &((struct report_lun_header *)lun_data)->list_length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 956)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 957) if (new_lun_list_length > lun_list_length) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 958) lun_list_length = new_lun_list_length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 959) kfree(lun_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 960) goto again;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 961) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 962)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 963) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 964) kfree(report_lun_header);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 965)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 966) if (rc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 967) kfree(lun_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 968) lun_data = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 969) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 970)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 971) *buffer = lun_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 972)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 973) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 974) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 975)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 976) static inline int pqi_report_phys_luns(struct pqi_ctrl_info *ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 977) void **buffer)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 978) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 979) return pqi_report_phys_logical_luns(ctrl_info, CISS_REPORT_PHYS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 980) buffer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 981) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 982)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 983) static inline int pqi_report_logical_luns(struct pqi_ctrl_info *ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 984) void **buffer)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 985) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 986) return pqi_report_phys_logical_luns(ctrl_info, CISS_REPORT_LOG, buffer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 987) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 988)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 989) static int pqi_get_device_lists(struct pqi_ctrl_info *ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 990) struct report_phys_lun_extended **physdev_list,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 991) struct report_log_lun_extended **logdev_list)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 992) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 993) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 994) size_t logdev_list_length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 995) size_t logdev_data_length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 996) struct report_log_lun_extended *internal_logdev_list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 997) struct report_log_lun_extended *logdev_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 998) struct report_lun_header report_lun_header;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 999)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000) rc = pqi_report_phys_luns(ctrl_info, (void **)physdev_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002) dev_err(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003) "report physical LUNs failed\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) rc = pqi_report_logical_luns(ctrl_info, (void **)logdev_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007) dev_err(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008) "report logical LUNs failed\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011) * Tack the controller itself onto the end of the logical device list.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) logdev_data = *logdev_list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016) if (logdev_data) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017) logdev_list_length =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018) get_unaligned_be32(&logdev_data->header.list_length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020) memset(&report_lun_header, 0, sizeof(report_lun_header));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) logdev_data =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022) (struct report_log_lun_extended *)&report_lun_header;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023) logdev_list_length = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026) logdev_data_length = sizeof(struct report_lun_header) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027) logdev_list_length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029) internal_logdev_list = kmalloc(logdev_data_length +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030) sizeof(struct report_log_lun_extended), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) if (!internal_logdev_list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032) kfree(*logdev_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033) *logdev_list = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037) memcpy(internal_logdev_list, logdev_data, logdev_data_length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038) memset((u8 *)internal_logdev_list + logdev_data_length, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039) sizeof(struct report_log_lun_extended_entry));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040) put_unaligned_be32(logdev_list_length +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041) sizeof(struct report_log_lun_extended_entry),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042) &internal_logdev_list->header.list_length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044) kfree(*logdev_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045) *logdev_list = internal_logdev_list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050) static inline void pqi_set_bus_target_lun(struct pqi_scsi_dev *device,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051) int bus, int target, int lun)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053) device->bus = bus;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054) device->target = target;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055) device->lun = lun;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058) static void pqi_assign_bus_target_lun(struct pqi_scsi_dev *device)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060) u8 *scsi3addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061) u32 lunid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062) int bus;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063) int target;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064) int lun;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066) scsi3addr = device->scsi3addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067) lunid = get_unaligned_le32(scsi3addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069) if (pqi_is_hba_lunid(scsi3addr)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070) /* The specified device is the controller. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071) pqi_set_bus_target_lun(device, PQI_HBA_BUS, 0, lunid & 0x3fff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072) device->target_lun_valid = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076) if (pqi_is_logical_device(device)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077) if (device->is_external_raid_device) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078) bus = PQI_EXTERNAL_RAID_VOLUME_BUS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079) target = (lunid >> 16) & 0x3fff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080) lun = lunid & 0xff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082) bus = PQI_RAID_VOLUME_BUS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083) target = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084) lun = lunid & 0x3fff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086) pqi_set_bus_target_lun(device, bus, target, lun);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087) device->target_lun_valid = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092) * Defer target and LUN assignment for non-controller physical devices
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093) * because the SAS transport layer will make these assignments later.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095) pqi_set_bus_target_lun(device, PQI_PHYSICAL_DEVICE_BUS, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098) static void pqi_get_raid_level(struct pqi_ctrl_info *ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099) struct pqi_scsi_dev *device)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102) u8 raid_level;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103) u8 *buffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105) raid_level = SA_RAID_UNKNOWN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107) buffer = kmalloc(64, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108) if (buffer) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109) rc = pqi_scsi_inquiry(ctrl_info, device->scsi3addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110) VPD_PAGE | CISS_VPD_LV_DEVICE_GEOMETRY, buffer, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111) if (rc == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112) raid_level = buffer[8];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113) if (raid_level > SA_RAID_MAX)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114) raid_level = SA_RAID_UNKNOWN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116) kfree(buffer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119) device->raid_level = raid_level;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122) static int pqi_validate_raid_map(struct pqi_ctrl_info *ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123) struct pqi_scsi_dev *device, struct raid_map *raid_map)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125) char *err_msg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126) u32 raid_map_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127) u32 r5or6_blocks_per_row;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129) raid_map_size = get_unaligned_le32(&raid_map->structure_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131) if (raid_map_size < offsetof(struct raid_map, disk_data)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132) err_msg = "RAID map too small";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133) goto bad_raid_map;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136) if (device->raid_level == SA_RAID_1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137) if (get_unaligned_le16(&raid_map->layout_map_count) != 2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138) err_msg = "invalid RAID-1 map";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1139) goto bad_raid_map;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1140) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1141) } else if (device->raid_level == SA_RAID_ADM) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1142) if (get_unaligned_le16(&raid_map->layout_map_count) != 3) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1143) err_msg = "invalid RAID-1(ADM) map";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1144) goto bad_raid_map;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1145) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1146) } else if ((device->raid_level == SA_RAID_5 ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1147) device->raid_level == SA_RAID_6) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1148) get_unaligned_le16(&raid_map->layout_map_count) > 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1149) /* RAID 50/60 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1150) r5or6_blocks_per_row =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1151) get_unaligned_le16(&raid_map->strip_size) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1152) get_unaligned_le16(&raid_map->data_disks_per_row);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1153) if (r5or6_blocks_per_row == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1154) err_msg = "invalid RAID-5 or RAID-6 map";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1155) goto bad_raid_map;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1156) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1157) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1158)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1159) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1160)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1161) bad_raid_map:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1162) dev_warn(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1163) "logical device %08x%08x %s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1164) *((u32 *)&device->scsi3addr),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1165) *((u32 *)&device->scsi3addr[4]), err_msg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1166)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1167) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1168) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1169)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1170) static int pqi_get_raid_map(struct pqi_ctrl_info *ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1171) struct pqi_scsi_dev *device)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1172) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1173) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1174) u32 raid_map_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1175) struct raid_map *raid_map;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1176)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1177) raid_map = kmalloc(sizeof(*raid_map), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1178) if (!raid_map)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1179) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1180)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1181) rc = pqi_send_scsi_raid_request(ctrl_info, CISS_GET_RAID_MAP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1182) device->scsi3addr, raid_map, sizeof(*raid_map),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1183) 0, NULL, NO_TIMEOUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1184)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1185) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1186) goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1187)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1188) raid_map_size = get_unaligned_le32(&raid_map->structure_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1189)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1190) if (raid_map_size > sizeof(*raid_map)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1191)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1192) kfree(raid_map);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1193)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1194) raid_map = kmalloc(raid_map_size, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1195) if (!raid_map)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1196) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1197)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1198) rc = pqi_send_scsi_raid_request(ctrl_info, CISS_GET_RAID_MAP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1199) device->scsi3addr, raid_map, raid_map_size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1200) 0, NULL, NO_TIMEOUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1201) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1202) goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1203)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1204) if (get_unaligned_le32(&raid_map->structure_size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1205) != raid_map_size) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1206) dev_warn(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1207) "Requested %d bytes, received %d bytes",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1208) raid_map_size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1209) get_unaligned_le32(&raid_map->structure_size));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1210) rc = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1211) goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1212) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1213) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1214)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1215) rc = pqi_validate_raid_map(ctrl_info, device, raid_map);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1216) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1217) goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1218)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1219) device->raid_map = raid_map;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1220)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1221) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1222)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1223) error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1224) kfree(raid_map);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1225)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1226) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1227) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1228)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1229) static void pqi_get_raid_bypass_status(struct pqi_ctrl_info *ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1230) struct pqi_scsi_dev *device)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1231) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1232) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1233) u8 *buffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1234) u8 bypass_status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1235)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1236) buffer = kmalloc(64, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1237) if (!buffer)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1238) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1239)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1240) rc = pqi_scsi_inquiry(ctrl_info, device->scsi3addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1241) VPD_PAGE | CISS_VPD_LV_BYPASS_STATUS, buffer, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1242) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1243) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1244)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1245) #define RAID_BYPASS_STATUS 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1246) #define RAID_BYPASS_CONFIGURED 0x1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1247) #define RAID_BYPASS_ENABLED 0x2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1248)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1249) bypass_status = buffer[RAID_BYPASS_STATUS];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1250) device->raid_bypass_configured =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1251) (bypass_status & RAID_BYPASS_CONFIGURED) != 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1252) if (device->raid_bypass_configured &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1253) (bypass_status & RAID_BYPASS_ENABLED) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1254) pqi_get_raid_map(ctrl_info, device) == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1255) device->raid_bypass_enabled = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1256)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1257) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1258) kfree(buffer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1259) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1260)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1261) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1262) * Use vendor-specific VPD to determine online/offline status of a volume.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1263) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1264)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1265) static void pqi_get_volume_status(struct pqi_ctrl_info *ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1266) struct pqi_scsi_dev *device)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1267) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1268) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1269) size_t page_length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1270) u8 volume_status = CISS_LV_STATUS_UNAVAILABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1271) bool volume_offline = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1272) u32 volume_flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1273) struct ciss_vpd_logical_volume_status *vpd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1274)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1275) vpd = kmalloc(sizeof(*vpd), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1276) if (!vpd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1277) goto no_buffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1278)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1279) rc = pqi_scsi_inquiry(ctrl_info, device->scsi3addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1280) VPD_PAGE | CISS_VPD_LV_STATUS, vpd, sizeof(*vpd));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1281) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1282) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1283)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1284) if (vpd->page_code != CISS_VPD_LV_STATUS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1285) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1286)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1287) page_length = offsetof(struct ciss_vpd_logical_volume_status,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1288) volume_status) + vpd->page_length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1289) if (page_length < sizeof(*vpd))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1290) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1291)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1292) volume_status = vpd->volume_status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1293) volume_flags = get_unaligned_be32(&vpd->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1294) volume_offline = (volume_flags & CISS_LV_FLAGS_NO_HOST_IO) != 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1295)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1296) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1297) kfree(vpd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1298) no_buffer:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1299) device->volume_status = volume_status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1300) device->volume_offline = volume_offline;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1301) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1302)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1303) static int pqi_get_physical_device_info(struct pqi_ctrl_info *ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1304) struct pqi_scsi_dev *device,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1305) struct bmic_identify_physical_device *id_phys)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1306) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1307) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1308)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1309) memset(id_phys, 0, sizeof(*id_phys));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1310)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1311) rc = pqi_identify_physical_device(ctrl_info, device,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1312) id_phys, sizeof(*id_phys));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1313) if (rc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1314) device->queue_depth = PQI_PHYSICAL_DISK_DEFAULT_MAX_QUEUE_DEPTH;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1315) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1316) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1317)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1318) scsi_sanitize_inquiry_string(&id_phys->model[0], 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1319) scsi_sanitize_inquiry_string(&id_phys->model[8], 16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1320)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1321) memcpy(device->vendor, &id_phys->model[0], sizeof(device->vendor));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1322) memcpy(device->model, &id_phys->model[8], sizeof(device->model));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1323)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1324) device->box_index = id_phys->box_index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1325) device->phys_box_on_bus = id_phys->phys_box_on_bus;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1326) device->phy_connected_dev_type = id_phys->phy_connected_dev_type[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1327) device->queue_depth =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1328) get_unaligned_le16(&id_phys->current_queue_depth_limit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1329) device->active_path_index = id_phys->active_path_number;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1330) device->path_map = id_phys->redundant_path_present_map;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1331) memcpy(&device->box,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1332) &id_phys->alternate_paths_phys_box_on_port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1333) sizeof(device->box));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1334) memcpy(&device->phys_connector,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1335) &id_phys->alternate_paths_phys_connector,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1336) sizeof(device->phys_connector));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1337) device->bay = id_phys->phys_bay_in_box;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1338)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1339) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1340) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1341)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1342) static int pqi_get_logical_device_info(struct pqi_ctrl_info *ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1343) struct pqi_scsi_dev *device)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1344) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1345) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1346) u8 *buffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1347)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1348) buffer = kmalloc(64, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1349) if (!buffer)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1350) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1351)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1352) /* Send an inquiry to the device to see what it is. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1353) rc = pqi_scsi_inquiry(ctrl_info, device->scsi3addr, 0, buffer, 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1354) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1355) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1356)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1357) scsi_sanitize_inquiry_string(&buffer[8], 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1358) scsi_sanitize_inquiry_string(&buffer[16], 16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1359)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1360) device->devtype = buffer[0] & 0x1f;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1361) memcpy(device->vendor, &buffer[8], sizeof(device->vendor));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1362) memcpy(device->model, &buffer[16], sizeof(device->model));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1363)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1364) if (device->devtype == TYPE_DISK) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1365) if (device->is_external_raid_device) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1366) device->raid_level = SA_RAID_UNKNOWN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1367) device->volume_status = CISS_LV_OK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1368) device->volume_offline = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1369) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1370) pqi_get_raid_level(ctrl_info, device);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1371) pqi_get_raid_bypass_status(ctrl_info, device);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1372) pqi_get_volume_status(ctrl_info, device);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1373) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1374) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1375)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1376) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1377) kfree(buffer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1378)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1379) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1380) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1381)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1382) static int pqi_get_device_info(struct pqi_ctrl_info *ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1383) struct pqi_scsi_dev *device,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1384) struct bmic_identify_physical_device *id_phys)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1385) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1386) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1387)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1388) if (device->is_expander_smp_device)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1389) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1390)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1391) if (pqi_is_logical_device(device))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1392) rc = pqi_get_logical_device_info(ctrl_info, device);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1393) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1394) rc = pqi_get_physical_device_info(ctrl_info, device, id_phys);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1395)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1396) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1397) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1398)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1399) static void pqi_show_volume_status(struct pqi_ctrl_info *ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1400) struct pqi_scsi_dev *device)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1401) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1402) char *status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1403) static const char unknown_state_str[] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1404) "Volume is in an unknown state (%u)";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1405) char unknown_state_buffer[sizeof(unknown_state_str) + 10];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1406)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1407) switch (device->volume_status) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1408) case CISS_LV_OK:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1409) status = "Volume online";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1410) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1411) case CISS_LV_FAILED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1412) status = "Volume failed";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1413) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1414) case CISS_LV_NOT_CONFIGURED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1415) status = "Volume not configured";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1416) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1417) case CISS_LV_DEGRADED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1418) status = "Volume degraded";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1419) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1420) case CISS_LV_READY_FOR_RECOVERY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1421) status = "Volume ready for recovery operation";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1422) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1423) case CISS_LV_UNDERGOING_RECOVERY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1424) status = "Volume undergoing recovery";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1425) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1426) case CISS_LV_WRONG_PHYSICAL_DRIVE_REPLACED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1427) status = "Wrong physical drive was replaced";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1428) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1429) case CISS_LV_PHYSICAL_DRIVE_CONNECTION_PROBLEM:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1430) status = "A physical drive not properly connected";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1431) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1432) case CISS_LV_HARDWARE_OVERHEATING:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1433) status = "Hardware is overheating";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1434) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1435) case CISS_LV_HARDWARE_HAS_OVERHEATED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1436) status = "Hardware has overheated";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1437) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1438) case CISS_LV_UNDERGOING_EXPANSION:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1439) status = "Volume undergoing expansion";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1440) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1441) case CISS_LV_NOT_AVAILABLE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1442) status = "Volume waiting for transforming volume";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1443) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1444) case CISS_LV_QUEUED_FOR_EXPANSION:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1445) status = "Volume queued for expansion";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1446) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1447) case CISS_LV_DISABLED_SCSI_ID_CONFLICT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1448) status = "Volume disabled due to SCSI ID conflict";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1449) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1450) case CISS_LV_EJECTED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1451) status = "Volume has been ejected";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1452) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1453) case CISS_LV_UNDERGOING_ERASE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1454) status = "Volume undergoing background erase";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1455) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1456) case CISS_LV_READY_FOR_PREDICTIVE_SPARE_REBUILD:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1457) status = "Volume ready for predictive spare rebuild";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1458) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1459) case CISS_LV_UNDERGOING_RPI:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1460) status = "Volume undergoing rapid parity initialization";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1461) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1462) case CISS_LV_PENDING_RPI:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1463) status = "Volume queued for rapid parity initialization";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1464) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1465) case CISS_LV_ENCRYPTED_NO_KEY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1466) status = "Encrypted volume inaccessible - key not present";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1467) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1468) case CISS_LV_UNDERGOING_ENCRYPTION:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1469) status = "Volume undergoing encryption process";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1470) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1471) case CISS_LV_UNDERGOING_ENCRYPTION_REKEYING:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1472) status = "Volume undergoing encryption re-keying process";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1473) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1474) case CISS_LV_ENCRYPTED_IN_NON_ENCRYPTED_CONTROLLER:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1475) status = "Volume encrypted but encryption is disabled";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1476) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1477) case CISS_LV_PENDING_ENCRYPTION:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1478) status = "Volume pending migration to encrypted state";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1479) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1480) case CISS_LV_PENDING_ENCRYPTION_REKEYING:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1481) status = "Volume pending encryption rekeying";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1482) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1483) case CISS_LV_NOT_SUPPORTED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1484) status = "Volume not supported on this controller";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1485) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1486) case CISS_LV_STATUS_UNAVAILABLE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1487) status = "Volume status not available";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1488) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1489) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1490) snprintf(unknown_state_buffer, sizeof(unknown_state_buffer),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1491) unknown_state_str, device->volume_status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1492) status = unknown_state_buffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1493) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1494) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1495)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1496) dev_info(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1497) "scsi %d:%d:%d:%d %s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1498) ctrl_info->scsi_host->host_no,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1499) device->bus, device->target, device->lun, status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1500) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1501)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1502) static void pqi_rescan_worker(struct work_struct *work)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1503) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1504) struct pqi_ctrl_info *ctrl_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1505)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1506) ctrl_info = container_of(to_delayed_work(work), struct pqi_ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1507) rescan_work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1508)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1509) pqi_scan_scsi_devices(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1510) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1511)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1512) static int pqi_add_device(struct pqi_ctrl_info *ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1513) struct pqi_scsi_dev *device)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1514) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1515) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1516)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1517) if (pqi_is_logical_device(device))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1518) rc = scsi_add_device(ctrl_info->scsi_host, device->bus,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1519) device->target, device->lun);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1520) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1521) rc = pqi_add_sas_device(ctrl_info->sas_host, device);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1522)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1523) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1524) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1525)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1526) #define PQI_PENDING_IO_TIMEOUT_SECS 20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1527)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1528) static inline void pqi_remove_device(struct pqi_ctrl_info *ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1529) struct pqi_scsi_dev *device)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1530) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1531) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1532)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1533) pqi_device_remove_start(device);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1534)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1535) rc = pqi_device_wait_for_pending_io(ctrl_info, device, PQI_PENDING_IO_TIMEOUT_SECS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1536) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1537) dev_err(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1538) "scsi %d:%d:%d:%d removing device with %d outstanding command(s)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1539) ctrl_info->scsi_host->host_no, device->bus,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1540) device->target, device->lun,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1541) atomic_read(&device->scsi_cmds_outstanding));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1542)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1543) if (pqi_is_logical_device(device))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1544) scsi_remove_device(device->sdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1545) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1546) pqi_remove_sas_device(device);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1547) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1548)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1549) /* Assumes the SCSI device list lock is held. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1550)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1551) static struct pqi_scsi_dev *pqi_find_scsi_dev(struct pqi_ctrl_info *ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1552) int bus, int target, int lun)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1553) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1554) struct pqi_scsi_dev *device;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1555)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1556) list_for_each_entry(device, &ctrl_info->scsi_device_list, scsi_device_list_entry)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1557) if (device->bus == bus && device->target == target && device->lun == lun)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1558) return device;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1559)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1560) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1561) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1562)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1563) static inline bool pqi_device_equal(struct pqi_scsi_dev *dev1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1564) struct pqi_scsi_dev *dev2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1565) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1566) if (dev1->is_physical_device != dev2->is_physical_device)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1567) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1568)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1569) if (dev1->is_physical_device)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1570) return dev1->wwid == dev2->wwid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1571)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1572) return memcmp(dev1->volume_id, dev2->volume_id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1573) sizeof(dev1->volume_id)) == 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1574) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1575)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1576) enum pqi_find_result {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1577) DEVICE_NOT_FOUND,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1578) DEVICE_CHANGED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1579) DEVICE_SAME,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1580) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1581)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1582) static enum pqi_find_result pqi_scsi_find_entry(struct pqi_ctrl_info *ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1583) struct pqi_scsi_dev *device_to_find, struct pqi_scsi_dev **matching_device)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1584) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1585) struct pqi_scsi_dev *device;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1586)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1587) list_for_each_entry(device, &ctrl_info->scsi_device_list, scsi_device_list_entry) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1588) if (pqi_scsi3addr_equal(device_to_find->scsi3addr, device->scsi3addr)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1589) *matching_device = device;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1590) if (pqi_device_equal(device_to_find, device)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1591) if (device_to_find->volume_offline)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1592) return DEVICE_CHANGED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1593) return DEVICE_SAME;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1594) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1595) return DEVICE_CHANGED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1596) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1597) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1598)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1599) return DEVICE_NOT_FOUND;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1600) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1601)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1602) static inline const char *pqi_device_type(struct pqi_scsi_dev *device)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1603) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1604) if (device->is_expander_smp_device)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1605) return "Enclosure SMP ";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1606)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1607) return scsi_device_type(device->devtype);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1608) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1609)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1610) #define PQI_DEV_INFO_BUFFER_LENGTH 128
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1611)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1612) static void pqi_dev_info(struct pqi_ctrl_info *ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1613) char *action, struct pqi_scsi_dev *device)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1614) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1615) ssize_t count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1616) char buffer[PQI_DEV_INFO_BUFFER_LENGTH];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1617)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1618) count = snprintf(buffer, PQI_DEV_INFO_BUFFER_LENGTH,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1619) "%d:%d:", ctrl_info->scsi_host->host_no, device->bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1620)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1621) if (device->target_lun_valid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1622) count += scnprintf(buffer + count,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1623) PQI_DEV_INFO_BUFFER_LENGTH - count,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1624) "%d:%d",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1625) device->target,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1626) device->lun);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1627) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1628) count += scnprintf(buffer + count,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1629) PQI_DEV_INFO_BUFFER_LENGTH - count,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1630) "-:-");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1631)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1632) if (pqi_is_logical_device(device))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1633) count += scnprintf(buffer + count,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1634) PQI_DEV_INFO_BUFFER_LENGTH - count,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1635) " %08x%08x",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1636) *((u32 *)&device->scsi3addr),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1637) *((u32 *)&device->scsi3addr[4]));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1638) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1639) count += scnprintf(buffer + count,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1640) PQI_DEV_INFO_BUFFER_LENGTH - count,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1641) " %016llx", device->sas_address);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1642)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1643) count += scnprintf(buffer + count, PQI_DEV_INFO_BUFFER_LENGTH - count,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1644) " %s %.8s %.16s ",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1645) pqi_device_type(device),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1646) device->vendor,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1647) device->model);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1648)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1649) if (pqi_is_logical_device(device)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1650) if (device->devtype == TYPE_DISK)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1651) count += scnprintf(buffer + count,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1652) PQI_DEV_INFO_BUFFER_LENGTH - count,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1653) "SSDSmartPathCap%c En%c %-12s",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1654) device->raid_bypass_configured ? '+' : '-',
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1655) device->raid_bypass_enabled ? '+' : '-',
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1656) pqi_raid_level_to_string(device->raid_level));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1657) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1658) count += scnprintf(buffer + count,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1659) PQI_DEV_INFO_BUFFER_LENGTH - count,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1660) "AIO%c", device->aio_enabled ? '+' : '-');
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1661) if (device->devtype == TYPE_DISK ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1662) device->devtype == TYPE_ZBC)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1663) count += scnprintf(buffer + count,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1664) PQI_DEV_INFO_BUFFER_LENGTH - count,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1665) " qd=%-6d", device->queue_depth);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1666) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1667)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1668) dev_info(&ctrl_info->pci_dev->dev, "%s %s\n", action, buffer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1669) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1670)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1671) /* Assumes the SCSI device list lock is held. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1672)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1673) static void pqi_scsi_update_device(struct pqi_scsi_dev *existing_device,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1674) struct pqi_scsi_dev *new_device)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1675) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1676) existing_device->devtype = new_device->devtype;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1677) existing_device->device_type = new_device->device_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1678) existing_device->bus = new_device->bus;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1679) if (new_device->target_lun_valid) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1680) existing_device->target = new_device->target;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1681) existing_device->lun = new_device->lun;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1682) existing_device->target_lun_valid = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1683) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1684)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1685) if ((existing_device->volume_status == CISS_LV_QUEUED_FOR_EXPANSION ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1686) existing_device->volume_status == CISS_LV_UNDERGOING_EXPANSION) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1687) new_device->volume_status == CISS_LV_OK)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1688) existing_device->rescan = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1689)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1690) /* By definition, the scsi3addr and wwid fields are already the same. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1691)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1692) existing_device->is_physical_device = new_device->is_physical_device;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1693) existing_device->is_external_raid_device =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1694) new_device->is_external_raid_device;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1695) existing_device->is_expander_smp_device =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1696) new_device->is_expander_smp_device;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1697) existing_device->aio_enabled = new_device->aio_enabled;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1698) memcpy(existing_device->vendor, new_device->vendor,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1699) sizeof(existing_device->vendor));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1700) memcpy(existing_device->model, new_device->model,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1701) sizeof(existing_device->model));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1702) existing_device->sas_address = new_device->sas_address;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1703) existing_device->raid_level = new_device->raid_level;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1704) existing_device->queue_depth = new_device->queue_depth;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1705) existing_device->aio_handle = new_device->aio_handle;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1706) existing_device->volume_status = new_device->volume_status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1707) existing_device->active_path_index = new_device->active_path_index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1708) existing_device->path_map = new_device->path_map;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1709) existing_device->bay = new_device->bay;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1710) existing_device->box_index = new_device->box_index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1711) existing_device->phys_box_on_bus = new_device->phys_box_on_bus;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1712) existing_device->phy_connected_dev_type =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1713) new_device->phy_connected_dev_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1714) memcpy(existing_device->box, new_device->box,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1715) sizeof(existing_device->box));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1716) memcpy(existing_device->phys_connector, new_device->phys_connector,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1717) sizeof(existing_device->phys_connector));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1718) existing_device->offload_to_mirror = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1719) kfree(existing_device->raid_map);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1720) existing_device->raid_map = new_device->raid_map;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1721) existing_device->raid_bypass_configured =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1722) new_device->raid_bypass_configured;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1723) existing_device->raid_bypass_enabled =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1724) new_device->raid_bypass_enabled;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1725) existing_device->device_offline = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1726)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1727) /* To prevent this from being freed later. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1728) new_device->raid_map = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1729) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1730)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1731) static inline void pqi_free_device(struct pqi_scsi_dev *device)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1732) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1733) if (device) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1734) kfree(device->raid_map);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1735) kfree(device);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1736) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1737) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1738)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1739) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1740) * Called when exposing a new device to the OS fails in order to re-adjust
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1741) * our internal SCSI device list to match the SCSI ML's view.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1742) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1743)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1744) static inline void pqi_fixup_botched_add(struct pqi_ctrl_info *ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1745) struct pqi_scsi_dev *device)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1746) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1747) unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1748)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1749) spin_lock_irqsave(&ctrl_info->scsi_device_list_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1750) list_del(&device->scsi_device_list_entry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1751) spin_unlock_irqrestore(&ctrl_info->scsi_device_list_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1752)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1753) /* Allow the device structure to be freed later. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1754) device->keep_device = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1755) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1756)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1757) static inline bool pqi_is_device_added(struct pqi_scsi_dev *device)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1758) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1759) if (device->is_expander_smp_device)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1760) return device->sas_port != NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1761)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1762) return device->sdev != NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1763) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1764)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1765) static void pqi_update_device_list(struct pqi_ctrl_info *ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1766) struct pqi_scsi_dev *new_device_list[], unsigned int num_new_devices)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1767) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1768) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1769) unsigned int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1770) unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1771) enum pqi_find_result find_result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1772) struct pqi_scsi_dev *device;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1773) struct pqi_scsi_dev *next;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1774) struct pqi_scsi_dev *matching_device;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1775) LIST_HEAD(add_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1776) LIST_HEAD(delete_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1777)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1778) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1779) * The idea here is to do as little work as possible while holding the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1780) * spinlock. That's why we go to great pains to defer anything other
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1781) * than updating the internal device list until after we release the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1782) * spinlock.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1783) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1784)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1785) spin_lock_irqsave(&ctrl_info->scsi_device_list_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1786)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1787) /* Assume that all devices in the existing list have gone away. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1788) list_for_each_entry(device, &ctrl_info->scsi_device_list, scsi_device_list_entry)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1789) device->device_gone = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1790)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1791) for (i = 0; i < num_new_devices; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1792) device = new_device_list[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1793)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1794) find_result = pqi_scsi_find_entry(ctrl_info, device,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1795) &matching_device);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1796)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1797) switch (find_result) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1798) case DEVICE_SAME:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1799) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1800) * The newly found device is already in the existing
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1801) * device list.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1802) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1803) device->new_device = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1804) matching_device->device_gone = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1805) pqi_scsi_update_device(matching_device, device);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1806) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1807) case DEVICE_NOT_FOUND:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1808) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1809) * The newly found device is NOT in the existing device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1810) * list.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1811) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1812) device->new_device = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1813) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1814) case DEVICE_CHANGED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1815) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1816) * The original device has gone away and we need to add
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1817) * the new device.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1818) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1819) device->new_device = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1820) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1821) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1822) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1823)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1824) /* Process all devices that have gone away. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1825) list_for_each_entry_safe(device, next, &ctrl_info->scsi_device_list,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1826) scsi_device_list_entry) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1827) if (device->device_gone) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1828) list_del_init(&device->scsi_device_list_entry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1829) list_add_tail(&device->delete_list_entry, &delete_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1830) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1831) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1832)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1833) /* Process all new devices. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1834) for (i = 0; i < num_new_devices; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1835) device = new_device_list[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1836) if (!device->new_device)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1837) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1838) if (device->volume_offline)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1839) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1840) list_add_tail(&device->scsi_device_list_entry,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1841) &ctrl_info->scsi_device_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1842) list_add_tail(&device->add_list_entry, &add_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1843) /* To prevent this device structure from being freed later. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1844) device->keep_device = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1845) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1846)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1847) spin_unlock_irqrestore(&ctrl_info->scsi_device_list_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1848)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1849) if (pqi_ctrl_in_ofa(ctrl_info))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1850) pqi_ctrl_ofa_done(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1851)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1852) /* Remove all devices that have gone away. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1853) list_for_each_entry_safe(device, next, &delete_list, delete_list_entry) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1854) if (device->volume_offline) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1855) pqi_dev_info(ctrl_info, "offline", device);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1856) pqi_show_volume_status(ctrl_info, device);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1857) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1858) list_del(&device->delete_list_entry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1859) if (pqi_is_device_added(device)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1860) pqi_remove_device(ctrl_info, device);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1861) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1862) if (!device->volume_offline)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1863) pqi_dev_info(ctrl_info, "removed", device);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1864) pqi_free_device(device);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1865) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1866) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1867)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1868) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1869) * Notify the SCSI ML if the queue depth of any existing device has
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1870) * changed.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1871) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1872) list_for_each_entry(device, &ctrl_info->scsi_device_list,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1873) scsi_device_list_entry) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1874) if (device->sdev) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1875) if (device->queue_depth !=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1876) device->advertised_queue_depth) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1877) device->advertised_queue_depth = device->queue_depth;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1878) scsi_change_queue_depth(device->sdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1879) device->advertised_queue_depth);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1880) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1881) if (device->rescan) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1882) scsi_rescan_device(&device->sdev->sdev_gendev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1883) device->rescan = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1884) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1885) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1886) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1887)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1888) /* Expose any new devices. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1889) list_for_each_entry_safe(device, next, &add_list, add_list_entry) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1890) if (!pqi_is_device_added(device)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1891) rc = pqi_add_device(ctrl_info, device);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1892) if (rc == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1893) pqi_dev_info(ctrl_info, "added", device);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1894) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1895) dev_warn(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1896) "scsi %d:%d:%d:%d addition failed, device not added\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1897) ctrl_info->scsi_host->host_no,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1898) device->bus, device->target,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1899) device->lun);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1900) pqi_fixup_botched_add(ctrl_info, device);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1901) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1902) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1903) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1904) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1905)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1906) static inline bool pqi_is_supported_device(struct pqi_scsi_dev *device)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1907) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1908) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1909) * Only support the HBA controller itself as a RAID
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1910) * controller. If it's a RAID controller other than
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1911) * the HBA itself (an external RAID controller, for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1912) * example), we don't support it.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1913) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1914) if (device->device_type == SA_DEVICE_TYPE_CONTROLLER &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1915) !pqi_is_hba_lunid(device->scsi3addr))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1916) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1917)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1918) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1919) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1920)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1921) static inline bool pqi_skip_device(u8 *scsi3addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1922) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1923) /* Ignore all masked devices. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1924) if (MASKED_DEVICE(scsi3addr))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1925) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1926)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1927) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1928) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1929)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1930) static inline void pqi_mask_device(u8 *scsi3addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1931) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1932) scsi3addr[3] |= 0xc0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1933) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1934)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1935) static inline bool pqi_is_device_with_sas_address(struct pqi_scsi_dev *device)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1936) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1937) switch (device->device_type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1938) case SA_DEVICE_TYPE_SAS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1939) case SA_DEVICE_TYPE_EXPANDER_SMP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1940) case SA_DEVICE_TYPE_SES:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1941) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1942) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1943)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1944) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1945) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1946)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1947) static inline bool pqi_expose_device(struct pqi_scsi_dev *device)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1948) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1949) return !device->is_physical_device ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1950) !pqi_skip_device(device->scsi3addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1951) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1952)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1953) static int pqi_update_scsi_devices(struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1954) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1955) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1956) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1957) LIST_HEAD(new_device_list_head);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1958) struct report_phys_lun_extended *physdev_list = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1959) struct report_log_lun_extended *logdev_list = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1960) struct report_phys_lun_extended_entry *phys_lun_ext_entry;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1961) struct report_log_lun_extended_entry *log_lun_ext_entry;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1962) struct bmic_identify_physical_device *id_phys = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1963) u32 num_physicals;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1964) u32 num_logicals;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1965) struct pqi_scsi_dev **new_device_list = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1966) struct pqi_scsi_dev *device;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1967) struct pqi_scsi_dev *next;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1968) unsigned int num_new_devices;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1969) unsigned int num_valid_devices;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1970) bool is_physical_device;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1971) u8 *scsi3addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1972) unsigned int physical_index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1973) unsigned int logical_index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1974) static char *out_of_memory_msg =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1975) "failed to allocate memory, device discovery stopped";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1976)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1977) rc = pqi_get_device_lists(ctrl_info, &physdev_list, &logdev_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1978) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1979) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1980)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1981) if (physdev_list)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1982) num_physicals =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1983) get_unaligned_be32(&physdev_list->header.list_length)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1984) / sizeof(physdev_list->lun_entries[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1985) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1986) num_physicals = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1987)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1988) if (logdev_list)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1989) num_logicals =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1990) get_unaligned_be32(&logdev_list->header.list_length)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1991) / sizeof(logdev_list->lun_entries[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1992) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1993) num_logicals = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1994)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1995) if (num_physicals) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1996) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1997) * We need this buffer for calls to pqi_get_physical_disk_info()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1998) * below. We allocate it here instead of inside
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1999) * pqi_get_physical_disk_info() because it's a fairly large
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2000) * buffer.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2001) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2002) id_phys = kmalloc(sizeof(*id_phys), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2003) if (!id_phys) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2004) dev_warn(&ctrl_info->pci_dev->dev, "%s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2005) out_of_memory_msg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2006) rc = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2007) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2008) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2009)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2010) if (pqi_hide_vsep) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2011) for (i = num_physicals - 1; i >= 0; i--) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2012) phys_lun_ext_entry =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2013) &physdev_list->lun_entries[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2014) if (CISS_GET_DRIVE_NUMBER(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2015) phys_lun_ext_entry->lunid) ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2016) PQI_VSEP_CISS_BTL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2017) pqi_mask_device(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2018) phys_lun_ext_entry->lunid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2019) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2020) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2021) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2022) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2023) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2024)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2025) num_new_devices = num_physicals + num_logicals;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2026)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2027) new_device_list = kmalloc_array(num_new_devices,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2028) sizeof(*new_device_list),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2029) GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2030) if (!new_device_list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2031) dev_warn(&ctrl_info->pci_dev->dev, "%s\n", out_of_memory_msg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2032) rc = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2033) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2034) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2035)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2036) for (i = 0; i < num_new_devices; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2037) device = kzalloc(sizeof(*device), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2038) if (!device) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2039) dev_warn(&ctrl_info->pci_dev->dev, "%s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2040) out_of_memory_msg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2041) rc = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2042) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2043) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2044) list_add_tail(&device->new_device_list_entry,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2045) &new_device_list_head);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2046) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2047)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2048) device = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2049) num_valid_devices = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2050) physical_index = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2051) logical_index = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2052)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2053) for (i = 0; i < num_new_devices; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2054)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2055) if ((!pqi_expose_ld_first && i < num_physicals) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2056) (pqi_expose_ld_first && i >= num_logicals)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2057) is_physical_device = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2058) phys_lun_ext_entry =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2059) &physdev_list->lun_entries[physical_index++];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2060) log_lun_ext_entry = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2061) scsi3addr = phys_lun_ext_entry->lunid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2062) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2063) is_physical_device = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2064) phys_lun_ext_entry = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2065) log_lun_ext_entry =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2066) &logdev_list->lun_entries[logical_index++];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2067) scsi3addr = log_lun_ext_entry->lunid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2068) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2069)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2070) if (is_physical_device && pqi_skip_device(scsi3addr))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2071) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2072)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2073) if (device)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2074) device = list_next_entry(device, new_device_list_entry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2075) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2076) device = list_first_entry(&new_device_list_head,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2077) struct pqi_scsi_dev, new_device_list_entry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2078)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2079) memcpy(device->scsi3addr, scsi3addr, sizeof(device->scsi3addr));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2080) device->is_physical_device = is_physical_device;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2081) if (is_physical_device) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2082) device->device_type = phys_lun_ext_entry->device_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2083) if (device->device_type == SA_DEVICE_TYPE_EXPANDER_SMP)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2084) device->is_expander_smp_device = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2085) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2086) device->is_external_raid_device =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2087) pqi_is_external_raid_addr(scsi3addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2088) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2089)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2090) if (!pqi_is_supported_device(device))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2091) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2092)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2093) /* Gather information about the device. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2094) rc = pqi_get_device_info(ctrl_info, device, id_phys);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2095) if (rc == -ENOMEM) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2096) dev_warn(&ctrl_info->pci_dev->dev, "%s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2097) out_of_memory_msg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2098) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2099) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2100) if (rc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2101) if (device->is_physical_device)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2102) dev_warn(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2103) "obtaining device info failed, skipping physical device %016llx\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2104) get_unaligned_be64(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2105) &phys_lun_ext_entry->wwid));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2106) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2107) dev_warn(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2108) "obtaining device info failed, skipping logical device %08x%08x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2109) *((u32 *)&device->scsi3addr),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2110) *((u32 *)&device->scsi3addr[4]));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2111) rc = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2112) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2113) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2114)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2115) pqi_assign_bus_target_lun(device);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2116)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2117) if (device->is_physical_device) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2118) device->wwid = phys_lun_ext_entry->wwid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2119) if ((phys_lun_ext_entry->device_flags &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2120) CISS_REPORT_PHYS_DEV_FLAG_AIO_ENABLED) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2121) phys_lun_ext_entry->aio_handle) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2122) device->aio_enabled = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2123) device->aio_handle =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2124) phys_lun_ext_entry->aio_handle;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2125) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2126) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2127) memcpy(device->volume_id, log_lun_ext_entry->volume_id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2128) sizeof(device->volume_id));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2129) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2130)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2131) if (pqi_is_device_with_sas_address(device))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2132) device->sas_address = get_unaligned_be64(&device->wwid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2133)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2134) new_device_list[num_valid_devices++] = device;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2135) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2136)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2137) pqi_update_device_list(ctrl_info, new_device_list, num_valid_devices);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2138)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2139) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2140) list_for_each_entry_safe(device, next, &new_device_list_head,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2141) new_device_list_entry) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2142) if (device->keep_device)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2143) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2144) list_del(&device->new_device_list_entry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2145) pqi_free_device(device);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2146) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2147)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2148) kfree(new_device_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2149) kfree(physdev_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2150) kfree(logdev_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2151) kfree(id_phys);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2152)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2153) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2154) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2155)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2156) static int pqi_scan_scsi_devices(struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2157) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2158) int rc = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2159)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2160) if (pqi_ctrl_offline(ctrl_info))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2161) return -ENXIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2162)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2163) if (!mutex_trylock(&ctrl_info->scan_mutex)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2164) pqi_schedule_rescan_worker_delayed(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2165) rc = -EINPROGRESS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2166) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2167) rc = pqi_update_scsi_devices(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2168) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2169) pqi_schedule_rescan_worker_delayed(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2170) mutex_unlock(&ctrl_info->scan_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2171) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2172)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2173) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2174) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2175)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2176) static void pqi_scan_start(struct Scsi_Host *shost)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2177) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2178) struct pqi_ctrl_info *ctrl_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2179)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2180) ctrl_info = shost_to_hba(shost);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2181) if (pqi_ctrl_in_ofa(ctrl_info))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2182) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2183)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2184) pqi_scan_scsi_devices(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2185) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2186)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2187) /* Returns TRUE if scan is finished. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2188)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2189) static int pqi_scan_finished(struct Scsi_Host *shost,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2190) unsigned long elapsed_time)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2191) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2192) struct pqi_ctrl_info *ctrl_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2193)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2194) ctrl_info = shost_priv(shost);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2195)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2196) return !mutex_is_locked(&ctrl_info->scan_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2197) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2198)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2199) static void pqi_wait_until_scan_finished(struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2200) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2201) mutex_lock(&ctrl_info->scan_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2202) mutex_unlock(&ctrl_info->scan_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2203) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2204)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2205) static void pqi_wait_until_lun_reset_finished(struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2206) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2207) mutex_lock(&ctrl_info->lun_reset_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2208) mutex_unlock(&ctrl_info->lun_reset_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2209) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2210)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2211) static void pqi_wait_until_ofa_finished(struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2212) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2213) mutex_lock(&ctrl_info->ofa_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2214) mutex_unlock(&ctrl_info->ofa_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2215) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2216)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2217) static inline void pqi_set_encryption_info(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2218) struct pqi_encryption_info *encryption_info, struct raid_map *raid_map,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2219) u64 first_block)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2220) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2221) u32 volume_blk_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2222)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2223) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2224) * Set the encryption tweak values based on logical block address.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2225) * If the block size is 512, the tweak value is equal to the LBA.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2226) * For other block sizes, tweak value is (LBA * block size) / 512.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2227) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2228) volume_blk_size = get_unaligned_le32(&raid_map->volume_blk_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2229) if (volume_blk_size != 512)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2230) first_block = (first_block * volume_blk_size) / 512;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2231)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2232) encryption_info->data_encryption_key_index =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2233) get_unaligned_le16(&raid_map->data_encryption_key_index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2234) encryption_info->encrypt_tweak_lower = lower_32_bits(first_block);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2235) encryption_info->encrypt_tweak_upper = upper_32_bits(first_block);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2236) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2237)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2238) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2239) * Attempt to perform RAID bypass mapping for a logical volume I/O.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2240) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2241)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2242) #define PQI_RAID_BYPASS_INELIGIBLE 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2243)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2244) static int pqi_raid_bypass_submit_scsi_cmd(struct pqi_ctrl_info *ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2245) struct pqi_scsi_dev *device, struct scsi_cmnd *scmd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2246) struct pqi_queue_group *queue_group)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2247) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2248) struct raid_map *raid_map;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2249) bool is_write = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2250) u32 map_index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2251) u64 first_block;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2252) u64 last_block;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2253) u32 block_cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2254) u32 blocks_per_row;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2255) u64 first_row;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2256) u64 last_row;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2257) u32 first_row_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2258) u32 last_row_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2259) u32 first_column;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2260) u32 last_column;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2261) u64 r0_first_row;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2262) u64 r0_last_row;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2263) u32 r5or6_blocks_per_row;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2264) u64 r5or6_first_row;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2265) u64 r5or6_last_row;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2266) u32 r5or6_first_row_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2267) u32 r5or6_last_row_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2268) u32 r5or6_first_column;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2269) u32 r5or6_last_column;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2270) u16 data_disks_per_row;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2271) u32 total_disks_per_row;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2272) u16 layout_map_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2273) u32 stripesize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2274) u16 strip_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2275) u32 first_group;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2276) u32 last_group;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2277) u32 current_group;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2278) u32 map_row;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2279) u32 aio_handle;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2280) u64 disk_block;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2281) u32 disk_block_cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2282) u8 cdb[16];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2283) u8 cdb_length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2284) int offload_to_mirror;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2285) struct pqi_encryption_info *encryption_info_ptr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2286) struct pqi_encryption_info encryption_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2287) #if BITS_PER_LONG == 32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2288) u64 tmpdiv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2289) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2290)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2291) /* Check for valid opcode, get LBA and block count. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2292) switch (scmd->cmnd[0]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2293) case WRITE_6:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2294) is_write = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2295) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2296) case READ_6:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2297) first_block = (u64)(((scmd->cmnd[1] & 0x1f) << 16) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2298) (scmd->cmnd[2] << 8) | scmd->cmnd[3]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2299) block_cnt = (u32)scmd->cmnd[4];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2300) if (block_cnt == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2301) block_cnt = 256;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2302) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2303) case WRITE_10:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2304) is_write = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2305) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2306) case READ_10:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2307) first_block = (u64)get_unaligned_be32(&scmd->cmnd[2]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2308) block_cnt = (u32)get_unaligned_be16(&scmd->cmnd[7]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2309) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2310) case WRITE_12:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2311) is_write = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2312) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2313) case READ_12:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2314) first_block = (u64)get_unaligned_be32(&scmd->cmnd[2]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2315) block_cnt = get_unaligned_be32(&scmd->cmnd[6]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2316) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2317) case WRITE_16:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2318) is_write = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2319) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2320) case READ_16:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2321) first_block = get_unaligned_be64(&scmd->cmnd[2]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2322) block_cnt = get_unaligned_be32(&scmd->cmnd[10]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2323) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2324) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2325) /* Process via normal I/O path. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2326) return PQI_RAID_BYPASS_INELIGIBLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2327) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2328)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2329) /* Check for write to non-RAID-0. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2330) if (is_write && device->raid_level != SA_RAID_0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2331) return PQI_RAID_BYPASS_INELIGIBLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2332)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2333) if (unlikely(block_cnt == 0))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2334) return PQI_RAID_BYPASS_INELIGIBLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2335)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2336) last_block = first_block + block_cnt - 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2337) raid_map = device->raid_map;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2338)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2339) /* Check for invalid block or wraparound. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2340) if (last_block >= get_unaligned_le64(&raid_map->volume_blk_cnt) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2341) last_block < first_block)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2342) return PQI_RAID_BYPASS_INELIGIBLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2343)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2344) data_disks_per_row = get_unaligned_le16(&raid_map->data_disks_per_row);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2345) strip_size = get_unaligned_le16(&raid_map->strip_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2346) layout_map_count = get_unaligned_le16(&raid_map->layout_map_count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2347)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2348) /* Calculate stripe information for the request. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2349) blocks_per_row = data_disks_per_row * strip_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2350) #if BITS_PER_LONG == 32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2351) tmpdiv = first_block;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2352) do_div(tmpdiv, blocks_per_row);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2353) first_row = tmpdiv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2354) tmpdiv = last_block;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2355) do_div(tmpdiv, blocks_per_row);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2356) last_row = tmpdiv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2357) first_row_offset = (u32)(first_block - (first_row * blocks_per_row));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2358) last_row_offset = (u32)(last_block - (last_row * blocks_per_row));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2359) tmpdiv = first_row_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2360) do_div(tmpdiv, strip_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2361) first_column = tmpdiv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2362) tmpdiv = last_row_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2363) do_div(tmpdiv, strip_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2364) last_column = tmpdiv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2365) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2366) first_row = first_block / blocks_per_row;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2367) last_row = last_block / blocks_per_row;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2368) first_row_offset = (u32)(first_block - (first_row * blocks_per_row));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2369) last_row_offset = (u32)(last_block - (last_row * blocks_per_row));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2370) first_column = first_row_offset / strip_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2371) last_column = last_row_offset / strip_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2372) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2373)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2374) /* If this isn't a single row/column then give to the controller. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2375) if (first_row != last_row || first_column != last_column)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2376) return PQI_RAID_BYPASS_INELIGIBLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2377)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2378) /* Proceeding with driver mapping. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2379) total_disks_per_row = data_disks_per_row +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2380) get_unaligned_le16(&raid_map->metadata_disks_per_row);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2381) map_row = ((u32)(first_row >> raid_map->parity_rotation_shift)) %
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2382) get_unaligned_le16(&raid_map->row_cnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2383) map_index = (map_row * total_disks_per_row) + first_column;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2384)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2385) /* RAID 1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2386) if (device->raid_level == SA_RAID_1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2387) if (device->offload_to_mirror)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2388) map_index += data_disks_per_row;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2389) device->offload_to_mirror = !device->offload_to_mirror;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2390) } else if (device->raid_level == SA_RAID_ADM) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2391) /* RAID ADM */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2392) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2393) * Handles N-way mirrors (R1-ADM) and R10 with # of drives
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2394) * divisible by 3.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2395) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2396) offload_to_mirror = device->offload_to_mirror;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2397) if (offload_to_mirror == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2398) /* use physical disk in the first mirrored group. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2399) map_index %= data_disks_per_row;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2400) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2401) do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2402) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2403) * Determine mirror group that map_index
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2404) * indicates.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2405) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2406) current_group = map_index / data_disks_per_row;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2407)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2408) if (offload_to_mirror != current_group) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2409) if (current_group <
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2410) layout_map_count - 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2411) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2412) * Select raid index from
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2413) * next group.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2414) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2415) map_index += data_disks_per_row;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2416) current_group++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2417) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2418) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2419) * Select raid index from first
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2420) * group.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2421) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2422) map_index %= data_disks_per_row;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2423) current_group = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2424) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2425) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2426) } while (offload_to_mirror != current_group);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2427) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2428)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2429) /* Set mirror group to use next time. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2430) offload_to_mirror =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2431) (offload_to_mirror >= layout_map_count - 1) ?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2432) 0 : offload_to_mirror + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2433) device->offload_to_mirror = offload_to_mirror;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2434) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2435) * Avoid direct use of device->offload_to_mirror within this
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2436) * function since multiple threads might simultaneously
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2437) * increment it beyond the range of device->layout_map_count -1.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2438) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2439) } else if ((device->raid_level == SA_RAID_5 ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2440) device->raid_level == SA_RAID_6) && layout_map_count > 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2441) /* RAID 50/60 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2442) /* Verify first and last block are in same RAID group */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2443) r5or6_blocks_per_row = strip_size * data_disks_per_row;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2444) stripesize = r5or6_blocks_per_row * layout_map_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2445) #if BITS_PER_LONG == 32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2446) tmpdiv = first_block;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2447) first_group = do_div(tmpdiv, stripesize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2448) tmpdiv = first_group;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2449) do_div(tmpdiv, r5or6_blocks_per_row);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2450) first_group = tmpdiv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2451) tmpdiv = last_block;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2452) last_group = do_div(tmpdiv, stripesize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2453) tmpdiv = last_group;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2454) do_div(tmpdiv, r5or6_blocks_per_row);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2455) last_group = tmpdiv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2456) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2457) first_group = (first_block % stripesize) / r5or6_blocks_per_row;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2458) last_group = (last_block % stripesize) / r5or6_blocks_per_row;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2459) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2460) if (first_group != last_group)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2461) return PQI_RAID_BYPASS_INELIGIBLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2462)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2463) /* Verify request is in a single row of RAID 5/6 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2464) #if BITS_PER_LONG == 32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2465) tmpdiv = first_block;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2466) do_div(tmpdiv, stripesize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2467) first_row = r5or6_first_row = r0_first_row = tmpdiv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2468) tmpdiv = last_block;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2469) do_div(tmpdiv, stripesize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2470) r5or6_last_row = r0_last_row = tmpdiv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2471) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2472) first_row = r5or6_first_row = r0_first_row =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2473) first_block / stripesize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2474) r5or6_last_row = r0_last_row = last_block / stripesize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2475) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2476) if (r5or6_first_row != r5or6_last_row)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2477) return PQI_RAID_BYPASS_INELIGIBLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2478)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2479) /* Verify request is in a single column */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2480) #if BITS_PER_LONG == 32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2481) tmpdiv = first_block;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2482) first_row_offset = do_div(tmpdiv, stripesize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2483) tmpdiv = first_row_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2484) first_row_offset = (u32)do_div(tmpdiv, r5or6_blocks_per_row);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2485) r5or6_first_row_offset = first_row_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2486) tmpdiv = last_block;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2487) r5or6_last_row_offset = do_div(tmpdiv, stripesize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2488) tmpdiv = r5or6_last_row_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2489) r5or6_last_row_offset = do_div(tmpdiv, r5or6_blocks_per_row);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2490) tmpdiv = r5or6_first_row_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2491) do_div(tmpdiv, strip_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2492) first_column = r5or6_first_column = tmpdiv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2493) tmpdiv = r5or6_last_row_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2494) do_div(tmpdiv, strip_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2495) r5or6_last_column = tmpdiv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2496) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2497) first_row_offset = r5or6_first_row_offset =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2498) (u32)((first_block % stripesize) %
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2499) r5or6_blocks_per_row);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2500)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2501) r5or6_last_row_offset =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2502) (u32)((last_block % stripesize) %
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2503) r5or6_blocks_per_row);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2504)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2505) first_column = r5or6_first_row_offset / strip_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2506) r5or6_first_column = first_column;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2507) r5or6_last_column = r5or6_last_row_offset / strip_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2508) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2509) if (r5or6_first_column != r5or6_last_column)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2510) return PQI_RAID_BYPASS_INELIGIBLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2511)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2512) /* Request is eligible */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2513) map_row =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2514) ((u32)(first_row >> raid_map->parity_rotation_shift)) %
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2515) get_unaligned_le16(&raid_map->row_cnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2516)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2517) map_index = (first_group *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2518) (get_unaligned_le16(&raid_map->row_cnt) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2519) total_disks_per_row)) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2520) (map_row * total_disks_per_row) + first_column;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2521) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2522)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2523) aio_handle = raid_map->disk_data[map_index].aio_handle;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2524) disk_block = get_unaligned_le64(&raid_map->disk_starting_blk) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2525) first_row * strip_size +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2526) (first_row_offset - first_column * strip_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2527) disk_block_cnt = block_cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2528)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2529) /* Handle differing logical/physical block sizes. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2530) if (raid_map->phys_blk_shift) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2531) disk_block <<= raid_map->phys_blk_shift;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2532) disk_block_cnt <<= raid_map->phys_blk_shift;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2533) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2534)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2535) if (unlikely(disk_block_cnt > 0xffff))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2536) return PQI_RAID_BYPASS_INELIGIBLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2537)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2538) /* Build the new CDB for the physical disk I/O. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2539) if (disk_block > 0xffffffff) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2540) cdb[0] = is_write ? WRITE_16 : READ_16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2541) cdb[1] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2542) put_unaligned_be64(disk_block, &cdb[2]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2543) put_unaligned_be32(disk_block_cnt, &cdb[10]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2544) cdb[14] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2545) cdb[15] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2546) cdb_length = 16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2547) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2548) cdb[0] = is_write ? WRITE_10 : READ_10;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2549) cdb[1] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2550) put_unaligned_be32((u32)disk_block, &cdb[2]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2551) cdb[6] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2552) put_unaligned_be16((u16)disk_block_cnt, &cdb[7]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2553) cdb[9] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2554) cdb_length = 10;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2555) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2556)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2557) if (get_unaligned_le16(&raid_map->flags) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2558) RAID_MAP_ENCRYPTION_ENABLED) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2559) pqi_set_encryption_info(&encryption_info, raid_map,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2560) first_block);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2561) encryption_info_ptr = &encryption_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2562) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2563) encryption_info_ptr = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2564) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2565)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2566) return pqi_aio_submit_io(ctrl_info, scmd, aio_handle,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2567) cdb, cdb_length, queue_group, encryption_info_ptr, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2568) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2569)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2570) #define PQI_STATUS_IDLE 0x0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2571)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2572) #define PQI_CREATE_ADMIN_QUEUE_PAIR 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2573) #define PQI_DELETE_ADMIN_QUEUE_PAIR 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2574)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2575) #define PQI_DEVICE_STATE_POWER_ON_AND_RESET 0x0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2576) #define PQI_DEVICE_STATE_STATUS_AVAILABLE 0x1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2577) #define PQI_DEVICE_STATE_ALL_REGISTERS_READY 0x2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2578) #define PQI_DEVICE_STATE_ADMIN_QUEUE_PAIR_READY 0x3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2579) #define PQI_DEVICE_STATE_ERROR 0x4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2580)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2581) #define PQI_MODE_READY_TIMEOUT_SECS 30
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2582) #define PQI_MODE_READY_POLL_INTERVAL_MSECS 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2583)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2584) static int pqi_wait_for_pqi_mode_ready(struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2585) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2586) struct pqi_device_registers __iomem *pqi_registers;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2587) unsigned long timeout;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2588) u64 signature;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2589) u8 status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2590)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2591) pqi_registers = ctrl_info->pqi_registers;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2592) timeout = (PQI_MODE_READY_TIMEOUT_SECS * PQI_HZ) + jiffies;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2593)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2594) while (1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2595) signature = readq(&pqi_registers->signature);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2596) if (memcmp(&signature, PQI_DEVICE_SIGNATURE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2597) sizeof(signature)) == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2598) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2599) if (time_after(jiffies, timeout)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2600) dev_err(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2601) "timed out waiting for PQI signature\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2602) return -ETIMEDOUT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2603) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2604) msleep(PQI_MODE_READY_POLL_INTERVAL_MSECS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2605) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2606)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2607) while (1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2608) status = readb(&pqi_registers->function_and_status_code);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2609) if (status == PQI_STATUS_IDLE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2610) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2611) if (time_after(jiffies, timeout)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2612) dev_err(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2613) "timed out waiting for PQI IDLE\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2614) return -ETIMEDOUT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2615) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2616) msleep(PQI_MODE_READY_POLL_INTERVAL_MSECS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2617) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2618)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2619) while (1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2620) if (readl(&pqi_registers->device_status) ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2621) PQI_DEVICE_STATE_ALL_REGISTERS_READY)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2622) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2623) if (time_after(jiffies, timeout)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2624) dev_err(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2625) "timed out waiting for PQI all registers ready\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2626) return -ETIMEDOUT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2627) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2628) msleep(PQI_MODE_READY_POLL_INTERVAL_MSECS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2629) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2630)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2631) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2632) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2633)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2634) static inline void pqi_aio_path_disabled(struct pqi_io_request *io_request)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2635) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2636) struct pqi_scsi_dev *device;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2637)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2638) device = io_request->scmd->device->hostdata;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2639) device->raid_bypass_enabled = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2640) device->aio_enabled = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2641) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2642)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2643) static inline void pqi_take_device_offline(struct scsi_device *sdev, char *path)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2644) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2645) struct pqi_ctrl_info *ctrl_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2646) struct pqi_scsi_dev *device;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2647)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2648) device = sdev->hostdata;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2649) if (device->device_offline)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2650) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2651)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2652) device->device_offline = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2653) ctrl_info = shost_to_hba(sdev->host);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2654) pqi_schedule_rescan_worker(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2655) dev_err(&ctrl_info->pci_dev->dev, "re-scanning %s scsi %d:%d:%d:%d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2656) path, ctrl_info->scsi_host->host_no, device->bus,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2657) device->target, device->lun);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2658) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2659)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2660) static void pqi_process_raid_io_error(struct pqi_io_request *io_request)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2661) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2662) u8 scsi_status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2663) u8 host_byte;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2664) struct scsi_cmnd *scmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2665) struct pqi_raid_error_info *error_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2666) size_t sense_data_length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2667) int residual_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2668) int xfer_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2669) struct scsi_sense_hdr sshdr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2670)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2671) scmd = io_request->scmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2672) if (!scmd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2673) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2674)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2675) error_info = io_request->error_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2676) scsi_status = error_info->status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2677) host_byte = DID_OK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2678)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2679) switch (error_info->data_out_result) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2680) case PQI_DATA_IN_OUT_GOOD:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2681) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2682) case PQI_DATA_IN_OUT_UNDERFLOW:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2683) xfer_count =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2684) get_unaligned_le32(&error_info->data_out_transferred);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2685) residual_count = scsi_bufflen(scmd) - xfer_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2686) scsi_set_resid(scmd, residual_count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2687) if (xfer_count < scmd->underflow)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2688) host_byte = DID_SOFT_ERROR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2689) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2690) case PQI_DATA_IN_OUT_UNSOLICITED_ABORT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2691) case PQI_DATA_IN_OUT_ABORTED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2692) host_byte = DID_ABORT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2693) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2694) case PQI_DATA_IN_OUT_TIMEOUT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2695) host_byte = DID_TIME_OUT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2696) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2697) case PQI_DATA_IN_OUT_BUFFER_OVERFLOW:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2698) case PQI_DATA_IN_OUT_PROTOCOL_ERROR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2699) case PQI_DATA_IN_OUT_BUFFER_ERROR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2700) case PQI_DATA_IN_OUT_BUFFER_OVERFLOW_DESCRIPTOR_AREA:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2701) case PQI_DATA_IN_OUT_BUFFER_OVERFLOW_BRIDGE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2702) case PQI_DATA_IN_OUT_ERROR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2703) case PQI_DATA_IN_OUT_HARDWARE_ERROR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2704) case PQI_DATA_IN_OUT_PCIE_FABRIC_ERROR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2705) case PQI_DATA_IN_OUT_PCIE_COMPLETION_TIMEOUT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2706) case PQI_DATA_IN_OUT_PCIE_COMPLETER_ABORT_RECEIVED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2707) case PQI_DATA_IN_OUT_PCIE_UNSUPPORTED_REQUEST_RECEIVED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2708) case PQI_DATA_IN_OUT_PCIE_ECRC_CHECK_FAILED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2709) case PQI_DATA_IN_OUT_PCIE_UNSUPPORTED_REQUEST:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2710) case PQI_DATA_IN_OUT_PCIE_ACS_VIOLATION:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2711) case PQI_DATA_IN_OUT_PCIE_TLP_PREFIX_BLOCKED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2712) case PQI_DATA_IN_OUT_PCIE_POISONED_MEMORY_READ:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2713) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2714) host_byte = DID_ERROR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2715) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2716) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2717)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2718) sense_data_length = get_unaligned_le16(&error_info->sense_data_length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2719) if (sense_data_length == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2720) sense_data_length =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2721) get_unaligned_le16(&error_info->response_data_length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2722) if (sense_data_length) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2723) if (sense_data_length > sizeof(error_info->data))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2724) sense_data_length = sizeof(error_info->data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2725)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2726) if (scsi_status == SAM_STAT_CHECK_CONDITION &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2727) scsi_normalize_sense(error_info->data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2728) sense_data_length, &sshdr) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2729) sshdr.sense_key == HARDWARE_ERROR &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2730) sshdr.asc == 0x3e) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2731) struct pqi_ctrl_info *ctrl_info = shost_to_hba(scmd->device->host);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2732) struct pqi_scsi_dev *device = scmd->device->hostdata;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2733)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2734) switch (sshdr.ascq) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2735) case 0x1: /* LOGICAL UNIT FAILURE */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2736) if (printk_ratelimit())
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2737) scmd_printk(KERN_ERR, scmd, "received 'logical unit failure' from controller for scsi %d:%d:%d:%d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2738) ctrl_info->scsi_host->host_no, device->bus, device->target, device->lun);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2739) pqi_take_device_offline(scmd->device, "RAID");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2740) host_byte = DID_NO_CONNECT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2741) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2742)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2743) default: /* See http://www.t10.org/lists/asc-num.htm#ASC_3E */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2744) if (printk_ratelimit())
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2745) scmd_printk(KERN_ERR, scmd, "received unhandled error %d from controller for scsi %d:%d:%d:%d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2746) sshdr.ascq, ctrl_info->scsi_host->host_no, device->bus, device->target, device->lun);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2747) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2748) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2749) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2750)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2751) if (sense_data_length > SCSI_SENSE_BUFFERSIZE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2752) sense_data_length = SCSI_SENSE_BUFFERSIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2753) memcpy(scmd->sense_buffer, error_info->data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2754) sense_data_length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2755) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2756)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2757) scmd->result = scsi_status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2758) set_host_byte(scmd, host_byte);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2759) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2760)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2761) static void pqi_process_aio_io_error(struct pqi_io_request *io_request)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2762) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2763) u8 scsi_status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2764) u8 host_byte;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2765) struct scsi_cmnd *scmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2766) struct pqi_aio_error_info *error_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2767) size_t sense_data_length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2768) int residual_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2769) int xfer_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2770) bool device_offline;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2771)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2772) scmd = io_request->scmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2773) error_info = io_request->error_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2774) host_byte = DID_OK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2775) sense_data_length = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2776) device_offline = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2777)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2778) switch (error_info->service_response) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2779) case PQI_AIO_SERV_RESPONSE_COMPLETE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2780) scsi_status = error_info->status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2781) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2782) case PQI_AIO_SERV_RESPONSE_FAILURE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2783) switch (error_info->status) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2784) case PQI_AIO_STATUS_IO_ABORTED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2785) scsi_status = SAM_STAT_TASK_ABORTED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2786) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2787) case PQI_AIO_STATUS_UNDERRUN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2788) scsi_status = SAM_STAT_GOOD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2789) residual_count = get_unaligned_le32(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2790) &error_info->residual_count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2791) scsi_set_resid(scmd, residual_count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2792) xfer_count = scsi_bufflen(scmd) - residual_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2793) if (xfer_count < scmd->underflow)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2794) host_byte = DID_SOFT_ERROR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2795) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2796) case PQI_AIO_STATUS_OVERRUN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2797) scsi_status = SAM_STAT_GOOD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2798) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2799) case PQI_AIO_STATUS_AIO_PATH_DISABLED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2800) pqi_aio_path_disabled(io_request);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2801) scsi_status = SAM_STAT_GOOD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2802) io_request->status = -EAGAIN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2803) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2804) case PQI_AIO_STATUS_NO_PATH_TO_DEVICE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2805) case PQI_AIO_STATUS_INVALID_DEVICE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2806) if (!io_request->raid_bypass) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2807) device_offline = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2808) pqi_take_device_offline(scmd->device, "AIO");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2809) host_byte = DID_NO_CONNECT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2810) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2811) scsi_status = SAM_STAT_CHECK_CONDITION;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2812) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2813) case PQI_AIO_STATUS_IO_ERROR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2814) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2815) scsi_status = SAM_STAT_CHECK_CONDITION;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2816) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2817) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2818) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2819) case PQI_AIO_SERV_RESPONSE_TMF_COMPLETE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2820) case PQI_AIO_SERV_RESPONSE_TMF_SUCCEEDED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2821) scsi_status = SAM_STAT_GOOD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2822) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2823) case PQI_AIO_SERV_RESPONSE_TMF_REJECTED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2824) case PQI_AIO_SERV_RESPONSE_TMF_INCORRECT_LUN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2825) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2826) scsi_status = SAM_STAT_CHECK_CONDITION;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2827) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2828) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2829)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2830) if (error_info->data_present) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2831) sense_data_length =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2832) get_unaligned_le16(&error_info->data_length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2833) if (sense_data_length) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2834) if (sense_data_length > sizeof(error_info->data))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2835) sense_data_length = sizeof(error_info->data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2836) if (sense_data_length > SCSI_SENSE_BUFFERSIZE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2837) sense_data_length = SCSI_SENSE_BUFFERSIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2838) memcpy(scmd->sense_buffer, error_info->data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2839) sense_data_length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2840) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2841) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2842)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2843) if (device_offline && sense_data_length == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2844) scsi_build_sense_buffer(0, scmd->sense_buffer, HARDWARE_ERROR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2845) 0x3e, 0x1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2846)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2847) scmd->result = scsi_status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2848) set_host_byte(scmd, host_byte);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2849) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2850)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2851) static void pqi_process_io_error(unsigned int iu_type,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2852) struct pqi_io_request *io_request)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2853) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2854) switch (iu_type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2855) case PQI_RESPONSE_IU_RAID_PATH_IO_ERROR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2856) pqi_process_raid_io_error(io_request);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2857) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2858) case PQI_RESPONSE_IU_AIO_PATH_IO_ERROR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2859) pqi_process_aio_io_error(io_request);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2860) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2861) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2862) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2863)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2864) static int pqi_interpret_task_management_response(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2865) struct pqi_task_management_response *response)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2866) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2867) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2868)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2869) switch (response->response_code) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2870) case SOP_TMF_COMPLETE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2871) case SOP_TMF_FUNCTION_SUCCEEDED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2872) rc = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2873) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2874) case SOP_TMF_REJECTED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2875) rc = -EAGAIN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2876) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2877) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2878) rc = -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2879) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2880) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2881)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2882) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2883) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2884)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2885) static inline void pqi_invalid_response(struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2886) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2887) pqi_take_ctrl_offline(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2888) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2889)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2890) static int pqi_process_io_intr(struct pqi_ctrl_info *ctrl_info, struct pqi_queue_group *queue_group)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2891) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2892) int num_responses;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2893) pqi_index_t oq_pi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2894) pqi_index_t oq_ci;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2895) struct pqi_io_request *io_request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2896) struct pqi_io_response *response;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2897) u16 request_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2898)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2899) num_responses = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2900) oq_ci = queue_group->oq_ci_copy;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2901)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2902) while (1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2903) oq_pi = readl(queue_group->oq_pi);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2904) if (oq_pi >= ctrl_info->num_elements_per_oq) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2905) pqi_invalid_response(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2906) dev_err(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2907) "I/O interrupt: producer index (%u) out of range (0-%u): consumer index: %u\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2908) oq_pi, ctrl_info->num_elements_per_oq - 1, oq_ci);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2909) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2910) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2911) if (oq_pi == oq_ci)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2912) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2913)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2914) num_responses++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2915) response = queue_group->oq_element_array +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2916) (oq_ci * PQI_OPERATIONAL_OQ_ELEMENT_LENGTH);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2917)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2918) request_id = get_unaligned_le16(&response->request_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2919) if (request_id >= ctrl_info->max_io_slots) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2920) pqi_invalid_response(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2921) dev_err(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2922) "request ID in response (%u) out of range (0-%u): producer index: %u consumer index: %u\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2923) request_id, ctrl_info->max_io_slots - 1, oq_pi, oq_ci);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2924) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2925) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2926)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2927) io_request = &ctrl_info->io_request_pool[request_id];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2928) if (atomic_read(&io_request->refcount) == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2929) pqi_invalid_response(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2930) dev_err(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2931) "request ID in response (%u) does not match an outstanding I/O request: producer index: %u consumer index: %u\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2932) request_id, oq_pi, oq_ci);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2933) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2934) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2935)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2936) switch (response->header.iu_type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2937) case PQI_RESPONSE_IU_RAID_PATH_IO_SUCCESS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2938) case PQI_RESPONSE_IU_AIO_PATH_IO_SUCCESS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2939) if (io_request->scmd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2940) io_request->scmd->result = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2941) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2942) case PQI_RESPONSE_IU_GENERAL_MANAGEMENT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2943) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2944) case PQI_RESPONSE_IU_VENDOR_GENERAL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2945) io_request->status =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2946) get_unaligned_le16(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2947) &((struct pqi_vendor_general_response *)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2948) response)->status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2949) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2950) case PQI_RESPONSE_IU_TASK_MANAGEMENT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2951) io_request->status =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2952) pqi_interpret_task_management_response(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2953) (void *)response);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2954) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2955) case PQI_RESPONSE_IU_AIO_PATH_DISABLED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2956) pqi_aio_path_disabled(io_request);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2957) io_request->status = -EAGAIN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2958) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2959) case PQI_RESPONSE_IU_RAID_PATH_IO_ERROR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2960) case PQI_RESPONSE_IU_AIO_PATH_IO_ERROR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2961) io_request->error_info = ctrl_info->error_buffer +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2962) (get_unaligned_le16(&response->error_index) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2963) PQI_ERROR_BUFFER_ELEMENT_LENGTH);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2964) pqi_process_io_error(response->header.iu_type, io_request);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2965) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2966) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2967) pqi_invalid_response(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2968) dev_err(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2969) "unexpected IU type: 0x%x: producer index: %u consumer index: %u\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2970) response->header.iu_type, oq_pi, oq_ci);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2971) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2972) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2973)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2974) io_request->io_complete_callback(io_request, io_request->context);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2975)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2976) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2977) * Note that the I/O request structure CANNOT BE TOUCHED after
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2978) * returning from the I/O completion callback!
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2979) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2980) oq_ci = (oq_ci + 1) % ctrl_info->num_elements_per_oq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2981) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2982)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2983) if (num_responses) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2984) queue_group->oq_ci_copy = oq_ci;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2985) writel(oq_ci, queue_group->oq_ci);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2986) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2987)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2988) return num_responses;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2989) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2990)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2991) static inline unsigned int pqi_num_elements_free(unsigned int pi,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2992) unsigned int ci, unsigned int elements_in_queue)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2993) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2994) unsigned int num_elements_used;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2995)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2996) if (pi >= ci)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2997) num_elements_used = pi - ci;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2998) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2999) num_elements_used = elements_in_queue - ci + pi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3001) return elements_in_queue - num_elements_used - 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3002) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3003)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3004) static void pqi_send_event_ack(struct pqi_ctrl_info *ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3005) struct pqi_event_acknowledge_request *iu, size_t iu_length)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3006) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3007) pqi_index_t iq_pi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3008) pqi_index_t iq_ci;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3009) unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3010) void *next_element;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3011) struct pqi_queue_group *queue_group;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3012)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3013) queue_group = &ctrl_info->queue_groups[PQI_DEFAULT_QUEUE_GROUP];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3014) put_unaligned_le16(queue_group->oq_id, &iu->header.response_queue_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3015)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3016) while (1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3017) spin_lock_irqsave(&queue_group->submit_lock[RAID_PATH], flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3018)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3019) iq_pi = queue_group->iq_pi_copy[RAID_PATH];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3020) iq_ci = readl(queue_group->iq_ci[RAID_PATH]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3021)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3022) if (pqi_num_elements_free(iq_pi, iq_ci,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3023) ctrl_info->num_elements_per_iq))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3024) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3025)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3026) spin_unlock_irqrestore(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3027) &queue_group->submit_lock[RAID_PATH], flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3028)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3029) if (pqi_ctrl_offline(ctrl_info))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3030) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3031) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3032)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3033) next_element = queue_group->iq_element_array[RAID_PATH] +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3034) (iq_pi * PQI_OPERATIONAL_IQ_ELEMENT_LENGTH);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3035)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3036) memcpy(next_element, iu, iu_length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3037)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3038) iq_pi = (iq_pi + 1) % ctrl_info->num_elements_per_iq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3039) queue_group->iq_pi_copy[RAID_PATH] = iq_pi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3040)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3041) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3042) * This write notifies the controller that an IU is available to be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3043) * processed.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3044) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3045) writel(iq_pi, queue_group->iq_pi[RAID_PATH]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3046)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3047) spin_unlock_irqrestore(&queue_group->submit_lock[RAID_PATH], flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3048) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3049)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3050) static void pqi_acknowledge_event(struct pqi_ctrl_info *ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3051) struct pqi_event *event)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3052) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3053) struct pqi_event_acknowledge_request request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3054)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3055) memset(&request, 0, sizeof(request));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3056)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3057) request.header.iu_type = PQI_REQUEST_IU_ACKNOWLEDGE_VENDOR_EVENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3058) put_unaligned_le16(sizeof(request) - PQI_REQUEST_HEADER_LENGTH,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3059) &request.header.iu_length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3060) request.event_type = event->event_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3061) request.event_id = event->event_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3062) request.additional_event_id = event->additional_event_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3063)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3064) pqi_send_event_ack(ctrl_info, &request, sizeof(request));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3065) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3066)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3067) #define PQI_SOFT_RESET_STATUS_TIMEOUT_SECS 30
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3068) #define PQI_SOFT_RESET_STATUS_POLL_INTERVAL_SECS 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3069)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3070) static enum pqi_soft_reset_status pqi_poll_for_soft_reset_status(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3071) struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3072) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3073) unsigned long timeout;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3074) u8 status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3075)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3076) timeout = (PQI_SOFT_RESET_STATUS_TIMEOUT_SECS * PQI_HZ) + jiffies;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3077)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3078) while (1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3079) status = pqi_read_soft_reset_status(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3080) if (status & PQI_SOFT_RESET_INITIATE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3081) return RESET_INITIATE_DRIVER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3082)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3083) if (status & PQI_SOFT_RESET_ABORT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3084) return RESET_ABORT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3085)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3086) if (time_after(jiffies, timeout)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3087) dev_err(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3088) "timed out waiting for soft reset status\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3089) return RESET_TIMEDOUT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3090) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3091)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3092) if (!sis_is_firmware_running(ctrl_info))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3093) return RESET_NORESPONSE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3094)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3095) ssleep(PQI_SOFT_RESET_STATUS_POLL_INTERVAL_SECS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3096) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3097) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3098)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3099) static void pqi_process_soft_reset(struct pqi_ctrl_info *ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3100) enum pqi_soft_reset_status reset_status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3101) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3102) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3103)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3104) switch (reset_status) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3105) case RESET_INITIATE_DRIVER:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3106) case RESET_TIMEDOUT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3107) dev_info(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3108) "resetting controller %u\n", ctrl_info->ctrl_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3109) sis_soft_reset(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3110) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3111) case RESET_INITIATE_FIRMWARE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3112) rc = pqi_ofa_ctrl_restart(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3113) pqi_ofa_free_host_buffer(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3114) dev_info(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3115) "Online Firmware Activation for controller %u: %s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3116) ctrl_info->ctrl_id, rc == 0 ? "SUCCESS" : "FAILED");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3117) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3118) case RESET_ABORT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3119) pqi_ofa_ctrl_unquiesce(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3120) dev_info(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3121) "Online Firmware Activation for controller %u: %s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3122) ctrl_info->ctrl_id, "ABORTED");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3123) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3124) case RESET_NORESPONSE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3125) pqi_ofa_free_host_buffer(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3126) pqi_take_ctrl_offline(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3127) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3128) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3129) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3130)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3131) static void pqi_ofa_process_event(struct pqi_ctrl_info *ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3132) struct pqi_event *event)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3133) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3134) u16 event_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3135) enum pqi_soft_reset_status status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3136)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3137) event_id = get_unaligned_le16(&event->event_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3138)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3139) mutex_lock(&ctrl_info->ofa_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3140)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3141) if (event_id == PQI_EVENT_OFA_QUIESCE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3142) dev_info(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3143) "Received Online Firmware Activation quiesce event for controller %u\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3144) ctrl_info->ctrl_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3145) pqi_ofa_ctrl_quiesce(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3146) pqi_acknowledge_event(ctrl_info, event);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3147) if (ctrl_info->soft_reset_handshake_supported) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3148) status = pqi_poll_for_soft_reset_status(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3149) pqi_process_soft_reset(ctrl_info, status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3150) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3151) pqi_process_soft_reset(ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3152) RESET_INITIATE_FIRMWARE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3153) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3154)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3155) } else if (event_id == PQI_EVENT_OFA_MEMORY_ALLOCATION) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3156) pqi_acknowledge_event(ctrl_info, event);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3157) pqi_ofa_setup_host_buffer(ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3158) le32_to_cpu(event->ofa_bytes_requested));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3159) pqi_ofa_host_memory_update(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3160) } else if (event_id == PQI_EVENT_OFA_CANCELLED) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3161) pqi_ofa_free_host_buffer(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3162) pqi_acknowledge_event(ctrl_info, event);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3163) dev_info(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3164) "Online Firmware Activation(%u) cancel reason : %u\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3165) ctrl_info->ctrl_id, event->ofa_cancel_reason);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3166) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3167)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3168) mutex_unlock(&ctrl_info->ofa_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3169) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3170)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3171) static void pqi_event_worker(struct work_struct *work)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3172) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3173) unsigned int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3174) struct pqi_ctrl_info *ctrl_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3175) struct pqi_event *event;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3176)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3177) ctrl_info = container_of(work, struct pqi_ctrl_info, event_work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3178)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3179) pqi_ctrl_busy(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3180) pqi_wait_if_ctrl_blocked(ctrl_info, NO_TIMEOUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3181) if (pqi_ctrl_offline(ctrl_info))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3182) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3183)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3184) pqi_schedule_rescan_worker_delayed(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3185)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3186) event = ctrl_info->events;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3187) for (i = 0; i < PQI_NUM_SUPPORTED_EVENTS; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3188) if (event->pending) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3189) event->pending = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3190) if (event->event_type == PQI_EVENT_TYPE_OFA) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3191) pqi_ctrl_unbusy(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3192) pqi_ofa_process_event(ctrl_info, event);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3193) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3194) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3195) pqi_acknowledge_event(ctrl_info, event);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3196) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3197) event++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3198) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3199)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3200) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3201) pqi_ctrl_unbusy(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3202) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3203)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3204) #define PQI_HEARTBEAT_TIMER_INTERVAL (10 * PQI_HZ)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3205)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3206) static void pqi_heartbeat_timer_handler(struct timer_list *t)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3207) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3208) int num_interrupts;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3209) u32 heartbeat_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3210) struct pqi_ctrl_info *ctrl_info = from_timer(ctrl_info, t,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3211) heartbeat_timer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3212)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3213) pqi_check_ctrl_health(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3214) if (pqi_ctrl_offline(ctrl_info))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3215) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3216)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3217) num_interrupts = atomic_read(&ctrl_info->num_interrupts);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3218) heartbeat_count = pqi_read_heartbeat_counter(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3219)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3220) if (num_interrupts == ctrl_info->previous_num_interrupts) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3221) if (heartbeat_count == ctrl_info->previous_heartbeat_count) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3222) dev_err(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3223) "no heartbeat detected - last heartbeat count: %u\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3224) heartbeat_count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3225) pqi_take_ctrl_offline(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3226) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3227) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3228) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3229) ctrl_info->previous_num_interrupts = num_interrupts;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3230) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3231)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3232) ctrl_info->previous_heartbeat_count = heartbeat_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3233) mod_timer(&ctrl_info->heartbeat_timer,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3234) jiffies + PQI_HEARTBEAT_TIMER_INTERVAL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3235) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3236)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3237) static void pqi_start_heartbeat_timer(struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3238) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3239) if (!ctrl_info->heartbeat_counter)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3240) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3241)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3242) ctrl_info->previous_num_interrupts =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3243) atomic_read(&ctrl_info->num_interrupts);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3244) ctrl_info->previous_heartbeat_count =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3245) pqi_read_heartbeat_counter(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3246)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3247) ctrl_info->heartbeat_timer.expires =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3248) jiffies + PQI_HEARTBEAT_TIMER_INTERVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3249) add_timer(&ctrl_info->heartbeat_timer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3250) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3251)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3252) static inline void pqi_stop_heartbeat_timer(struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3253) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3254) del_timer_sync(&ctrl_info->heartbeat_timer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3255) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3256)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3257) static inline int pqi_event_type_to_event_index(unsigned int event_type)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3258) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3259) int index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3260)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3261) for (index = 0; index < ARRAY_SIZE(pqi_supported_event_types); index++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3262) if (event_type == pqi_supported_event_types[index])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3263) return index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3264)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3265) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3266) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3267)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3268) static inline bool pqi_is_supported_event(unsigned int event_type)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3269) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3270) return pqi_event_type_to_event_index(event_type) != -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3271) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3272)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3273) static void pqi_ofa_capture_event_payload(struct pqi_event *event,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3274) struct pqi_event_response *response)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3275) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3276) u16 event_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3277)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3278) event_id = get_unaligned_le16(&event->event_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3279)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3280) if (event->event_type == PQI_EVENT_TYPE_OFA) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3281) if (event_id == PQI_EVENT_OFA_MEMORY_ALLOCATION) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3282) event->ofa_bytes_requested =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3283) response->data.ofa_memory_allocation.bytes_requested;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3284) } else if (event_id == PQI_EVENT_OFA_CANCELLED) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3285) event->ofa_cancel_reason =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3286) response->data.ofa_cancelled.reason;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3287) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3288) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3289) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3290)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3291) static int pqi_process_event_intr(struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3292) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3293) int num_events;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3294) pqi_index_t oq_pi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3295) pqi_index_t oq_ci;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3296) struct pqi_event_queue *event_queue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3297) struct pqi_event_response *response;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3298) struct pqi_event *event;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3299) int event_index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3300)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3301) event_queue = &ctrl_info->event_queue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3302) num_events = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3303) oq_ci = event_queue->oq_ci_copy;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3304)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3305) while (1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3306) oq_pi = readl(event_queue->oq_pi);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3307) if (oq_pi >= PQI_NUM_EVENT_QUEUE_ELEMENTS) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3308) pqi_invalid_response(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3309) dev_err(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3310) "event interrupt: producer index (%u) out of range (0-%u): consumer index: %u\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3311) oq_pi, PQI_NUM_EVENT_QUEUE_ELEMENTS - 1, oq_ci);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3312) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3313) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3314)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3315) if (oq_pi == oq_ci)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3316) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3317)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3318) num_events++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3319) response = event_queue->oq_element_array + (oq_ci * PQI_EVENT_OQ_ELEMENT_LENGTH);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3320)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3321) event_index =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3322) pqi_event_type_to_event_index(response->event_type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3323)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3324) if (event_index >= 0 && response->request_acknowledge) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3325) event = &ctrl_info->events[event_index];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3326) event->pending = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3327) event->event_type = response->event_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3328) event->event_id = response->event_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3329) event->additional_event_id = response->additional_event_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3330) if (event->event_type == PQI_EVENT_TYPE_OFA)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3331) pqi_ofa_capture_event_payload(event, response);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3332) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3333)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3334) oq_ci = (oq_ci + 1) % PQI_NUM_EVENT_QUEUE_ELEMENTS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3335) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3336)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3337) if (num_events) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3338) event_queue->oq_ci_copy = oq_ci;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3339) writel(oq_ci, event_queue->oq_ci);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3340) schedule_work(&ctrl_info->event_work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3341) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3342)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3343) return num_events;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3344) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3345)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3346) #define PQI_LEGACY_INTX_MASK 0x1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3347)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3348) static inline void pqi_configure_legacy_intx(struct pqi_ctrl_info *ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3349) bool enable_intx)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3350) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3351) u32 intx_mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3352) struct pqi_device_registers __iomem *pqi_registers;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3353) volatile void __iomem *register_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3354)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3355) pqi_registers = ctrl_info->pqi_registers;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3356)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3357) if (enable_intx)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3358) register_addr = &pqi_registers->legacy_intx_mask_clear;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3359) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3360) register_addr = &pqi_registers->legacy_intx_mask_set;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3361)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3362) intx_mask = readl(register_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3363) intx_mask |= PQI_LEGACY_INTX_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3364) writel(intx_mask, register_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3365) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3366)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3367) static void pqi_change_irq_mode(struct pqi_ctrl_info *ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3368) enum pqi_irq_mode new_mode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3369) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3370) switch (ctrl_info->irq_mode) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3371) case IRQ_MODE_MSIX:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3372) switch (new_mode) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3373) case IRQ_MODE_MSIX:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3374) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3375) case IRQ_MODE_INTX:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3376) pqi_configure_legacy_intx(ctrl_info, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3377) sis_enable_intx(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3378) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3379) case IRQ_MODE_NONE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3380) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3381) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3382) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3383) case IRQ_MODE_INTX:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3384) switch (new_mode) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3385) case IRQ_MODE_MSIX:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3386) pqi_configure_legacy_intx(ctrl_info, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3387) sis_enable_msix(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3388) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3389) case IRQ_MODE_INTX:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3390) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3391) case IRQ_MODE_NONE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3392) pqi_configure_legacy_intx(ctrl_info, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3393) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3394) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3395) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3396) case IRQ_MODE_NONE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3397) switch (new_mode) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3398) case IRQ_MODE_MSIX:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3399) sis_enable_msix(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3400) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3401) case IRQ_MODE_INTX:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3402) pqi_configure_legacy_intx(ctrl_info, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3403) sis_enable_intx(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3404) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3405) case IRQ_MODE_NONE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3406) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3407) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3408) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3409) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3410)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3411) ctrl_info->irq_mode = new_mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3412) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3413)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3414) #define PQI_LEGACY_INTX_PENDING 0x1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3415)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3416) static inline bool pqi_is_valid_irq(struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3417) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3418) bool valid_irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3419) u32 intx_status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3420)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3421) switch (ctrl_info->irq_mode) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3422) case IRQ_MODE_MSIX:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3423) valid_irq = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3424) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3425) case IRQ_MODE_INTX:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3426) intx_status =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3427) readl(&ctrl_info->pqi_registers->legacy_intx_status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3428) if (intx_status & PQI_LEGACY_INTX_PENDING)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3429) valid_irq = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3430) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3431) valid_irq = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3432) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3433) case IRQ_MODE_NONE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3434) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3435) valid_irq = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3436) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3437) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3438)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3439) return valid_irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3440) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3441)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3442) static irqreturn_t pqi_irq_handler(int irq, void *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3443) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3444) struct pqi_ctrl_info *ctrl_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3445) struct pqi_queue_group *queue_group;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3446) int num_io_responses_handled;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3447) int num_events_handled;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3448)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3449) queue_group = data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3450) ctrl_info = queue_group->ctrl_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3451)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3452) if (!pqi_is_valid_irq(ctrl_info))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3453) return IRQ_NONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3454)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3455) num_io_responses_handled = pqi_process_io_intr(ctrl_info, queue_group);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3456) if (num_io_responses_handled < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3457) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3458)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3459) if (irq == ctrl_info->event_irq) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3460) num_events_handled = pqi_process_event_intr(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3461) if (num_events_handled < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3462) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3463) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3464) num_events_handled = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3465) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3466)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3467) if (num_io_responses_handled + num_events_handled > 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3468) atomic_inc(&ctrl_info->num_interrupts);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3469)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3470) pqi_start_io(ctrl_info, queue_group, RAID_PATH, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3471) pqi_start_io(ctrl_info, queue_group, AIO_PATH, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3472)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3473) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3474) return IRQ_HANDLED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3475) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3476)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3477) static int pqi_request_irqs(struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3478) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3479) struct pci_dev *pci_dev = ctrl_info->pci_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3480) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3481) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3482)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3483) ctrl_info->event_irq = pci_irq_vector(pci_dev, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3484)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3485) for (i = 0; i < ctrl_info->num_msix_vectors_enabled; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3486) rc = request_irq(pci_irq_vector(pci_dev, i), pqi_irq_handler, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3487) DRIVER_NAME_SHORT, &ctrl_info->queue_groups[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3488) if (rc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3489) dev_err(&pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3490) "irq %u init failed with error %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3491) pci_irq_vector(pci_dev, i), rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3492) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3493) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3494) ctrl_info->num_msix_vectors_initialized++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3495) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3496)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3497) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3498) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3499)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3500) static void pqi_free_irqs(struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3501) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3502) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3503)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3504) for (i = 0; i < ctrl_info->num_msix_vectors_initialized; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3505) free_irq(pci_irq_vector(ctrl_info->pci_dev, i),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3506) &ctrl_info->queue_groups[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3507)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3508) ctrl_info->num_msix_vectors_initialized = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3509) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3510)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3511) static int pqi_enable_msix_interrupts(struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3512) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3513) int num_vectors_enabled;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3514)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3515) num_vectors_enabled = pci_alloc_irq_vectors(ctrl_info->pci_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3516) PQI_MIN_MSIX_VECTORS, ctrl_info->num_queue_groups,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3517) PCI_IRQ_MSIX | PCI_IRQ_AFFINITY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3518) if (num_vectors_enabled < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3519) dev_err(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3520) "MSI-X init failed with error %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3521) num_vectors_enabled);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3522) return num_vectors_enabled;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3523) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3524)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3525) ctrl_info->num_msix_vectors_enabled = num_vectors_enabled;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3526) ctrl_info->irq_mode = IRQ_MODE_MSIX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3527) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3528) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3529)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3530) static void pqi_disable_msix_interrupts(struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3531) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3532) if (ctrl_info->num_msix_vectors_enabled) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3533) pci_free_irq_vectors(ctrl_info->pci_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3534) ctrl_info->num_msix_vectors_enabled = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3535) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3536) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3537)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3538) static int pqi_alloc_operational_queues(struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3539) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3540) unsigned int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3541) size_t alloc_length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3542) size_t element_array_length_per_iq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3543) size_t element_array_length_per_oq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3544) void *element_array;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3545) void __iomem *next_queue_index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3546) void *aligned_pointer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3547) unsigned int num_inbound_queues;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3548) unsigned int num_outbound_queues;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3549) unsigned int num_queue_indexes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3550) struct pqi_queue_group *queue_group;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3551)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3552) element_array_length_per_iq =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3553) PQI_OPERATIONAL_IQ_ELEMENT_LENGTH *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3554) ctrl_info->num_elements_per_iq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3555) element_array_length_per_oq =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3556) PQI_OPERATIONAL_OQ_ELEMENT_LENGTH *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3557) ctrl_info->num_elements_per_oq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3558) num_inbound_queues = ctrl_info->num_queue_groups * 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3559) num_outbound_queues = ctrl_info->num_queue_groups;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3560) num_queue_indexes = (ctrl_info->num_queue_groups * 3) + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3561)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3562) aligned_pointer = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3563)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3564) for (i = 0; i < num_inbound_queues; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3565) aligned_pointer = PTR_ALIGN(aligned_pointer,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3566) PQI_QUEUE_ELEMENT_ARRAY_ALIGNMENT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3567) aligned_pointer += element_array_length_per_iq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3568) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3569)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3570) for (i = 0; i < num_outbound_queues; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3571) aligned_pointer = PTR_ALIGN(aligned_pointer,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3572) PQI_QUEUE_ELEMENT_ARRAY_ALIGNMENT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3573) aligned_pointer += element_array_length_per_oq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3574) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3575)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3576) aligned_pointer = PTR_ALIGN(aligned_pointer,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3577) PQI_QUEUE_ELEMENT_ARRAY_ALIGNMENT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3578) aligned_pointer += PQI_NUM_EVENT_QUEUE_ELEMENTS *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3579) PQI_EVENT_OQ_ELEMENT_LENGTH;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3580)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3581) for (i = 0; i < num_queue_indexes; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3582) aligned_pointer = PTR_ALIGN(aligned_pointer,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3583) PQI_OPERATIONAL_INDEX_ALIGNMENT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3584) aligned_pointer += sizeof(pqi_index_t);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3585) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3586)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3587) alloc_length = (size_t)aligned_pointer +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3588) PQI_QUEUE_ELEMENT_ARRAY_ALIGNMENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3589)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3590) alloc_length += PQI_EXTRA_SGL_MEMORY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3591)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3592) ctrl_info->queue_memory_base =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3593) dma_alloc_coherent(&ctrl_info->pci_dev->dev, alloc_length,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3594) &ctrl_info->queue_memory_base_dma_handle,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3595) GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3596)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3597) if (!ctrl_info->queue_memory_base)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3598) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3599)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3600) ctrl_info->queue_memory_length = alloc_length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3601)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3602) element_array = PTR_ALIGN(ctrl_info->queue_memory_base,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3603) PQI_QUEUE_ELEMENT_ARRAY_ALIGNMENT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3604)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3605) for (i = 0; i < ctrl_info->num_queue_groups; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3606) queue_group = &ctrl_info->queue_groups[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3607) queue_group->iq_element_array[RAID_PATH] = element_array;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3608) queue_group->iq_element_array_bus_addr[RAID_PATH] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3609) ctrl_info->queue_memory_base_dma_handle +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3610) (element_array - ctrl_info->queue_memory_base);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3611) element_array += element_array_length_per_iq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3612) element_array = PTR_ALIGN(element_array,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3613) PQI_QUEUE_ELEMENT_ARRAY_ALIGNMENT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3614) queue_group->iq_element_array[AIO_PATH] = element_array;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3615) queue_group->iq_element_array_bus_addr[AIO_PATH] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3616) ctrl_info->queue_memory_base_dma_handle +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3617) (element_array - ctrl_info->queue_memory_base);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3618) element_array += element_array_length_per_iq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3619) element_array = PTR_ALIGN(element_array,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3620) PQI_QUEUE_ELEMENT_ARRAY_ALIGNMENT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3621) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3622)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3623) for (i = 0; i < ctrl_info->num_queue_groups; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3624) queue_group = &ctrl_info->queue_groups[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3625) queue_group->oq_element_array = element_array;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3626) queue_group->oq_element_array_bus_addr =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3627) ctrl_info->queue_memory_base_dma_handle +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3628) (element_array - ctrl_info->queue_memory_base);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3629) element_array += element_array_length_per_oq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3630) element_array = PTR_ALIGN(element_array,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3631) PQI_QUEUE_ELEMENT_ARRAY_ALIGNMENT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3632) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3633)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3634) ctrl_info->event_queue.oq_element_array = element_array;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3635) ctrl_info->event_queue.oq_element_array_bus_addr =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3636) ctrl_info->queue_memory_base_dma_handle +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3637) (element_array - ctrl_info->queue_memory_base);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3638) element_array += PQI_NUM_EVENT_QUEUE_ELEMENTS *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3639) PQI_EVENT_OQ_ELEMENT_LENGTH;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3640)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3641) next_queue_index = (void __iomem *)PTR_ALIGN(element_array,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3642) PQI_OPERATIONAL_INDEX_ALIGNMENT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3643)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3644) for (i = 0; i < ctrl_info->num_queue_groups; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3645) queue_group = &ctrl_info->queue_groups[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3646) queue_group->iq_ci[RAID_PATH] = next_queue_index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3647) queue_group->iq_ci_bus_addr[RAID_PATH] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3648) ctrl_info->queue_memory_base_dma_handle +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3649) (next_queue_index -
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3650) (void __iomem *)ctrl_info->queue_memory_base);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3651) next_queue_index += sizeof(pqi_index_t);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3652) next_queue_index = PTR_ALIGN(next_queue_index,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3653) PQI_OPERATIONAL_INDEX_ALIGNMENT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3654) queue_group->iq_ci[AIO_PATH] = next_queue_index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3655) queue_group->iq_ci_bus_addr[AIO_PATH] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3656) ctrl_info->queue_memory_base_dma_handle +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3657) (next_queue_index -
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3658) (void __iomem *)ctrl_info->queue_memory_base);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3659) next_queue_index += sizeof(pqi_index_t);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3660) next_queue_index = PTR_ALIGN(next_queue_index,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3661) PQI_OPERATIONAL_INDEX_ALIGNMENT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3662) queue_group->oq_pi = next_queue_index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3663) queue_group->oq_pi_bus_addr =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3664) ctrl_info->queue_memory_base_dma_handle +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3665) (next_queue_index -
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3666) (void __iomem *)ctrl_info->queue_memory_base);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3667) next_queue_index += sizeof(pqi_index_t);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3668) next_queue_index = PTR_ALIGN(next_queue_index,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3669) PQI_OPERATIONAL_INDEX_ALIGNMENT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3670) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3671)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3672) ctrl_info->event_queue.oq_pi = next_queue_index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3673) ctrl_info->event_queue.oq_pi_bus_addr =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3674) ctrl_info->queue_memory_base_dma_handle +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3675) (next_queue_index -
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3676) (void __iomem *)ctrl_info->queue_memory_base);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3677)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3678) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3679) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3680)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3681) static void pqi_init_operational_queues(struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3682) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3683) unsigned int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3684) u16 next_iq_id = PQI_MIN_OPERATIONAL_QUEUE_ID;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3685) u16 next_oq_id = PQI_MIN_OPERATIONAL_QUEUE_ID;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3686)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3687) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3688) * Initialize the backpointers to the controller structure in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3689) * each operational queue group structure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3690) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3691) for (i = 0; i < ctrl_info->num_queue_groups; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3692) ctrl_info->queue_groups[i].ctrl_info = ctrl_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3693)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3694) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3695) * Assign IDs to all operational queues. Note that the IDs
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3696) * assigned to operational IQs are independent of the IDs
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3697) * assigned to operational OQs.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3698) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3699) ctrl_info->event_queue.oq_id = next_oq_id++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3700) for (i = 0; i < ctrl_info->num_queue_groups; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3701) ctrl_info->queue_groups[i].iq_id[RAID_PATH] = next_iq_id++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3702) ctrl_info->queue_groups[i].iq_id[AIO_PATH] = next_iq_id++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3703) ctrl_info->queue_groups[i].oq_id = next_oq_id++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3704) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3705)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3706) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3707) * Assign MSI-X table entry indexes to all queues. Note that the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3708) * interrupt for the event queue is shared with the first queue group.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3709) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3710) ctrl_info->event_queue.int_msg_num = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3711) for (i = 0; i < ctrl_info->num_queue_groups; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3712) ctrl_info->queue_groups[i].int_msg_num = i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3713)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3714) for (i = 0; i < ctrl_info->num_queue_groups; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3715) spin_lock_init(&ctrl_info->queue_groups[i].submit_lock[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3716) spin_lock_init(&ctrl_info->queue_groups[i].submit_lock[1]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3717) INIT_LIST_HEAD(&ctrl_info->queue_groups[i].request_list[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3718) INIT_LIST_HEAD(&ctrl_info->queue_groups[i].request_list[1]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3719) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3720) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3721)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3722) static int pqi_alloc_admin_queues(struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3723) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3724) size_t alloc_length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3725) struct pqi_admin_queues_aligned *admin_queues_aligned;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3726) struct pqi_admin_queues *admin_queues;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3727)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3728) alloc_length = sizeof(struct pqi_admin_queues_aligned) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3729) PQI_QUEUE_ELEMENT_ARRAY_ALIGNMENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3730)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3731) ctrl_info->admin_queue_memory_base =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3732) dma_alloc_coherent(&ctrl_info->pci_dev->dev, alloc_length,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3733) &ctrl_info->admin_queue_memory_base_dma_handle,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3734) GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3735)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3736) if (!ctrl_info->admin_queue_memory_base)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3737) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3738)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3739) ctrl_info->admin_queue_memory_length = alloc_length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3740)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3741) admin_queues = &ctrl_info->admin_queues;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3742) admin_queues_aligned = PTR_ALIGN(ctrl_info->admin_queue_memory_base,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3743) PQI_QUEUE_ELEMENT_ARRAY_ALIGNMENT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3744) admin_queues->iq_element_array =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3745) &admin_queues_aligned->iq_element_array;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3746) admin_queues->oq_element_array =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3747) &admin_queues_aligned->oq_element_array;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3748) admin_queues->iq_ci = &admin_queues_aligned->iq_ci;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3749) admin_queues->oq_pi =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3750) (pqi_index_t __iomem *)&admin_queues_aligned->oq_pi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3751)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3752) admin_queues->iq_element_array_bus_addr =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3753) ctrl_info->admin_queue_memory_base_dma_handle +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3754) (admin_queues->iq_element_array -
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3755) ctrl_info->admin_queue_memory_base);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3756) admin_queues->oq_element_array_bus_addr =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3757) ctrl_info->admin_queue_memory_base_dma_handle +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3758) (admin_queues->oq_element_array -
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3759) ctrl_info->admin_queue_memory_base);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3760) admin_queues->iq_ci_bus_addr =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3761) ctrl_info->admin_queue_memory_base_dma_handle +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3762) ((void *)admin_queues->iq_ci -
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3763) ctrl_info->admin_queue_memory_base);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3764) admin_queues->oq_pi_bus_addr =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3765) ctrl_info->admin_queue_memory_base_dma_handle +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3766) ((void __iomem *)admin_queues->oq_pi -
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3767) (void __iomem *)ctrl_info->admin_queue_memory_base);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3768)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3769) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3770) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3771)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3772) #define PQI_ADMIN_QUEUE_CREATE_TIMEOUT_JIFFIES PQI_HZ
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3773) #define PQI_ADMIN_QUEUE_CREATE_POLL_INTERVAL_MSECS 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3774)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3775) static int pqi_create_admin_queues(struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3776) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3777) struct pqi_device_registers __iomem *pqi_registers;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3778) struct pqi_admin_queues *admin_queues;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3779) unsigned long timeout;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3780) u8 status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3781) u32 reg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3782)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3783) pqi_registers = ctrl_info->pqi_registers;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3784) admin_queues = &ctrl_info->admin_queues;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3785)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3786) writeq((u64)admin_queues->iq_element_array_bus_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3787) &pqi_registers->admin_iq_element_array_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3788) writeq((u64)admin_queues->oq_element_array_bus_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3789) &pqi_registers->admin_oq_element_array_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3790) writeq((u64)admin_queues->iq_ci_bus_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3791) &pqi_registers->admin_iq_ci_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3792) writeq((u64)admin_queues->oq_pi_bus_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3793) &pqi_registers->admin_oq_pi_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3794)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3795) reg = PQI_ADMIN_IQ_NUM_ELEMENTS |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3796) (PQI_ADMIN_OQ_NUM_ELEMENTS << 8) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3797) (admin_queues->int_msg_num << 16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3798) writel(reg, &pqi_registers->admin_iq_num_elements);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3799) writel(PQI_CREATE_ADMIN_QUEUE_PAIR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3800) &pqi_registers->function_and_status_code);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3801)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3802) timeout = PQI_ADMIN_QUEUE_CREATE_TIMEOUT_JIFFIES + jiffies;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3803) while (1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3804) status = readb(&pqi_registers->function_and_status_code);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3805) if (status == PQI_STATUS_IDLE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3806) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3807) if (time_after(jiffies, timeout))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3808) return -ETIMEDOUT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3809) msleep(PQI_ADMIN_QUEUE_CREATE_POLL_INTERVAL_MSECS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3810) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3811)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3812) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3813) * The offset registers are not initialized to the correct
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3814) * offsets until *after* the create admin queue pair command
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3815) * completes successfully.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3816) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3817) admin_queues->iq_pi = ctrl_info->iomem_base +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3818) PQI_DEVICE_REGISTERS_OFFSET +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3819) readq(&pqi_registers->admin_iq_pi_offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3820) admin_queues->oq_ci = ctrl_info->iomem_base +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3821) PQI_DEVICE_REGISTERS_OFFSET +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3822) readq(&pqi_registers->admin_oq_ci_offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3823)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3824) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3825) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3826)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3827) static void pqi_submit_admin_request(struct pqi_ctrl_info *ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3828) struct pqi_general_admin_request *request)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3829) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3830) struct pqi_admin_queues *admin_queues;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3831) void *next_element;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3832) pqi_index_t iq_pi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3833)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3834) admin_queues = &ctrl_info->admin_queues;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3835) iq_pi = admin_queues->iq_pi_copy;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3836)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3837) next_element = admin_queues->iq_element_array +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3838) (iq_pi * PQI_ADMIN_IQ_ELEMENT_LENGTH);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3839)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3840) memcpy(next_element, request, sizeof(*request));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3841)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3842) iq_pi = (iq_pi + 1) % PQI_ADMIN_IQ_NUM_ELEMENTS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3843) admin_queues->iq_pi_copy = iq_pi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3844)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3845) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3846) * This write notifies the controller that an IU is available to be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3847) * processed.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3848) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3849) writel(iq_pi, admin_queues->iq_pi);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3850) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3851)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3852) #define PQI_ADMIN_REQUEST_TIMEOUT_SECS 60
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3853)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3854) static int pqi_poll_for_admin_response(struct pqi_ctrl_info *ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3855) struct pqi_general_admin_response *response)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3856) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3857) struct pqi_admin_queues *admin_queues;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3858) pqi_index_t oq_pi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3859) pqi_index_t oq_ci;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3860) unsigned long timeout;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3861)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3862) admin_queues = &ctrl_info->admin_queues;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3863) oq_ci = admin_queues->oq_ci_copy;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3864)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3865) timeout = (PQI_ADMIN_REQUEST_TIMEOUT_SECS * PQI_HZ) + jiffies;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3866)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3867) while (1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3868) oq_pi = readl(admin_queues->oq_pi);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3869) if (oq_pi != oq_ci)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3870) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3871) if (time_after(jiffies, timeout)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3872) dev_err(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3873) "timed out waiting for admin response\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3874) return -ETIMEDOUT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3875) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3876) if (!sis_is_firmware_running(ctrl_info))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3877) return -ENXIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3878) usleep_range(1000, 2000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3879) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3880)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3881) memcpy(response, admin_queues->oq_element_array +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3882) (oq_ci * PQI_ADMIN_OQ_ELEMENT_LENGTH), sizeof(*response));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3883)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3884) oq_ci = (oq_ci + 1) % PQI_ADMIN_OQ_NUM_ELEMENTS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3885) admin_queues->oq_ci_copy = oq_ci;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3886) writel(oq_ci, admin_queues->oq_ci);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3887)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3888) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3889) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3890)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3891) static void pqi_start_io(struct pqi_ctrl_info *ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3892) struct pqi_queue_group *queue_group, enum pqi_io_path path,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3893) struct pqi_io_request *io_request)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3894) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3895) struct pqi_io_request *next;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3896) void *next_element;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3897) pqi_index_t iq_pi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3898) pqi_index_t iq_ci;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3899) size_t iu_length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3900) unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3901) unsigned int num_elements_needed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3902) unsigned int num_elements_to_end_of_queue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3903) size_t copy_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3904) struct pqi_iu_header *request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3905)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3906) spin_lock_irqsave(&queue_group->submit_lock[path], flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3907)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3908) if (io_request) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3909) io_request->queue_group = queue_group;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3910) list_add_tail(&io_request->request_list_entry,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3911) &queue_group->request_list[path]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3912) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3913)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3914) iq_pi = queue_group->iq_pi_copy[path];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3915)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3916) list_for_each_entry_safe(io_request, next,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3917) &queue_group->request_list[path], request_list_entry) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3918)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3919) request = io_request->iu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3920)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3921) iu_length = get_unaligned_le16(&request->iu_length) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3922) PQI_REQUEST_HEADER_LENGTH;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3923) num_elements_needed =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3924) DIV_ROUND_UP(iu_length,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3925) PQI_OPERATIONAL_IQ_ELEMENT_LENGTH);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3926)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3927) iq_ci = readl(queue_group->iq_ci[path]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3928)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3929) if (num_elements_needed > pqi_num_elements_free(iq_pi, iq_ci,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3930) ctrl_info->num_elements_per_iq))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3931) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3932)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3933) put_unaligned_le16(queue_group->oq_id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3934) &request->response_queue_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3935)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3936) next_element = queue_group->iq_element_array[path] +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3937) (iq_pi * PQI_OPERATIONAL_IQ_ELEMENT_LENGTH);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3938)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3939) num_elements_to_end_of_queue =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3940) ctrl_info->num_elements_per_iq - iq_pi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3941)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3942) if (num_elements_needed <= num_elements_to_end_of_queue) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3943) memcpy(next_element, request, iu_length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3944) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3945) copy_count = num_elements_to_end_of_queue *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3946) PQI_OPERATIONAL_IQ_ELEMENT_LENGTH;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3947) memcpy(next_element, request, copy_count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3948) memcpy(queue_group->iq_element_array[path],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3949) (u8 *)request + copy_count,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3950) iu_length - copy_count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3951) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3952)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3953) iq_pi = (iq_pi + num_elements_needed) %
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3954) ctrl_info->num_elements_per_iq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3955)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3956) list_del(&io_request->request_list_entry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3957) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3958)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3959) if (iq_pi != queue_group->iq_pi_copy[path]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3960) queue_group->iq_pi_copy[path] = iq_pi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3961) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3962) * This write notifies the controller that one or more IUs are
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3963) * available to be processed.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3964) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3965) writel(iq_pi, queue_group->iq_pi[path]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3966) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3967)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3968) spin_unlock_irqrestore(&queue_group->submit_lock[path], flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3969) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3970)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3971) #define PQI_WAIT_FOR_COMPLETION_IO_TIMEOUT_SECS 10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3972)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3973) static int pqi_wait_for_completion_io(struct pqi_ctrl_info *ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3974) struct completion *wait)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3975) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3976) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3977)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3978) while (1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3979) if (wait_for_completion_io_timeout(wait,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3980) PQI_WAIT_FOR_COMPLETION_IO_TIMEOUT_SECS * PQI_HZ)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3981) rc = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3982) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3983) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3984)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3985) pqi_check_ctrl_health(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3986) if (pqi_ctrl_offline(ctrl_info)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3987) rc = -ENXIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3988) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3989) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3990) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3991)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3992) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3993) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3994)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3995) static void pqi_raid_synchronous_complete(struct pqi_io_request *io_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3996) void *context)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3997) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3998) struct completion *waiting = context;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3999)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4000) complete(waiting);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4001) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4002)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4003) static int pqi_process_raid_io_error_synchronous(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4004) struct pqi_raid_error_info *error_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4005) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4006) int rc = -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4007)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4008) switch (error_info->data_out_result) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4009) case PQI_DATA_IN_OUT_GOOD:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4010) if (error_info->status == SAM_STAT_GOOD)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4011) rc = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4012) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4013) case PQI_DATA_IN_OUT_UNDERFLOW:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4014) if (error_info->status == SAM_STAT_GOOD ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4015) error_info->status == SAM_STAT_CHECK_CONDITION)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4016) rc = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4017) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4018) case PQI_DATA_IN_OUT_ABORTED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4019) rc = PQI_CMD_STATUS_ABORTED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4020) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4021) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4022)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4023) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4024) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4025)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4026) static int pqi_submit_raid_request_synchronous(struct pqi_ctrl_info *ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4027) struct pqi_iu_header *request, unsigned int flags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4028) struct pqi_raid_error_info *error_info, unsigned long timeout_msecs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4029) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4030) int rc = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4031) struct pqi_io_request *io_request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4032) unsigned long start_jiffies;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4033) unsigned long msecs_blocked;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4034) size_t iu_length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4035) DECLARE_COMPLETION_ONSTACK(wait);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4036)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4037) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4038) * Note that specifying PQI_SYNC_FLAGS_INTERRUPTABLE and a timeout value
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4039) * are mutually exclusive.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4040) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4041)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4042) if (flags & PQI_SYNC_FLAGS_INTERRUPTABLE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4043) if (down_interruptible(&ctrl_info->sync_request_sem))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4044) return -ERESTARTSYS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4045) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4046) if (timeout_msecs == NO_TIMEOUT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4047) down(&ctrl_info->sync_request_sem);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4048) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4049) start_jiffies = jiffies;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4050) if (down_timeout(&ctrl_info->sync_request_sem,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4051) msecs_to_jiffies(timeout_msecs)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4052) return -ETIMEDOUT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4053) msecs_blocked =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4054) jiffies_to_msecs(jiffies - start_jiffies);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4055) if (msecs_blocked >= timeout_msecs) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4056) rc = -ETIMEDOUT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4057) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4058) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4059) timeout_msecs -= msecs_blocked;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4060) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4061) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4062)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4063) pqi_ctrl_busy(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4064) timeout_msecs = pqi_wait_if_ctrl_blocked(ctrl_info, timeout_msecs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4065) if (timeout_msecs == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4066) pqi_ctrl_unbusy(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4067) rc = -ETIMEDOUT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4068) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4069) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4070)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4071) if (pqi_ctrl_offline(ctrl_info)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4072) pqi_ctrl_unbusy(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4073) rc = -ENXIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4074) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4075) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4076)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4077) atomic_inc(&ctrl_info->sync_cmds_outstanding);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4078)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4079) io_request = pqi_alloc_io_request(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4080)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4081) put_unaligned_le16(io_request->index,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4082) &(((struct pqi_raid_path_request *)request)->request_id));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4083)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4084) if (request->iu_type == PQI_REQUEST_IU_RAID_PATH_IO)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4085) ((struct pqi_raid_path_request *)request)->error_index =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4086) ((struct pqi_raid_path_request *)request)->request_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4087)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4088) iu_length = get_unaligned_le16(&request->iu_length) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4089) PQI_REQUEST_HEADER_LENGTH;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4090) memcpy(io_request->iu, request, iu_length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4091)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4092) io_request->io_complete_callback = pqi_raid_synchronous_complete;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4093) io_request->context = &wait;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4094)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4095) pqi_start_io(ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4096) &ctrl_info->queue_groups[PQI_DEFAULT_QUEUE_GROUP], RAID_PATH,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4097) io_request);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4098)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4099) pqi_ctrl_unbusy(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4101) if (timeout_msecs == NO_TIMEOUT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4102) pqi_wait_for_completion_io(ctrl_info, &wait);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4103) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4104) if (!wait_for_completion_io_timeout(&wait,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4105) msecs_to_jiffies(timeout_msecs))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4106) dev_warn(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4107) "command timed out\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4108) rc = -ETIMEDOUT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4109) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4110) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4111)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4112) if (error_info) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4113) if (io_request->error_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4114) memcpy(error_info, io_request->error_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4115) sizeof(*error_info));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4116) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4117) memset(error_info, 0, sizeof(*error_info));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4118) } else if (rc == 0 && io_request->error_info) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4119) rc = pqi_process_raid_io_error_synchronous(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4120) io_request->error_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4121) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4122)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4123) pqi_free_io_request(io_request);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4124)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4125) atomic_dec(&ctrl_info->sync_cmds_outstanding);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4126) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4127) up(&ctrl_info->sync_request_sem);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4128)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4129) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4130) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4131)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4132) static int pqi_validate_admin_response(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4133) struct pqi_general_admin_response *response, u8 expected_function_code)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4134) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4135) if (response->header.iu_type != PQI_RESPONSE_IU_GENERAL_ADMIN)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4136) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4137)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4138) if (get_unaligned_le16(&response->header.iu_length) !=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4139) PQI_GENERAL_ADMIN_IU_LENGTH)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4140) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4141)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4142) if (response->function_code != expected_function_code)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4143) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4144)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4145) if (response->status != PQI_GENERAL_ADMIN_STATUS_SUCCESS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4146) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4147)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4148) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4149) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4150)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4151) static int pqi_submit_admin_request_synchronous(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4152) struct pqi_ctrl_info *ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4153) struct pqi_general_admin_request *request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4154) struct pqi_general_admin_response *response)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4155) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4156) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4157)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4158) pqi_submit_admin_request(ctrl_info, request);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4159)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4160) rc = pqi_poll_for_admin_response(ctrl_info, response);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4162) if (rc == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4163) rc = pqi_validate_admin_response(response,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4164) request->function_code);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4165)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4166) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4167) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4168)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4169) static int pqi_report_device_capability(struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4170) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4171) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4172) struct pqi_general_admin_request request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4173) struct pqi_general_admin_response response;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4174) struct pqi_device_capability *capability;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4175) struct pqi_iu_layer_descriptor *sop_iu_layer_descriptor;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4176)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4177) capability = kmalloc(sizeof(*capability), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4178) if (!capability)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4179) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4180)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4181) memset(&request, 0, sizeof(request));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4182)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4183) request.header.iu_type = PQI_REQUEST_IU_GENERAL_ADMIN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4184) put_unaligned_le16(PQI_GENERAL_ADMIN_IU_LENGTH,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4185) &request.header.iu_length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4186) request.function_code =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4187) PQI_GENERAL_ADMIN_FUNCTION_REPORT_DEVICE_CAPABILITY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4188) put_unaligned_le32(sizeof(*capability),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4189) &request.data.report_device_capability.buffer_length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4190)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4191) rc = pqi_map_single(ctrl_info->pci_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4192) &request.data.report_device_capability.sg_descriptor,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4193) capability, sizeof(*capability),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4194) DMA_FROM_DEVICE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4195) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4196) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4197)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4198) rc = pqi_submit_admin_request_synchronous(ctrl_info, &request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4199) &response);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4200)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4201) pqi_pci_unmap(ctrl_info->pci_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4202) &request.data.report_device_capability.sg_descriptor, 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4203) DMA_FROM_DEVICE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4204)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4205) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4206) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4207)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4208) if (response.status != PQI_GENERAL_ADMIN_STATUS_SUCCESS) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4209) rc = -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4210) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4211) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4212)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4213) ctrl_info->max_inbound_queues =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4214) get_unaligned_le16(&capability->max_inbound_queues);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4215) ctrl_info->max_elements_per_iq =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4216) get_unaligned_le16(&capability->max_elements_per_iq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4217) ctrl_info->max_iq_element_length =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4218) get_unaligned_le16(&capability->max_iq_element_length)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4219) * 16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4220) ctrl_info->max_outbound_queues =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4221) get_unaligned_le16(&capability->max_outbound_queues);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4222) ctrl_info->max_elements_per_oq =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4223) get_unaligned_le16(&capability->max_elements_per_oq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4224) ctrl_info->max_oq_element_length =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4225) get_unaligned_le16(&capability->max_oq_element_length)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4226) * 16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4227)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4228) sop_iu_layer_descriptor =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4229) &capability->iu_layer_descriptors[PQI_PROTOCOL_SOP];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4230)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4231) ctrl_info->max_inbound_iu_length_per_firmware =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4232) get_unaligned_le16(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4233) &sop_iu_layer_descriptor->max_inbound_iu_length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4234) ctrl_info->inbound_spanning_supported =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4235) sop_iu_layer_descriptor->inbound_spanning_supported;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4236) ctrl_info->outbound_spanning_supported =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4237) sop_iu_layer_descriptor->outbound_spanning_supported;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4238)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4239) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4240) kfree(capability);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4241)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4242) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4243) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4244)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4245) static int pqi_validate_device_capability(struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4246) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4247) if (ctrl_info->max_iq_element_length <
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4248) PQI_OPERATIONAL_IQ_ELEMENT_LENGTH) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4249) dev_err(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4250) "max. inbound queue element length of %d is less than the required length of %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4251) ctrl_info->max_iq_element_length,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4252) PQI_OPERATIONAL_IQ_ELEMENT_LENGTH);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4253) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4254) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4255)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4256) if (ctrl_info->max_oq_element_length <
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4257) PQI_OPERATIONAL_OQ_ELEMENT_LENGTH) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4258) dev_err(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4259) "max. outbound queue element length of %d is less than the required length of %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4260) ctrl_info->max_oq_element_length,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4261) PQI_OPERATIONAL_OQ_ELEMENT_LENGTH);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4262) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4263) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4264)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4265) if (ctrl_info->max_inbound_iu_length_per_firmware <
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4266) PQI_OPERATIONAL_IQ_ELEMENT_LENGTH) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4267) dev_err(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4268) "max. inbound IU length of %u is less than the min. required length of %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4269) ctrl_info->max_inbound_iu_length_per_firmware,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4270) PQI_OPERATIONAL_IQ_ELEMENT_LENGTH);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4271) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4272) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4273)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4274) if (!ctrl_info->inbound_spanning_supported) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4275) dev_err(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4276) "the controller does not support inbound spanning\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4277) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4278) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4279)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4280) if (ctrl_info->outbound_spanning_supported) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4281) dev_err(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4282) "the controller supports outbound spanning but this driver does not\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4283) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4284) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4285)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4286) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4287) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4288)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4289) static int pqi_create_event_queue(struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4290) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4291) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4292) struct pqi_event_queue *event_queue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4293) struct pqi_general_admin_request request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4294) struct pqi_general_admin_response response;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4295)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4296) event_queue = &ctrl_info->event_queue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4297)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4298) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4299) * Create OQ (Outbound Queue - device to host queue) to dedicate
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4300) * to events.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4301) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4302) memset(&request, 0, sizeof(request));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4303) request.header.iu_type = PQI_REQUEST_IU_GENERAL_ADMIN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4304) put_unaligned_le16(PQI_GENERAL_ADMIN_IU_LENGTH,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4305) &request.header.iu_length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4306) request.function_code = PQI_GENERAL_ADMIN_FUNCTION_CREATE_OQ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4307) put_unaligned_le16(event_queue->oq_id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4308) &request.data.create_operational_oq.queue_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4309) put_unaligned_le64((u64)event_queue->oq_element_array_bus_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4310) &request.data.create_operational_oq.element_array_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4311) put_unaligned_le64((u64)event_queue->oq_pi_bus_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4312) &request.data.create_operational_oq.pi_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4313) put_unaligned_le16(PQI_NUM_EVENT_QUEUE_ELEMENTS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4314) &request.data.create_operational_oq.num_elements);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4315) put_unaligned_le16(PQI_EVENT_OQ_ELEMENT_LENGTH / 16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4316) &request.data.create_operational_oq.element_length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4317) request.data.create_operational_oq.queue_protocol = PQI_PROTOCOL_SOP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4318) put_unaligned_le16(event_queue->int_msg_num,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4319) &request.data.create_operational_oq.int_msg_num);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4320)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4321) rc = pqi_submit_admin_request_synchronous(ctrl_info, &request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4322) &response);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4323) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4324) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4325)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4326) event_queue->oq_ci = ctrl_info->iomem_base +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4327) PQI_DEVICE_REGISTERS_OFFSET +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4328) get_unaligned_le64(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4329) &response.data.create_operational_oq.oq_ci_offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4330)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4331) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4332) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4333)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4334) static int pqi_create_queue_group(struct pqi_ctrl_info *ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4335) unsigned int group_number)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4336) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4337) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4338) struct pqi_queue_group *queue_group;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4339) struct pqi_general_admin_request request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4340) struct pqi_general_admin_response response;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4341)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4342) queue_group = &ctrl_info->queue_groups[group_number];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4343)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4344) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4345) * Create IQ (Inbound Queue - host to device queue) for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4346) * RAID path.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4347) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4348) memset(&request, 0, sizeof(request));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4349) request.header.iu_type = PQI_REQUEST_IU_GENERAL_ADMIN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4350) put_unaligned_le16(PQI_GENERAL_ADMIN_IU_LENGTH,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4351) &request.header.iu_length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4352) request.function_code = PQI_GENERAL_ADMIN_FUNCTION_CREATE_IQ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4353) put_unaligned_le16(queue_group->iq_id[RAID_PATH],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4354) &request.data.create_operational_iq.queue_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4355) put_unaligned_le64(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4356) (u64)queue_group->iq_element_array_bus_addr[RAID_PATH],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4357) &request.data.create_operational_iq.element_array_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4358) put_unaligned_le64((u64)queue_group->iq_ci_bus_addr[RAID_PATH],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4359) &request.data.create_operational_iq.ci_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4360) put_unaligned_le16(ctrl_info->num_elements_per_iq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4361) &request.data.create_operational_iq.num_elements);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4362) put_unaligned_le16(PQI_OPERATIONAL_IQ_ELEMENT_LENGTH / 16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4363) &request.data.create_operational_iq.element_length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4364) request.data.create_operational_iq.queue_protocol = PQI_PROTOCOL_SOP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4365)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4366) rc = pqi_submit_admin_request_synchronous(ctrl_info, &request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4367) &response);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4368) if (rc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4369) dev_err(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4370) "error creating inbound RAID queue\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4371) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4372) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4373)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4374) queue_group->iq_pi[RAID_PATH] = ctrl_info->iomem_base +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4375) PQI_DEVICE_REGISTERS_OFFSET +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4376) get_unaligned_le64(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4377) &response.data.create_operational_iq.iq_pi_offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4378)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4379) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4380) * Create IQ (Inbound Queue - host to device queue) for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4381) * Advanced I/O (AIO) path.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4382) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4383) memset(&request, 0, sizeof(request));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4384) request.header.iu_type = PQI_REQUEST_IU_GENERAL_ADMIN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4385) put_unaligned_le16(PQI_GENERAL_ADMIN_IU_LENGTH,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4386) &request.header.iu_length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4387) request.function_code = PQI_GENERAL_ADMIN_FUNCTION_CREATE_IQ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4388) put_unaligned_le16(queue_group->iq_id[AIO_PATH],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4389) &request.data.create_operational_iq.queue_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4390) put_unaligned_le64((u64)queue_group->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4391) iq_element_array_bus_addr[AIO_PATH],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4392) &request.data.create_operational_iq.element_array_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4393) put_unaligned_le64((u64)queue_group->iq_ci_bus_addr[AIO_PATH],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4394) &request.data.create_operational_iq.ci_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4395) put_unaligned_le16(ctrl_info->num_elements_per_iq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4396) &request.data.create_operational_iq.num_elements);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4397) put_unaligned_le16(PQI_OPERATIONAL_IQ_ELEMENT_LENGTH / 16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4398) &request.data.create_operational_iq.element_length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4399) request.data.create_operational_iq.queue_protocol = PQI_PROTOCOL_SOP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4400)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4401) rc = pqi_submit_admin_request_synchronous(ctrl_info, &request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4402) &response);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4403) if (rc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4404) dev_err(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4405) "error creating inbound AIO queue\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4406) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4407) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4408)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4409) queue_group->iq_pi[AIO_PATH] = ctrl_info->iomem_base +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4410) PQI_DEVICE_REGISTERS_OFFSET +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4411) get_unaligned_le64(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4412) &response.data.create_operational_iq.iq_pi_offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4413)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4414) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4415) * Designate the 2nd IQ as the AIO path. By default, all IQs are
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4416) * assumed to be for RAID path I/O unless we change the queue's
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4417) * property.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4418) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4419) memset(&request, 0, sizeof(request));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4420) request.header.iu_type = PQI_REQUEST_IU_GENERAL_ADMIN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4421) put_unaligned_le16(PQI_GENERAL_ADMIN_IU_LENGTH,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4422) &request.header.iu_length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4423) request.function_code = PQI_GENERAL_ADMIN_FUNCTION_CHANGE_IQ_PROPERTY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4424) put_unaligned_le16(queue_group->iq_id[AIO_PATH],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4425) &request.data.change_operational_iq_properties.queue_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4426) put_unaligned_le32(PQI_IQ_PROPERTY_IS_AIO_QUEUE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4427) &request.data.change_operational_iq_properties.vendor_specific);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4428)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4429) rc = pqi_submit_admin_request_synchronous(ctrl_info, &request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4430) &response);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4431) if (rc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4432) dev_err(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4433) "error changing queue property\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4434) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4435) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4436)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4437) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4438) * Create OQ (Outbound Queue - device to host queue).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4439) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4440) memset(&request, 0, sizeof(request));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4441) request.header.iu_type = PQI_REQUEST_IU_GENERAL_ADMIN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4442) put_unaligned_le16(PQI_GENERAL_ADMIN_IU_LENGTH,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4443) &request.header.iu_length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4444) request.function_code = PQI_GENERAL_ADMIN_FUNCTION_CREATE_OQ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4445) put_unaligned_le16(queue_group->oq_id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4446) &request.data.create_operational_oq.queue_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4447) put_unaligned_le64((u64)queue_group->oq_element_array_bus_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4448) &request.data.create_operational_oq.element_array_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4449) put_unaligned_le64((u64)queue_group->oq_pi_bus_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4450) &request.data.create_operational_oq.pi_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4451) put_unaligned_le16(ctrl_info->num_elements_per_oq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4452) &request.data.create_operational_oq.num_elements);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4453) put_unaligned_le16(PQI_OPERATIONAL_OQ_ELEMENT_LENGTH / 16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4454) &request.data.create_operational_oq.element_length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4455) request.data.create_operational_oq.queue_protocol = PQI_PROTOCOL_SOP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4456) put_unaligned_le16(queue_group->int_msg_num,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4457) &request.data.create_operational_oq.int_msg_num);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4458)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4459) rc = pqi_submit_admin_request_synchronous(ctrl_info, &request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4460) &response);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4461) if (rc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4462) dev_err(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4463) "error creating outbound queue\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4464) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4465) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4466)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4467) queue_group->oq_ci = ctrl_info->iomem_base +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4468) PQI_DEVICE_REGISTERS_OFFSET +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4469) get_unaligned_le64(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4470) &response.data.create_operational_oq.oq_ci_offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4471)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4472) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4473) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4474)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4475) static int pqi_create_queues(struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4476) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4477) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4478) unsigned int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4479)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4480) rc = pqi_create_event_queue(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4481) if (rc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4482) dev_err(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4483) "error creating event queue\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4484) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4485) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4486)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4487) for (i = 0; i < ctrl_info->num_queue_groups; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4488) rc = pqi_create_queue_group(ctrl_info, i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4489) if (rc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4490) dev_err(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4491) "error creating queue group number %u/%u\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4492) i, ctrl_info->num_queue_groups);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4493) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4494) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4495) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4496)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4497) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4498) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4499)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4500) #define PQI_REPORT_EVENT_CONFIG_BUFFER_LENGTH \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4501) (offsetof(struct pqi_event_config, descriptors) + \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4502) (PQI_MAX_EVENT_DESCRIPTORS * sizeof(struct pqi_event_descriptor)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4503)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4504) static int pqi_configure_events(struct pqi_ctrl_info *ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4505) bool enable_events)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4506) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4507) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4508) unsigned int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4509) struct pqi_event_config *event_config;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4510) struct pqi_event_descriptor *event_descriptor;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4511) struct pqi_general_management_request request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4512)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4513) event_config = kmalloc(PQI_REPORT_EVENT_CONFIG_BUFFER_LENGTH,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4514) GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4515) if (!event_config)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4516) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4517)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4518) memset(&request, 0, sizeof(request));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4519)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4520) request.header.iu_type = PQI_REQUEST_IU_REPORT_VENDOR_EVENT_CONFIG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4521) put_unaligned_le16(offsetof(struct pqi_general_management_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4522) data.report_event_configuration.sg_descriptors[1]) -
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4523) PQI_REQUEST_HEADER_LENGTH, &request.header.iu_length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4524) put_unaligned_le32(PQI_REPORT_EVENT_CONFIG_BUFFER_LENGTH,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4525) &request.data.report_event_configuration.buffer_length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4526)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4527) rc = pqi_map_single(ctrl_info->pci_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4528) request.data.report_event_configuration.sg_descriptors,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4529) event_config, PQI_REPORT_EVENT_CONFIG_BUFFER_LENGTH,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4530) DMA_FROM_DEVICE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4531) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4532) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4533)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4534) rc = pqi_submit_raid_request_synchronous(ctrl_info, &request.header,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4535) 0, NULL, NO_TIMEOUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4536)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4537) pqi_pci_unmap(ctrl_info->pci_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4538) request.data.report_event_configuration.sg_descriptors, 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4539) DMA_FROM_DEVICE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4540)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4541) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4542) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4543)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4544) for (i = 0; i < event_config->num_event_descriptors; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4545) event_descriptor = &event_config->descriptors[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4546) if (enable_events &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4547) pqi_is_supported_event(event_descriptor->event_type))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4548) put_unaligned_le16(ctrl_info->event_queue.oq_id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4549) &event_descriptor->oq_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4550) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4551) put_unaligned_le16(0, &event_descriptor->oq_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4552) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4553)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4554) memset(&request, 0, sizeof(request));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4555)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4556) request.header.iu_type = PQI_REQUEST_IU_SET_VENDOR_EVENT_CONFIG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4557) put_unaligned_le16(offsetof(struct pqi_general_management_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4558) data.report_event_configuration.sg_descriptors[1]) -
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4559) PQI_REQUEST_HEADER_LENGTH, &request.header.iu_length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4560) put_unaligned_le32(PQI_REPORT_EVENT_CONFIG_BUFFER_LENGTH,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4561) &request.data.report_event_configuration.buffer_length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4562)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4563) rc = pqi_map_single(ctrl_info->pci_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4564) request.data.report_event_configuration.sg_descriptors,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4565) event_config, PQI_REPORT_EVENT_CONFIG_BUFFER_LENGTH,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4566) DMA_TO_DEVICE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4567) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4568) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4569)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4570) rc = pqi_submit_raid_request_synchronous(ctrl_info, &request.header, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4571) NULL, NO_TIMEOUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4572)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4573) pqi_pci_unmap(ctrl_info->pci_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4574) request.data.report_event_configuration.sg_descriptors, 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4575) DMA_TO_DEVICE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4576)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4577) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4578) kfree(event_config);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4579)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4580) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4581) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4582)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4583) static inline int pqi_enable_events(struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4584) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4585) return pqi_configure_events(ctrl_info, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4586) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4587)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4588) static inline int pqi_disable_events(struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4589) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4590) return pqi_configure_events(ctrl_info, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4591) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4592)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4593) static void pqi_free_all_io_requests(struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4594) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4595) unsigned int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4596) struct device *dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4597) size_t sg_chain_buffer_length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4598) struct pqi_io_request *io_request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4599)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4600) if (!ctrl_info->io_request_pool)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4601) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4602)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4603) dev = &ctrl_info->pci_dev->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4604) sg_chain_buffer_length = ctrl_info->sg_chain_buffer_length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4605) io_request = ctrl_info->io_request_pool;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4606)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4607) for (i = 0; i < ctrl_info->max_io_slots; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4608) kfree(io_request->iu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4609) if (!io_request->sg_chain_buffer)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4610) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4611) dma_free_coherent(dev, sg_chain_buffer_length,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4612) io_request->sg_chain_buffer,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4613) io_request->sg_chain_buffer_dma_handle);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4614) io_request++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4615) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4616)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4617) kfree(ctrl_info->io_request_pool);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4618) ctrl_info->io_request_pool = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4619) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4620)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4621) static inline int pqi_alloc_error_buffer(struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4622) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4623)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4624) ctrl_info->error_buffer = dma_alloc_coherent(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4625) ctrl_info->error_buffer_length,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4626) &ctrl_info->error_buffer_dma_handle,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4627) GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4628) if (!ctrl_info->error_buffer)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4629) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4630)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4631) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4632) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4633)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4634) static int pqi_alloc_io_resources(struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4635) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4636) unsigned int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4637) void *sg_chain_buffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4638) size_t sg_chain_buffer_length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4639) dma_addr_t sg_chain_buffer_dma_handle;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4640) struct device *dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4641) struct pqi_io_request *io_request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4642)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4643) ctrl_info->io_request_pool =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4644) kcalloc(ctrl_info->max_io_slots,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4645) sizeof(ctrl_info->io_request_pool[0]), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4646)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4647) if (!ctrl_info->io_request_pool) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4648) dev_err(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4649) "failed to allocate I/O request pool\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4650) goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4651) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4652)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4653) dev = &ctrl_info->pci_dev->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4654) sg_chain_buffer_length = ctrl_info->sg_chain_buffer_length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4655) io_request = ctrl_info->io_request_pool;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4656)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4657) for (i = 0; i < ctrl_info->max_io_slots; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4658) io_request->iu =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4659) kmalloc(ctrl_info->max_inbound_iu_length, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4660)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4661) if (!io_request->iu) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4662) dev_err(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4663) "failed to allocate IU buffers\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4664) goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4665) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4666)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4667) sg_chain_buffer = dma_alloc_coherent(dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4668) sg_chain_buffer_length, &sg_chain_buffer_dma_handle,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4669) GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4670)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4671) if (!sg_chain_buffer) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4672) dev_err(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4673) "failed to allocate PQI scatter-gather chain buffers\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4674) goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4675) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4676)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4677) io_request->index = i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4678) io_request->sg_chain_buffer = sg_chain_buffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4679) io_request->sg_chain_buffer_dma_handle =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4680) sg_chain_buffer_dma_handle;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4681) io_request++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4682) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4683)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4684) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4685)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4686) error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4687) pqi_free_all_io_requests(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4688)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4689) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4690) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4691)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4692) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4693) * Calculate required resources that are sized based on max. outstanding
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4694) * requests and max. transfer size.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4695) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4696)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4697) static void pqi_calculate_io_resources(struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4698) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4699) u32 max_transfer_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4700) u32 max_sg_entries;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4701)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4702) ctrl_info->scsi_ml_can_queue =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4703) ctrl_info->max_outstanding_requests - PQI_RESERVED_IO_SLOTS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4704) ctrl_info->max_io_slots = ctrl_info->max_outstanding_requests;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4705)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4706) ctrl_info->error_buffer_length =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4707) ctrl_info->max_io_slots * PQI_ERROR_BUFFER_ELEMENT_LENGTH;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4708)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4709) if (reset_devices)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4710) max_transfer_size = min(ctrl_info->max_transfer_size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4711) PQI_MAX_TRANSFER_SIZE_KDUMP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4712) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4713) max_transfer_size = min(ctrl_info->max_transfer_size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4714) PQI_MAX_TRANSFER_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4715)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4716) max_sg_entries = max_transfer_size / PAGE_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4717)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4718) /* +1 to cover when the buffer is not page-aligned. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4719) max_sg_entries++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4720)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4721) max_sg_entries = min(ctrl_info->max_sg_entries, max_sg_entries);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4722)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4723) max_transfer_size = (max_sg_entries - 1) * PAGE_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4724)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4725) ctrl_info->sg_chain_buffer_length =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4726) (max_sg_entries * sizeof(struct pqi_sg_descriptor)) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4727) PQI_EXTRA_SGL_MEMORY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4728) ctrl_info->sg_tablesize = max_sg_entries;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4729) ctrl_info->max_sectors = max_transfer_size / 512;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4730) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4731)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4732) static void pqi_calculate_queue_resources(struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4733) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4734) int num_queue_groups;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4735) u16 num_elements_per_iq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4736) u16 num_elements_per_oq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4737)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4738) if (reset_devices) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4739) num_queue_groups = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4740) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4741) int num_cpus;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4742) int max_queue_groups;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4743)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4744) max_queue_groups = min(ctrl_info->max_inbound_queues / 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4745) ctrl_info->max_outbound_queues - 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4746) max_queue_groups = min(max_queue_groups, PQI_MAX_QUEUE_GROUPS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4747)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4748) num_cpus = num_online_cpus();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4749) num_queue_groups = min(num_cpus, ctrl_info->max_msix_vectors);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4750) num_queue_groups = min(num_queue_groups, max_queue_groups);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4751) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4752)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4753) ctrl_info->num_queue_groups = num_queue_groups;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4754) ctrl_info->max_hw_queue_index = num_queue_groups - 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4755)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4756) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4757) * Make sure that the max. inbound IU length is an even multiple
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4758) * of our inbound element length.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4759) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4760) ctrl_info->max_inbound_iu_length =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4761) (ctrl_info->max_inbound_iu_length_per_firmware /
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4762) PQI_OPERATIONAL_IQ_ELEMENT_LENGTH) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4763) PQI_OPERATIONAL_IQ_ELEMENT_LENGTH;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4764)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4765) num_elements_per_iq =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4766) (ctrl_info->max_inbound_iu_length /
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4767) PQI_OPERATIONAL_IQ_ELEMENT_LENGTH);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4768)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4769) /* Add one because one element in each queue is unusable. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4770) num_elements_per_iq++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4771)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4772) num_elements_per_iq = min(num_elements_per_iq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4773) ctrl_info->max_elements_per_iq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4774)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4775) num_elements_per_oq = ((num_elements_per_iq - 1) * 2) + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4776) num_elements_per_oq = min(num_elements_per_oq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4777) ctrl_info->max_elements_per_oq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4778)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4779) ctrl_info->num_elements_per_iq = num_elements_per_iq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4780) ctrl_info->num_elements_per_oq = num_elements_per_oq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4781)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4782) ctrl_info->max_sg_per_iu =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4783) ((ctrl_info->max_inbound_iu_length -
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4784) PQI_OPERATIONAL_IQ_ELEMENT_LENGTH) /
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4785) sizeof(struct pqi_sg_descriptor)) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4786) PQI_MAX_EMBEDDED_SG_DESCRIPTORS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4787) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4788)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4789) static inline void pqi_set_sg_descriptor(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4790) struct pqi_sg_descriptor *sg_descriptor, struct scatterlist *sg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4791) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4792) u64 address = (u64)sg_dma_address(sg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4793) unsigned int length = sg_dma_len(sg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4794)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4795) put_unaligned_le64(address, &sg_descriptor->address);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4796) put_unaligned_le32(length, &sg_descriptor->length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4797) put_unaligned_le32(0, &sg_descriptor->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4798) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4799)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4800) static int pqi_build_raid_sg_list(struct pqi_ctrl_info *ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4801) struct pqi_raid_path_request *request, struct scsi_cmnd *scmd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4802) struct pqi_io_request *io_request)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4803) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4804) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4805) u16 iu_length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4806) int sg_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4807) bool chained;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4808) unsigned int num_sg_in_iu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4809) unsigned int max_sg_per_iu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4810) struct scatterlist *sg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4811) struct pqi_sg_descriptor *sg_descriptor;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4812)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4813) sg_count = scsi_dma_map(scmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4814) if (sg_count < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4815) return sg_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4816)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4817) iu_length = offsetof(struct pqi_raid_path_request, sg_descriptors) -
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4818) PQI_REQUEST_HEADER_LENGTH;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4819)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4820) if (sg_count == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4821) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4822)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4823) sg = scsi_sglist(scmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4824) sg_descriptor = request->sg_descriptors;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4825) max_sg_per_iu = ctrl_info->max_sg_per_iu - 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4826) chained = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4827) num_sg_in_iu = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4828) i = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4829)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4830) while (1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4831) pqi_set_sg_descriptor(sg_descriptor, sg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4832) if (!chained)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4833) num_sg_in_iu++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4834) i++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4835) if (i == sg_count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4836) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4837) sg_descriptor++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4838) if (i == max_sg_per_iu) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4839) put_unaligned_le64(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4840) (u64)io_request->sg_chain_buffer_dma_handle,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4841) &sg_descriptor->address);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4842) put_unaligned_le32((sg_count - num_sg_in_iu)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4843) * sizeof(*sg_descriptor),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4844) &sg_descriptor->length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4845) put_unaligned_le32(CISS_SG_CHAIN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4846) &sg_descriptor->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4847) chained = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4848) num_sg_in_iu++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4849) sg_descriptor = io_request->sg_chain_buffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4850) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4851) sg = sg_next(sg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4852) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4853)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4854) put_unaligned_le32(CISS_SG_LAST, &sg_descriptor->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4855) request->partial = chained;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4856) iu_length += num_sg_in_iu * sizeof(*sg_descriptor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4857)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4858) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4859) put_unaligned_le16(iu_length, &request->header.iu_length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4860)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4861) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4862) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4863)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4864) static int pqi_build_aio_sg_list(struct pqi_ctrl_info *ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4865) struct pqi_aio_path_request *request, struct scsi_cmnd *scmd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4866) struct pqi_io_request *io_request)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4867) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4868) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4869) u16 iu_length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4870) int sg_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4871) bool chained;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4872) unsigned int num_sg_in_iu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4873) unsigned int max_sg_per_iu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4874) struct scatterlist *sg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4875) struct pqi_sg_descriptor *sg_descriptor;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4876)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4877) sg_count = scsi_dma_map(scmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4878) if (sg_count < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4879) return sg_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4880)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4881) iu_length = offsetof(struct pqi_aio_path_request, sg_descriptors) -
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4882) PQI_REQUEST_HEADER_LENGTH;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4883) num_sg_in_iu = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4884)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4885) if (sg_count == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4886) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4887)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4888) sg = scsi_sglist(scmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4889) sg_descriptor = request->sg_descriptors;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4890) max_sg_per_iu = ctrl_info->max_sg_per_iu - 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4891) chained = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4892) i = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4893)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4894) while (1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4895) pqi_set_sg_descriptor(sg_descriptor, sg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4896) if (!chained)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4897) num_sg_in_iu++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4898) i++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4899) if (i == sg_count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4900) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4901) sg_descriptor++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4902) if (i == max_sg_per_iu) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4903) put_unaligned_le64(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4904) (u64)io_request->sg_chain_buffer_dma_handle,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4905) &sg_descriptor->address);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4906) put_unaligned_le32((sg_count - num_sg_in_iu)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4907) * sizeof(*sg_descriptor),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4908) &sg_descriptor->length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4909) put_unaligned_le32(CISS_SG_CHAIN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4910) &sg_descriptor->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4911) chained = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4912) num_sg_in_iu++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4913) sg_descriptor = io_request->sg_chain_buffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4914) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4915) sg = sg_next(sg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4916) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4917)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4918) put_unaligned_le32(CISS_SG_LAST, &sg_descriptor->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4919) request->partial = chained;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4920) iu_length += num_sg_in_iu * sizeof(*sg_descriptor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4921)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4922) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4923) put_unaligned_le16(iu_length, &request->header.iu_length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4924) request->num_sg_descriptors = num_sg_in_iu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4925)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4926) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4927) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4928)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4929) static void pqi_raid_io_complete(struct pqi_io_request *io_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4930) void *context)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4931) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4932) struct scsi_cmnd *scmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4933)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4934) scmd = io_request->scmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4935) pqi_free_io_request(io_request);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4936) scsi_dma_unmap(scmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4937) pqi_scsi_done(scmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4938) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4939)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4940) static int pqi_raid_submit_scsi_cmd_with_io_request(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4941) struct pqi_ctrl_info *ctrl_info, struct pqi_io_request *io_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4942) struct pqi_scsi_dev *device, struct scsi_cmnd *scmd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4943) struct pqi_queue_group *queue_group)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4944) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4945) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4946) size_t cdb_length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4947) struct pqi_raid_path_request *request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4948)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4949) io_request->io_complete_callback = pqi_raid_io_complete;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4950) io_request->scmd = scmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4951)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4952) request = io_request->iu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4953) memset(request, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4954) offsetof(struct pqi_raid_path_request, sg_descriptors));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4955)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4956) request->header.iu_type = PQI_REQUEST_IU_RAID_PATH_IO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4957) put_unaligned_le32(scsi_bufflen(scmd), &request->buffer_length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4958) request->task_attribute = SOP_TASK_ATTRIBUTE_SIMPLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4959) put_unaligned_le16(io_request->index, &request->request_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4960) request->error_index = request->request_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4961) memcpy(request->lun_number, device->scsi3addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4962) sizeof(request->lun_number));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4963)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4964) cdb_length = min_t(size_t, scmd->cmd_len, sizeof(request->cdb));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4965) memcpy(request->cdb, scmd->cmnd, cdb_length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4966)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4967) switch (cdb_length) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4968) case 6:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4969) case 10:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4970) case 12:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4971) case 16:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4972) /* No bytes in the Additional CDB bytes field */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4973) request->additional_cdb_bytes_usage =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4974) SOP_ADDITIONAL_CDB_BYTES_0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4975) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4976) case 20:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4977) /* 4 bytes in the Additional cdb field */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4978) request->additional_cdb_bytes_usage =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4979) SOP_ADDITIONAL_CDB_BYTES_4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4980) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4981) case 24:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4982) /* 8 bytes in the Additional cdb field */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4983) request->additional_cdb_bytes_usage =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4984) SOP_ADDITIONAL_CDB_BYTES_8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4985) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4986) case 28:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4987) /* 12 bytes in the Additional cdb field */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4988) request->additional_cdb_bytes_usage =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4989) SOP_ADDITIONAL_CDB_BYTES_12;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4990) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4991) case 32:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4992) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4993) /* 16 bytes in the Additional cdb field */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4994) request->additional_cdb_bytes_usage =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4995) SOP_ADDITIONAL_CDB_BYTES_16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4996) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4997) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4998)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4999) switch (scmd->sc_data_direction) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5000) case DMA_TO_DEVICE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5001) request->data_direction = SOP_READ_FLAG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5002) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5003) case DMA_FROM_DEVICE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5004) request->data_direction = SOP_WRITE_FLAG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5005) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5006) case DMA_NONE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5007) request->data_direction = SOP_NO_DIRECTION_FLAG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5008) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5009) case DMA_BIDIRECTIONAL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5010) request->data_direction = SOP_BIDIRECTIONAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5011) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5012) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5013) dev_err(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5014) "unknown data direction: %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5015) scmd->sc_data_direction);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5016) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5017) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5018)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5019) rc = pqi_build_raid_sg_list(ctrl_info, request, scmd, io_request);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5020) if (rc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5021) pqi_free_io_request(io_request);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5022) return SCSI_MLQUEUE_HOST_BUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5023) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5024)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5025) pqi_start_io(ctrl_info, queue_group, RAID_PATH, io_request);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5026)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5027) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5028) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5029)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5030) static inline int pqi_raid_submit_scsi_cmd(struct pqi_ctrl_info *ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5031) struct pqi_scsi_dev *device, struct scsi_cmnd *scmd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5032) struct pqi_queue_group *queue_group)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5033) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5034) struct pqi_io_request *io_request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5035)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5036) io_request = pqi_alloc_io_request(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5037)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5038) return pqi_raid_submit_scsi_cmd_with_io_request(ctrl_info, io_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5039) device, scmd, queue_group);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5040) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5041)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5042) static inline void pqi_schedule_bypass_retry(struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5043) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5044) if (!pqi_ctrl_blocked(ctrl_info))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5045) schedule_work(&ctrl_info->raid_bypass_retry_work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5046) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5047)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5048) static bool pqi_raid_bypass_retry_needed(struct pqi_io_request *io_request)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5049) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5050) struct scsi_cmnd *scmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5051) struct pqi_scsi_dev *device;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5052) struct pqi_ctrl_info *ctrl_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5053)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5054) if (!io_request->raid_bypass)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5055) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5056)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5057) scmd = io_request->scmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5058) if ((scmd->result & 0xff) == SAM_STAT_GOOD)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5059) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5060) if (host_byte(scmd->result) == DID_NO_CONNECT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5061) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5062)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5063) device = scmd->device->hostdata;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5064) if (pqi_device_offline(device))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5065) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5066)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5067) ctrl_info = shost_to_hba(scmd->device->host);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5068) if (pqi_ctrl_offline(ctrl_info))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5069) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5070)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5071) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5072) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5073)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5074) static inline void pqi_add_to_raid_bypass_retry_list(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5075) struct pqi_ctrl_info *ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5076) struct pqi_io_request *io_request, bool at_head)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5077) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5078) unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5079)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5080) spin_lock_irqsave(&ctrl_info->raid_bypass_retry_list_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5081) if (at_head)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5082) list_add(&io_request->request_list_entry,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5083) &ctrl_info->raid_bypass_retry_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5084) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5085) list_add_tail(&io_request->request_list_entry,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5086) &ctrl_info->raid_bypass_retry_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5087) spin_unlock_irqrestore(&ctrl_info->raid_bypass_retry_list_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5088) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5089)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5090) static void pqi_queued_raid_bypass_complete(struct pqi_io_request *io_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5091) void *context)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5092) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5093) struct scsi_cmnd *scmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5094)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5095) scmd = io_request->scmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5096) pqi_free_io_request(io_request);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5097) pqi_scsi_done(scmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5098) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5099)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5100) static void pqi_queue_raid_bypass_retry(struct pqi_io_request *io_request)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5101) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5102) struct scsi_cmnd *scmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5103) struct pqi_ctrl_info *ctrl_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5104)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5105) io_request->io_complete_callback = pqi_queued_raid_bypass_complete;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5106) scmd = io_request->scmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5107) scmd->result = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5108) ctrl_info = shost_to_hba(scmd->device->host);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5109)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5110) pqi_add_to_raid_bypass_retry_list(ctrl_info, io_request, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5111) pqi_schedule_bypass_retry(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5112) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5113)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5114) static int pqi_retry_raid_bypass(struct pqi_io_request *io_request)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5115) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5116) struct scsi_cmnd *scmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5117) struct pqi_scsi_dev *device;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5118) struct pqi_ctrl_info *ctrl_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5119) struct pqi_queue_group *queue_group;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5120)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5121) scmd = io_request->scmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5122) device = scmd->device->hostdata;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5123) if (pqi_device_in_reset(device)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5124) pqi_free_io_request(io_request);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5125) set_host_byte(scmd, DID_RESET);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5126) pqi_scsi_done(scmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5127) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5128) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5129)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5130) ctrl_info = shost_to_hba(scmd->device->host);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5131) queue_group = io_request->queue_group;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5132)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5133) pqi_reinit_io_request(io_request);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5134)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5135) return pqi_raid_submit_scsi_cmd_with_io_request(ctrl_info, io_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5136) device, scmd, queue_group);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5137) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5138)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5139) static inline struct pqi_io_request *pqi_next_queued_raid_bypass_request(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5140) struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5141) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5142) unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5143) struct pqi_io_request *io_request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5144)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5145) spin_lock_irqsave(&ctrl_info->raid_bypass_retry_list_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5146) io_request = list_first_entry_or_null(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5147) &ctrl_info->raid_bypass_retry_list,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5148) struct pqi_io_request, request_list_entry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5149) if (io_request)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5150) list_del(&io_request->request_list_entry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5151) spin_unlock_irqrestore(&ctrl_info->raid_bypass_retry_list_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5152)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5153) return io_request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5154) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5155)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5156) static void pqi_retry_raid_bypass_requests(struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5157) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5158) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5159) struct pqi_io_request *io_request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5160)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5161) pqi_ctrl_busy(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5162)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5163) while (1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5164) if (pqi_ctrl_blocked(ctrl_info))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5165) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5166) io_request = pqi_next_queued_raid_bypass_request(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5167) if (!io_request)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5168) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5169) rc = pqi_retry_raid_bypass(io_request);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5170) if (rc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5171) pqi_add_to_raid_bypass_retry_list(ctrl_info, io_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5172) true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5173) pqi_schedule_bypass_retry(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5174) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5175) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5176) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5177)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5178) pqi_ctrl_unbusy(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5179) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5180)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5181) static void pqi_raid_bypass_retry_worker(struct work_struct *work)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5182) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5183) struct pqi_ctrl_info *ctrl_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5184)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5185) ctrl_info = container_of(work, struct pqi_ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5186) raid_bypass_retry_work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5187) pqi_retry_raid_bypass_requests(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5188) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5189)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5190) static void pqi_clear_all_queued_raid_bypass_retries(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5191) struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5192) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5193) unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5194)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5195) spin_lock_irqsave(&ctrl_info->raid_bypass_retry_list_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5196) INIT_LIST_HEAD(&ctrl_info->raid_bypass_retry_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5197) spin_unlock_irqrestore(&ctrl_info->raid_bypass_retry_list_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5198) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5199)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5200) static void pqi_aio_io_complete(struct pqi_io_request *io_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5201) void *context)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5202) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5203) struct scsi_cmnd *scmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5204)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5205) scmd = io_request->scmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5206) scsi_dma_unmap(scmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5207) if (io_request->status == -EAGAIN)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5208) set_host_byte(scmd, DID_IMM_RETRY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5209) else if (pqi_raid_bypass_retry_needed(io_request)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5210) pqi_queue_raid_bypass_retry(io_request);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5211) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5212) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5213) pqi_free_io_request(io_request);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5214) pqi_scsi_done(scmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5215) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5216)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5217) static inline int pqi_aio_submit_scsi_cmd(struct pqi_ctrl_info *ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5218) struct pqi_scsi_dev *device, struct scsi_cmnd *scmd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5219) struct pqi_queue_group *queue_group)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5220) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5221) return pqi_aio_submit_io(ctrl_info, scmd, device->aio_handle,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5222) scmd->cmnd, scmd->cmd_len, queue_group, NULL, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5223) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5224)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5225) static int pqi_aio_submit_io(struct pqi_ctrl_info *ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5226) struct scsi_cmnd *scmd, u32 aio_handle, u8 *cdb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5227) unsigned int cdb_length, struct pqi_queue_group *queue_group,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5228) struct pqi_encryption_info *encryption_info, bool raid_bypass)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5229) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5230) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5231) struct pqi_io_request *io_request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5232) struct pqi_aio_path_request *request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5233)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5234) io_request = pqi_alloc_io_request(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5235) io_request->io_complete_callback = pqi_aio_io_complete;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5236) io_request->scmd = scmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5237) io_request->raid_bypass = raid_bypass;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5238)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5239) request = io_request->iu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5240) memset(request, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5241) offsetof(struct pqi_raid_path_request, sg_descriptors));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5242)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5243) request->header.iu_type = PQI_REQUEST_IU_AIO_PATH_IO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5244) put_unaligned_le32(aio_handle, &request->nexus_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5245) put_unaligned_le32(scsi_bufflen(scmd), &request->buffer_length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5246) request->task_attribute = SOP_TASK_ATTRIBUTE_SIMPLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5247) put_unaligned_le16(io_request->index, &request->request_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5248) request->error_index = request->request_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5249) if (cdb_length > sizeof(request->cdb))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5250) cdb_length = sizeof(request->cdb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5251) request->cdb_length = cdb_length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5252) memcpy(request->cdb, cdb, cdb_length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5253)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5254) switch (scmd->sc_data_direction) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5255) case DMA_TO_DEVICE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5256) request->data_direction = SOP_READ_FLAG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5257) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5258) case DMA_FROM_DEVICE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5259) request->data_direction = SOP_WRITE_FLAG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5260) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5261) case DMA_NONE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5262) request->data_direction = SOP_NO_DIRECTION_FLAG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5263) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5264) case DMA_BIDIRECTIONAL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5265) request->data_direction = SOP_BIDIRECTIONAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5266) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5267) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5268) dev_err(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5269) "unknown data direction: %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5270) scmd->sc_data_direction);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5271) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5272) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5273)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5274) if (encryption_info) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5275) request->encryption_enable = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5276) put_unaligned_le16(encryption_info->data_encryption_key_index,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5277) &request->data_encryption_key_index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5278) put_unaligned_le32(encryption_info->encrypt_tweak_lower,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5279) &request->encrypt_tweak_lower);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5280) put_unaligned_le32(encryption_info->encrypt_tweak_upper,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5281) &request->encrypt_tweak_upper);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5282) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5283)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5284) rc = pqi_build_aio_sg_list(ctrl_info, request, scmd, io_request);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5285) if (rc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5286) pqi_free_io_request(io_request);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5287) return SCSI_MLQUEUE_HOST_BUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5288) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5289)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5290) pqi_start_io(ctrl_info, queue_group, AIO_PATH, io_request);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5291)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5292) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5293) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5294)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5295) static inline u16 pqi_get_hw_queue(struct pqi_ctrl_info *ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5296) struct scsi_cmnd *scmd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5297) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5298) u16 hw_queue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5299)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5300) hw_queue = blk_mq_unique_tag_to_hwq(blk_mq_unique_tag(scmd->request));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5301) if (hw_queue > ctrl_info->max_hw_queue_index)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5302) hw_queue = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5303)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5304) return hw_queue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5305) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5306)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5307) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5308) * This function gets called just before we hand the completed SCSI request
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5309) * back to the SML.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5310) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5311)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5312) void pqi_prep_for_scsi_done(struct scsi_cmnd *scmd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5313) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5314) struct pqi_scsi_dev *device;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5315)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5316) if (!scmd->device) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5317) set_host_byte(scmd, DID_NO_CONNECT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5318) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5319) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5320)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5321) device = scmd->device->hostdata;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5322) if (!device) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5323) set_host_byte(scmd, DID_NO_CONNECT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5324) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5325) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5326)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5327) atomic_dec(&device->scsi_cmds_outstanding);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5328) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5329)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5330) static int pqi_scsi_queue_command(struct Scsi_Host *shost,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5331) struct scsi_cmnd *scmd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5332) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5333) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5334) struct pqi_ctrl_info *ctrl_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5335) struct pqi_scsi_dev *device;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5336) u16 hw_queue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5337) struct pqi_queue_group *queue_group;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5338) bool raid_bypassed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5339)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5340) device = scmd->device->hostdata;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5341) ctrl_info = shost_to_hba(shost);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5342)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5343) if (!device) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5344) set_host_byte(scmd, DID_NO_CONNECT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5345) pqi_scsi_done(scmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5346) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5347) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5348)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5349) atomic_inc(&device->scsi_cmds_outstanding);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5350)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5351) if (pqi_ctrl_offline(ctrl_info) || pqi_device_in_remove(ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5352) device)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5353) set_host_byte(scmd, DID_NO_CONNECT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5354) pqi_scsi_done(scmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5355) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5356) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5357)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5358) pqi_ctrl_busy(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5359) if (pqi_ctrl_blocked(ctrl_info) || pqi_device_in_reset(device) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5360) pqi_ctrl_in_ofa(ctrl_info) || pqi_ctrl_in_shutdown(ctrl_info)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5361) rc = SCSI_MLQUEUE_HOST_BUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5362) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5363) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5364)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5365) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5366) * This is necessary because the SML doesn't zero out this field during
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5367) * error recovery.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5368) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5369) scmd->result = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5370)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5371) hw_queue = pqi_get_hw_queue(ctrl_info, scmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5372) queue_group = &ctrl_info->queue_groups[hw_queue];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5373)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5374) if (pqi_is_logical_device(device)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5375) raid_bypassed = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5376) if (device->raid_bypass_enabled &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5377) !blk_rq_is_passthrough(scmd->request)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5378) rc = pqi_raid_bypass_submit_scsi_cmd(ctrl_info, device,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5379) scmd, queue_group);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5380) if (rc == 0 || rc == SCSI_MLQUEUE_HOST_BUSY) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5381) raid_bypassed = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5382) atomic_inc(&device->raid_bypass_cnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5383) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5384) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5385) if (!raid_bypassed)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5386) rc = pqi_raid_submit_scsi_cmd(ctrl_info, device, scmd, queue_group);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5387) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5388) if (device->aio_enabled)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5389) rc = pqi_aio_submit_scsi_cmd(ctrl_info, device, scmd, queue_group);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5390) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5391) rc = pqi_raid_submit_scsi_cmd(ctrl_info, device, scmd, queue_group);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5392) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5393)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5394) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5395) pqi_ctrl_unbusy(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5396) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5397) atomic_dec(&device->scsi_cmds_outstanding);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5398)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5399) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5400) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5401)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5402) static int pqi_wait_until_queued_io_drained(struct pqi_ctrl_info *ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5403) struct pqi_queue_group *queue_group)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5404) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5405) unsigned int path;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5406) unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5407) bool list_is_empty;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5408)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5409) for (path = 0; path < 2; path++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5410) while (1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5411) spin_lock_irqsave(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5412) &queue_group->submit_lock[path], flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5413) list_is_empty =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5414) list_empty(&queue_group->request_list[path]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5415) spin_unlock_irqrestore(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5416) &queue_group->submit_lock[path], flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5417) if (list_is_empty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5418) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5419) pqi_check_ctrl_health(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5420) if (pqi_ctrl_offline(ctrl_info))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5421) return -ENXIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5422) usleep_range(1000, 2000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5423) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5424) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5425)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5426) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5427) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5428)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5429) static int pqi_wait_until_inbound_queues_empty(struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5430) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5431) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5432) unsigned int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5433) unsigned int path;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5434) struct pqi_queue_group *queue_group;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5435) pqi_index_t iq_pi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5436) pqi_index_t iq_ci;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5437)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5438) for (i = 0; i < ctrl_info->num_queue_groups; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5439) queue_group = &ctrl_info->queue_groups[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5440)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5441) rc = pqi_wait_until_queued_io_drained(ctrl_info, queue_group);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5442) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5443) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5444)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5445) for (path = 0; path < 2; path++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5446) iq_pi = queue_group->iq_pi_copy[path];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5447)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5448) while (1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5449) iq_ci = readl(queue_group->iq_ci[path]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5450) if (iq_ci == iq_pi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5451) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5452) pqi_check_ctrl_health(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5453) if (pqi_ctrl_offline(ctrl_info))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5454) return -ENXIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5455) usleep_range(1000, 2000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5456) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5457) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5458) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5459)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5460) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5461) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5462)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5463) static void pqi_fail_io_queued_for_device(struct pqi_ctrl_info *ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5464) struct pqi_scsi_dev *device)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5465) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5466) unsigned int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5467) unsigned int path;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5468) struct pqi_queue_group *queue_group;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5469) unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5470) struct pqi_io_request *io_request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5471) struct pqi_io_request *next;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5472) struct scsi_cmnd *scmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5473) struct pqi_scsi_dev *scsi_device;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5474)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5475) for (i = 0; i < ctrl_info->num_queue_groups; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5476) queue_group = &ctrl_info->queue_groups[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5477)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5478) for (path = 0; path < 2; path++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5479) spin_lock_irqsave(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5480) &queue_group->submit_lock[path], flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5481)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5482) list_for_each_entry_safe(io_request, next,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5483) &queue_group->request_list[path],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5484) request_list_entry) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5485) scmd = io_request->scmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5486) if (!scmd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5487) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5488)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5489) scsi_device = scmd->device->hostdata;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5490) if (scsi_device != device)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5491) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5492)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5493) list_del(&io_request->request_list_entry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5494) set_host_byte(scmd, DID_RESET);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5495) pqi_free_io_request(io_request);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5496) scsi_dma_unmap(scmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5497) pqi_scsi_done(scmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5498) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5499)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5500) spin_unlock_irqrestore(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5501) &queue_group->submit_lock[path], flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5502) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5503) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5504) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5505)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5506) static void pqi_fail_io_queued_for_all_devices(struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5507) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5508) unsigned int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5509) unsigned int path;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5510) struct pqi_queue_group *queue_group;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5511) unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5512) struct pqi_io_request *io_request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5513) struct pqi_io_request *next;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5514) struct scsi_cmnd *scmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5515)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5516) for (i = 0; i < ctrl_info->num_queue_groups; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5517) queue_group = &ctrl_info->queue_groups[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5518)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5519) for (path = 0; path < 2; path++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5520) spin_lock_irqsave(&queue_group->submit_lock[path],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5521) flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5522)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5523) list_for_each_entry_safe(io_request, next,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5524) &queue_group->request_list[path],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5525) request_list_entry) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5526)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5527) scmd = io_request->scmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5528) if (!scmd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5529) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5530)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5531) list_del(&io_request->request_list_entry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5532) set_host_byte(scmd, DID_RESET);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5533) pqi_free_io_request(io_request);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5534) scsi_dma_unmap(scmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5535) pqi_scsi_done(scmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5536) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5537)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5538) spin_unlock_irqrestore(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5539) &queue_group->submit_lock[path], flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5540) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5541) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5542) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5543)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5544) static int pqi_device_wait_for_pending_io(struct pqi_ctrl_info *ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5545) struct pqi_scsi_dev *device, unsigned long timeout_secs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5546) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5547) unsigned long timeout;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5548)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5549) timeout = (timeout_secs * PQI_HZ) + jiffies;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5550)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5551) while (atomic_read(&device->scsi_cmds_outstanding)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5552) pqi_check_ctrl_health(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5553) if (pqi_ctrl_offline(ctrl_info))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5554) return -ENXIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5555) if (timeout_secs != NO_TIMEOUT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5556) if (time_after(jiffies, timeout)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5557) dev_err(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5558) "timed out waiting for pending IO\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5559) return -ETIMEDOUT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5560) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5561) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5562) usleep_range(1000, 2000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5563) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5564)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5565) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5566) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5567)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5568) static int pqi_ctrl_wait_for_pending_io(struct pqi_ctrl_info *ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5569) unsigned long timeout_secs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5570) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5571) bool io_pending;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5572) unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5573) unsigned long timeout;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5574) struct pqi_scsi_dev *device;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5575)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5576) timeout = (timeout_secs * PQI_HZ) + jiffies;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5577) while (1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5578) io_pending = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5579)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5580) spin_lock_irqsave(&ctrl_info->scsi_device_list_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5581) list_for_each_entry(device, &ctrl_info->scsi_device_list,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5582) scsi_device_list_entry) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5583) if (atomic_read(&device->scsi_cmds_outstanding)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5584) io_pending = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5585) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5586) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5587) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5588) spin_unlock_irqrestore(&ctrl_info->scsi_device_list_lock,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5589) flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5590)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5591) if (!io_pending)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5592) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5593)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5594) pqi_check_ctrl_health(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5595) if (pqi_ctrl_offline(ctrl_info))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5596) return -ENXIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5597)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5598) if (timeout_secs != NO_TIMEOUT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5599) if (time_after(jiffies, timeout)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5600) dev_err(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5601) "timed out waiting for pending IO\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5602) return -ETIMEDOUT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5603) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5604) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5605) usleep_range(1000, 2000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5606) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5607)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5608) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5609) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5610)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5611) static int pqi_ctrl_wait_for_pending_sync_cmds(struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5612) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5613) while (atomic_read(&ctrl_info->sync_cmds_outstanding)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5614) pqi_check_ctrl_health(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5615) if (pqi_ctrl_offline(ctrl_info))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5616) return -ENXIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5617) usleep_range(1000, 2000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5618) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5619)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5620) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5621) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5622)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5623) static void pqi_lun_reset_complete(struct pqi_io_request *io_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5624) void *context)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5625) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5626) struct completion *waiting = context;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5627)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5628) complete(waiting);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5629) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5630)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5631) #define PQI_LUN_RESET_TIMEOUT_SECS 30
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5632) #define PQI_LUN_RESET_POLL_COMPLETION_SECS 10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5633)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5634) static int pqi_wait_for_lun_reset_completion(struct pqi_ctrl_info *ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5635) struct pqi_scsi_dev *device, struct completion *wait)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5636) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5637) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5638)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5639) while (1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5640) if (wait_for_completion_io_timeout(wait,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5641) PQI_LUN_RESET_POLL_COMPLETION_SECS * PQI_HZ)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5642) rc = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5643) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5644) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5645)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5646) pqi_check_ctrl_health(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5647) if (pqi_ctrl_offline(ctrl_info)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5648) rc = -ENXIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5649) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5650) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5651) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5652)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5653) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5654) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5655)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5656) static int pqi_lun_reset(struct pqi_ctrl_info *ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5657) struct pqi_scsi_dev *device)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5658) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5659) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5660) struct pqi_io_request *io_request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5661) DECLARE_COMPLETION_ONSTACK(wait);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5662) struct pqi_task_management_request *request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5663)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5664) io_request = pqi_alloc_io_request(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5665) io_request->io_complete_callback = pqi_lun_reset_complete;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5666) io_request->context = &wait;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5667)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5668) request = io_request->iu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5669) memset(request, 0, sizeof(*request));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5670)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5671) request->header.iu_type = PQI_REQUEST_IU_TASK_MANAGEMENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5672) put_unaligned_le16(sizeof(*request) - PQI_REQUEST_HEADER_LENGTH,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5673) &request->header.iu_length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5674) put_unaligned_le16(io_request->index, &request->request_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5675) memcpy(request->lun_number, device->scsi3addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5676) sizeof(request->lun_number));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5677) request->task_management_function = SOP_TASK_MANAGEMENT_LUN_RESET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5678) if (ctrl_info->tmf_iu_timeout_supported)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5679) put_unaligned_le16(PQI_LUN_RESET_TIMEOUT_SECS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5680) &request->timeout);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5681)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5682) pqi_start_io(ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5683) &ctrl_info->queue_groups[PQI_DEFAULT_QUEUE_GROUP], RAID_PATH,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5684) io_request);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5685)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5686) rc = pqi_wait_for_lun_reset_completion(ctrl_info, device, &wait);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5687) if (rc == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5688) rc = io_request->status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5689)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5690) pqi_free_io_request(io_request);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5691)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5692) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5693) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5694)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5695) /* Performs a reset at the LUN level. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5696)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5697) #define PQI_LUN_RESET_RETRIES 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5698) #define PQI_LUN_RESET_RETRY_INTERVAL_MSECS 10000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5699) #define PQI_LUN_RESET_PENDING_IO_TIMEOUT_SECS 120
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5700)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5701) static int _pqi_device_reset(struct pqi_ctrl_info *ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5702) struct pqi_scsi_dev *device)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5703) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5704) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5705) unsigned int retries;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5706) unsigned long timeout_secs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5707)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5708) for (retries = 0;;) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5709) rc = pqi_lun_reset(ctrl_info, device);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5710) if (rc == 0 || ++retries > PQI_LUN_RESET_RETRIES)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5711) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5712) msleep(PQI_LUN_RESET_RETRY_INTERVAL_MSECS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5713) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5714)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5715) timeout_secs = rc ? PQI_LUN_RESET_PENDING_IO_TIMEOUT_SECS : NO_TIMEOUT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5716)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5717) rc |= pqi_device_wait_for_pending_io(ctrl_info, device, timeout_secs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5718)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5719) return rc == 0 ? SUCCESS : FAILED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5720) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5721)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5722) static int pqi_device_reset(struct pqi_ctrl_info *ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5723) struct pqi_scsi_dev *device)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5724) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5725) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5726)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5727) mutex_lock(&ctrl_info->lun_reset_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5728)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5729) pqi_ctrl_block_requests(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5730) pqi_ctrl_wait_until_quiesced(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5731) pqi_fail_io_queued_for_device(ctrl_info, device);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5732) rc = pqi_wait_until_inbound_queues_empty(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5733) pqi_device_reset_start(device);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5734) pqi_ctrl_unblock_requests(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5735)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5736) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5737) rc = FAILED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5738) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5739) rc = _pqi_device_reset(ctrl_info, device);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5740)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5741) pqi_device_reset_done(device);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5742)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5743) mutex_unlock(&ctrl_info->lun_reset_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5744)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5745) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5746) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5747)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5748) static int pqi_eh_device_reset_handler(struct scsi_cmnd *scmd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5749) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5750) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5751) struct Scsi_Host *shost;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5752) struct pqi_ctrl_info *ctrl_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5753) struct pqi_scsi_dev *device;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5754)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5755) shost = scmd->device->host;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5756) ctrl_info = shost_to_hba(shost);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5757) device = scmd->device->hostdata;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5758)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5759) dev_err(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5760) "resetting scsi %d:%d:%d:%d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5761) shost->host_no, device->bus, device->target, device->lun);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5762)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5763) pqi_check_ctrl_health(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5764) if (pqi_ctrl_offline(ctrl_info) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5765) pqi_device_reset_blocked(ctrl_info)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5766) rc = FAILED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5767) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5768) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5769)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5770) pqi_wait_until_ofa_finished(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5771)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5772) atomic_inc(&ctrl_info->sync_cmds_outstanding);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5773) rc = pqi_device_reset(ctrl_info, device);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5774) atomic_dec(&ctrl_info->sync_cmds_outstanding);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5775)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5776) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5777) dev_err(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5778) "reset of scsi %d:%d:%d:%d: %s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5779) shost->host_no, device->bus, device->target, device->lun,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5780) rc == SUCCESS ? "SUCCESS" : "FAILED");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5781)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5782) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5783) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5784)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5785) static int pqi_slave_alloc(struct scsi_device *sdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5786) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5787) struct pqi_scsi_dev *device;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5788) unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5789) struct pqi_ctrl_info *ctrl_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5790) struct scsi_target *starget;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5791) struct sas_rphy *rphy;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5792)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5793) ctrl_info = shost_to_hba(sdev->host);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5794)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5795) spin_lock_irqsave(&ctrl_info->scsi_device_list_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5796)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5797) if (sdev_channel(sdev) == PQI_PHYSICAL_DEVICE_BUS) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5798) starget = scsi_target(sdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5799) rphy = target_to_rphy(starget);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5800) device = pqi_find_device_by_sas_rphy(ctrl_info, rphy);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5801) if (device) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5802) device->target = sdev_id(sdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5803) device->lun = sdev->lun;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5804) device->target_lun_valid = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5805) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5806) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5807) device = pqi_find_scsi_dev(ctrl_info, sdev_channel(sdev),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5808) sdev_id(sdev), sdev->lun);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5809) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5810)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5811) if (device) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5812) sdev->hostdata = device;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5813) device->sdev = sdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5814) if (device->queue_depth) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5815) device->advertised_queue_depth = device->queue_depth;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5816) scsi_change_queue_depth(sdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5817) device->advertised_queue_depth);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5818) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5819) if (pqi_is_logical_device(device))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5820) pqi_disable_write_same(sdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5821) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5822) sdev->allow_restart = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5823) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5824)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5825) spin_unlock_irqrestore(&ctrl_info->scsi_device_list_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5826)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5827) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5828) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5829)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5830) static int pqi_map_queues(struct Scsi_Host *shost)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5831) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5832) struct pqi_ctrl_info *ctrl_info = shost_to_hba(shost);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5833)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5834) return blk_mq_pci_map_queues(&shost->tag_set.map[HCTX_TYPE_DEFAULT],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5835) ctrl_info->pci_dev, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5836) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5837)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5838) static int pqi_slave_configure(struct scsi_device *sdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5839) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5840) struct pqi_scsi_dev *device;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5841)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5842) device = sdev->hostdata;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5843) device->devtype = sdev->type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5844)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5845) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5846) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5847)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5848) static void pqi_slave_destroy(struct scsi_device *sdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5849) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5850) unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5851) struct pqi_scsi_dev *device;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5852) struct pqi_ctrl_info *ctrl_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5853)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5854) ctrl_info = shost_to_hba(sdev->host);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5855)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5856) spin_lock_irqsave(&ctrl_info->scsi_device_list_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5857)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5858) device = sdev->hostdata;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5859) if (device) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5860) sdev->hostdata = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5861) if (!list_empty(&device->scsi_device_list_entry))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5862) list_del(&device->scsi_device_list_entry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5863) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5864)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5865) spin_unlock_irqrestore(&ctrl_info->scsi_device_list_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5866)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5867) if (device) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5868) pqi_dev_info(ctrl_info, "removed", device);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5869) pqi_free_device(device);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5870) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5871) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5872)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5873) static int pqi_getpciinfo_ioctl(struct pqi_ctrl_info *ctrl_info, void __user *arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5874) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5875) struct pci_dev *pci_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5876) u32 subsystem_vendor;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5877) u32 subsystem_device;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5878) cciss_pci_info_struct pciinfo;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5879)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5880) if (!arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5881) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5882)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5883) pci_dev = ctrl_info->pci_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5884)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5885) pciinfo.domain = pci_domain_nr(pci_dev->bus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5886) pciinfo.bus = pci_dev->bus->number;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5887) pciinfo.dev_fn = pci_dev->devfn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5888) subsystem_vendor = pci_dev->subsystem_vendor;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5889) subsystem_device = pci_dev->subsystem_device;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5890) pciinfo.board_id = ((subsystem_device << 16) & 0xffff0000) | subsystem_vendor;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5891)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5892) if (copy_to_user(arg, &pciinfo, sizeof(pciinfo)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5893) return -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5894)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5895) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5896) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5897)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5898) static int pqi_getdrivver_ioctl(void __user *arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5899) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5900) u32 version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5901)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5902) if (!arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5903) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5904)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5905) version = (DRIVER_MAJOR << 28) | (DRIVER_MINOR << 24) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5906) (DRIVER_RELEASE << 16) | DRIVER_REVISION;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5907)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5908) if (copy_to_user(arg, &version, sizeof(version)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5909) return -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5910)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5911) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5912) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5913)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5914) struct ciss_error_info {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5915) u8 scsi_status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5916) int command_status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5917) size_t sense_data_length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5918) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5919)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5920) static void pqi_error_info_to_ciss(struct pqi_raid_error_info *pqi_error_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5921) struct ciss_error_info *ciss_error_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5922) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5923) int ciss_cmd_status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5924) size_t sense_data_length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5925)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5926) switch (pqi_error_info->data_out_result) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5927) case PQI_DATA_IN_OUT_GOOD:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5928) ciss_cmd_status = CISS_CMD_STATUS_SUCCESS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5929) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5930) case PQI_DATA_IN_OUT_UNDERFLOW:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5931) ciss_cmd_status = CISS_CMD_STATUS_DATA_UNDERRUN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5932) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5933) case PQI_DATA_IN_OUT_BUFFER_OVERFLOW:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5934) ciss_cmd_status = CISS_CMD_STATUS_DATA_OVERRUN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5935) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5936) case PQI_DATA_IN_OUT_PROTOCOL_ERROR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5937) case PQI_DATA_IN_OUT_BUFFER_ERROR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5938) case PQI_DATA_IN_OUT_BUFFER_OVERFLOW_DESCRIPTOR_AREA:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5939) case PQI_DATA_IN_OUT_BUFFER_OVERFLOW_BRIDGE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5940) case PQI_DATA_IN_OUT_ERROR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5941) ciss_cmd_status = CISS_CMD_STATUS_PROTOCOL_ERROR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5942) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5943) case PQI_DATA_IN_OUT_HARDWARE_ERROR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5944) case PQI_DATA_IN_OUT_PCIE_FABRIC_ERROR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5945) case PQI_DATA_IN_OUT_PCIE_COMPLETION_TIMEOUT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5946) case PQI_DATA_IN_OUT_PCIE_COMPLETER_ABORT_RECEIVED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5947) case PQI_DATA_IN_OUT_PCIE_UNSUPPORTED_REQUEST_RECEIVED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5948) case PQI_DATA_IN_OUT_PCIE_ECRC_CHECK_FAILED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5949) case PQI_DATA_IN_OUT_PCIE_UNSUPPORTED_REQUEST:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5950) case PQI_DATA_IN_OUT_PCIE_ACS_VIOLATION:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5951) case PQI_DATA_IN_OUT_PCIE_TLP_PREFIX_BLOCKED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5952) case PQI_DATA_IN_OUT_PCIE_POISONED_MEMORY_READ:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5953) ciss_cmd_status = CISS_CMD_STATUS_HARDWARE_ERROR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5954) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5955) case PQI_DATA_IN_OUT_UNSOLICITED_ABORT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5956) ciss_cmd_status = CISS_CMD_STATUS_UNSOLICITED_ABORT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5957) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5958) case PQI_DATA_IN_OUT_ABORTED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5959) ciss_cmd_status = CISS_CMD_STATUS_ABORTED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5960) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5961) case PQI_DATA_IN_OUT_TIMEOUT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5962) ciss_cmd_status = CISS_CMD_STATUS_TIMEOUT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5963) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5964) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5965) ciss_cmd_status = CISS_CMD_STATUS_TARGET_STATUS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5966) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5967) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5968)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5969) sense_data_length =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5970) get_unaligned_le16(&pqi_error_info->sense_data_length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5971) if (sense_data_length == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5972) sense_data_length =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5973) get_unaligned_le16(&pqi_error_info->response_data_length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5974) if (sense_data_length)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5975) if (sense_data_length > sizeof(pqi_error_info->data))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5976) sense_data_length = sizeof(pqi_error_info->data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5977)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5978) ciss_error_info->scsi_status = pqi_error_info->status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5979) ciss_error_info->command_status = ciss_cmd_status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5980) ciss_error_info->sense_data_length = sense_data_length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5981) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5982)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5983) static int pqi_passthru_ioctl(struct pqi_ctrl_info *ctrl_info, void __user *arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5984) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5985) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5986) char *kernel_buffer = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5987) u16 iu_length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5988) size_t sense_data_length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5989) IOCTL_Command_struct iocommand;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5990) struct pqi_raid_path_request request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5991) struct pqi_raid_error_info pqi_error_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5992) struct ciss_error_info ciss_error_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5993)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5994) if (pqi_ctrl_offline(ctrl_info))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5995) return -ENXIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5996) if (!arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5997) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5998) if (!capable(CAP_SYS_RAWIO))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5999) return -EPERM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6000) if (copy_from_user(&iocommand, arg, sizeof(iocommand)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6001) return -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6002) if (iocommand.buf_size < 1 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6003) iocommand.Request.Type.Direction != XFER_NONE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6004) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6005) if (iocommand.Request.CDBLen > sizeof(request.cdb))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6006) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6007) if (iocommand.Request.Type.Type != TYPE_CMD)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6008) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6009)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6010) switch (iocommand.Request.Type.Direction) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6011) case XFER_NONE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6012) case XFER_WRITE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6013) case XFER_READ:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6014) case XFER_READ | XFER_WRITE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6015) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6016) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6017) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6018) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6019)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6020) if (iocommand.buf_size > 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6021) kernel_buffer = kmalloc(iocommand.buf_size, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6022) if (!kernel_buffer)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6023) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6024) if (iocommand.Request.Type.Direction & XFER_WRITE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6025) if (copy_from_user(kernel_buffer, iocommand.buf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6026) iocommand.buf_size)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6027) rc = -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6028) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6029) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6030) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6031) memset(kernel_buffer, 0, iocommand.buf_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6032) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6033) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6034)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6035) memset(&request, 0, sizeof(request));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6036)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6037) request.header.iu_type = PQI_REQUEST_IU_RAID_PATH_IO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6038) iu_length = offsetof(struct pqi_raid_path_request, sg_descriptors) -
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6039) PQI_REQUEST_HEADER_LENGTH;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6040) memcpy(request.lun_number, iocommand.LUN_info.LunAddrBytes,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6041) sizeof(request.lun_number));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6042) memcpy(request.cdb, iocommand.Request.CDB, iocommand.Request.CDBLen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6043) request.additional_cdb_bytes_usage = SOP_ADDITIONAL_CDB_BYTES_0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6044)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6045) switch (iocommand.Request.Type.Direction) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6046) case XFER_NONE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6047) request.data_direction = SOP_NO_DIRECTION_FLAG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6048) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6049) case XFER_WRITE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6050) request.data_direction = SOP_WRITE_FLAG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6051) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6052) case XFER_READ:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6053) request.data_direction = SOP_READ_FLAG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6054) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6055) case XFER_READ | XFER_WRITE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6056) request.data_direction = SOP_BIDIRECTIONAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6057) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6058) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6059)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6060) request.task_attribute = SOP_TASK_ATTRIBUTE_SIMPLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6061)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6062) if (iocommand.buf_size > 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6063) put_unaligned_le32(iocommand.buf_size, &request.buffer_length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6064)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6065) rc = pqi_map_single(ctrl_info->pci_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6066) &request.sg_descriptors[0], kernel_buffer,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6067) iocommand.buf_size, DMA_BIDIRECTIONAL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6068) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6069) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6070)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6071) iu_length += sizeof(request.sg_descriptors[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6072) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6073)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6074) put_unaligned_le16(iu_length, &request.header.iu_length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6075)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6076) if (ctrl_info->raid_iu_timeout_supported)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6077) put_unaligned_le32(iocommand.Request.Timeout, &request.timeout);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6078)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6079) rc = pqi_submit_raid_request_synchronous(ctrl_info, &request.header,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6080) PQI_SYNC_FLAGS_INTERRUPTABLE, &pqi_error_info, NO_TIMEOUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6081)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6082) if (iocommand.buf_size > 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6083) pqi_pci_unmap(ctrl_info->pci_dev, request.sg_descriptors, 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6084) DMA_BIDIRECTIONAL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6085)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6086) memset(&iocommand.error_info, 0, sizeof(iocommand.error_info));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6087)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6088) if (rc == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6089) pqi_error_info_to_ciss(&pqi_error_info, &ciss_error_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6090) iocommand.error_info.ScsiStatus = ciss_error_info.scsi_status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6091) iocommand.error_info.CommandStatus =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6092) ciss_error_info.command_status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6093) sense_data_length = ciss_error_info.sense_data_length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6094) if (sense_data_length) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6095) if (sense_data_length >
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6096) sizeof(iocommand.error_info.SenseInfo))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6097) sense_data_length =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6098) sizeof(iocommand.error_info.SenseInfo);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6099) memcpy(iocommand.error_info.SenseInfo,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6100) pqi_error_info.data, sense_data_length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6101) iocommand.error_info.SenseLen = sense_data_length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6102) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6103) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6104)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6105) if (copy_to_user(arg, &iocommand, sizeof(iocommand))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6106) rc = -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6107) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6108) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6109)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6110) if (rc == 0 && iocommand.buf_size > 0 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6111) (iocommand.Request.Type.Direction & XFER_READ)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6112) if (copy_to_user(iocommand.buf, kernel_buffer,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6113) iocommand.buf_size)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6114) rc = -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6115) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6116) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6117)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6118) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6119) kfree(kernel_buffer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6120)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6121) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6122) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6123)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6124) static int pqi_ioctl(struct scsi_device *sdev, unsigned int cmd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6125) void __user *arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6126) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6127) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6128) struct pqi_ctrl_info *ctrl_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6129)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6130) ctrl_info = shost_to_hba(sdev->host);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6131)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6132) if (pqi_ctrl_in_ofa(ctrl_info) || pqi_ctrl_in_shutdown(ctrl_info))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6133) return -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6134)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6135) switch (cmd) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6136) case CCISS_DEREGDISK:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6137) case CCISS_REGNEWDISK:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6138) case CCISS_REGNEWD:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6139) rc = pqi_scan_scsi_devices(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6140) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6141) case CCISS_GETPCIINFO:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6142) rc = pqi_getpciinfo_ioctl(ctrl_info, arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6143) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6144) case CCISS_GETDRIVVER:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6145) rc = pqi_getdrivver_ioctl(arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6146) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6147) case CCISS_PASSTHRU:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6148) rc = pqi_passthru_ioctl(ctrl_info, arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6149) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6150) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6151) rc = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6152) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6153) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6154)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6155) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6156) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6157)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6158) static ssize_t pqi_firmware_version_show(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6159) struct device_attribute *attr, char *buffer)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6160) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6161) struct Scsi_Host *shost;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6162) struct pqi_ctrl_info *ctrl_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6163)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6164) shost = class_to_shost(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6165) ctrl_info = shost_to_hba(shost);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6166)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6167) return snprintf(buffer, PAGE_SIZE, "%s\n", ctrl_info->firmware_version);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6168) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6169)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6170) static ssize_t pqi_driver_version_show(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6171) struct device_attribute *attr, char *buffer)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6172) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6173) return snprintf(buffer, PAGE_SIZE, "%s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6174) DRIVER_VERSION BUILD_TIMESTAMP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6175) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6176)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6177) static ssize_t pqi_serial_number_show(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6178) struct device_attribute *attr, char *buffer)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6179) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6180) struct Scsi_Host *shost;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6181) struct pqi_ctrl_info *ctrl_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6182)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6183) shost = class_to_shost(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6184) ctrl_info = shost_to_hba(shost);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6185)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6186) return snprintf(buffer, PAGE_SIZE, "%s\n", ctrl_info->serial_number);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6187) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6188)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6189) static ssize_t pqi_model_show(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6190) struct device_attribute *attr, char *buffer)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6191) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6192) struct Scsi_Host *shost;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6193) struct pqi_ctrl_info *ctrl_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6194)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6195) shost = class_to_shost(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6196) ctrl_info = shost_to_hba(shost);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6197)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6198) return snprintf(buffer, PAGE_SIZE, "%s\n", ctrl_info->model);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6199) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6200)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6201) static ssize_t pqi_vendor_show(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6202) struct device_attribute *attr, char *buffer)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6203) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6204) struct Scsi_Host *shost;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6205) struct pqi_ctrl_info *ctrl_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6206)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6207) shost = class_to_shost(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6208) ctrl_info = shost_to_hba(shost);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6209)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6210) return snprintf(buffer, PAGE_SIZE, "%s\n", ctrl_info->vendor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6211) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6212)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6213) static ssize_t pqi_host_rescan_store(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6214) struct device_attribute *attr, const char *buffer, size_t count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6215) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6216) struct Scsi_Host *shost = class_to_shost(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6217)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6218) pqi_scan_start(shost);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6219)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6220) return count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6221) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6222)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6223) static ssize_t pqi_lockup_action_show(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6224) struct device_attribute *attr, char *buffer)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6225) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6226) int count = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6227) unsigned int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6228)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6229) for (i = 0; i < ARRAY_SIZE(pqi_lockup_actions); i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6230) if (pqi_lockup_actions[i].action == pqi_lockup_action)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6231) count += scnprintf(buffer + count, PAGE_SIZE - count,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6232) "[%s] ", pqi_lockup_actions[i].name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6233) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6234) count += scnprintf(buffer + count, PAGE_SIZE - count,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6235) "%s ", pqi_lockup_actions[i].name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6236) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6237)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6238) count += scnprintf(buffer + count, PAGE_SIZE - count, "\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6239)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6240) return count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6241) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6242)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6243) static ssize_t pqi_lockup_action_store(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6244) struct device_attribute *attr, const char *buffer, size_t count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6245) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6246) unsigned int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6247) char *action_name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6248) char action_name_buffer[32];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6249)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6250) strlcpy(action_name_buffer, buffer, sizeof(action_name_buffer));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6251) action_name = strstrip(action_name_buffer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6252)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6253) for (i = 0; i < ARRAY_SIZE(pqi_lockup_actions); i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6254) if (strcmp(action_name, pqi_lockup_actions[i].name) == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6255) pqi_lockup_action = pqi_lockup_actions[i].action;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6256) return count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6257) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6258) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6259)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6260) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6261) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6262)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6263) static DEVICE_ATTR(driver_version, 0444, pqi_driver_version_show, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6264) static DEVICE_ATTR(firmware_version, 0444, pqi_firmware_version_show, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6265) static DEVICE_ATTR(model, 0444, pqi_model_show, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6266) static DEVICE_ATTR(serial_number, 0444, pqi_serial_number_show, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6267) static DEVICE_ATTR(vendor, 0444, pqi_vendor_show, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6268) static DEVICE_ATTR(rescan, 0200, NULL, pqi_host_rescan_store);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6269) static DEVICE_ATTR(lockup_action, 0644,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6270) pqi_lockup_action_show, pqi_lockup_action_store);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6271)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6272) static struct device_attribute *pqi_shost_attrs[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6273) &dev_attr_driver_version,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6274) &dev_attr_firmware_version,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6275) &dev_attr_model,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6276) &dev_attr_serial_number,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6277) &dev_attr_vendor,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6278) &dev_attr_rescan,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6279) &dev_attr_lockup_action,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6280) NULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6281) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6282)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6283) static ssize_t pqi_unique_id_show(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6284) struct device_attribute *attr, char *buffer)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6285) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6286) struct pqi_ctrl_info *ctrl_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6287) struct scsi_device *sdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6288) struct pqi_scsi_dev *device;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6289) unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6290) u8 unique_id[16];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6291)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6292) sdev = to_scsi_device(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6293) ctrl_info = shost_to_hba(sdev->host);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6294)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6295) spin_lock_irqsave(&ctrl_info->scsi_device_list_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6296)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6297) device = sdev->hostdata;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6298) if (!device) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6299) spin_unlock_irqrestore(&ctrl_info->scsi_device_list_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6300) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6301) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6302)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6303) if (device->is_physical_device) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6304) memset(unique_id, 0, 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6305) memcpy(unique_id + 8, &device->wwid, sizeof(device->wwid));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6306) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6307) memcpy(unique_id, device->volume_id, sizeof(device->volume_id));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6308) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6309)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6310) spin_unlock_irqrestore(&ctrl_info->scsi_device_list_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6311)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6312) return snprintf(buffer, PAGE_SIZE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6313) "%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6314) unique_id[0], unique_id[1], unique_id[2], unique_id[3],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6315) unique_id[4], unique_id[5], unique_id[6], unique_id[7],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6316) unique_id[8], unique_id[9], unique_id[10], unique_id[11],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6317) unique_id[12], unique_id[13], unique_id[14], unique_id[15]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6318) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6319)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6320) static ssize_t pqi_lunid_show(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6321) struct device_attribute *attr, char *buffer)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6322) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6323) struct pqi_ctrl_info *ctrl_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6324) struct scsi_device *sdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6325) struct pqi_scsi_dev *device;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6326) unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6327) u8 lunid[8];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6328)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6329) sdev = to_scsi_device(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6330) ctrl_info = shost_to_hba(sdev->host);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6331)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6332) spin_lock_irqsave(&ctrl_info->scsi_device_list_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6333)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6334) device = sdev->hostdata;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6335) if (!device) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6336) spin_unlock_irqrestore(&ctrl_info->scsi_device_list_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6337) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6338) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6339)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6340) memcpy(lunid, device->scsi3addr, sizeof(lunid));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6341)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6342) spin_unlock_irqrestore(&ctrl_info->scsi_device_list_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6343)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6344) return snprintf(buffer, PAGE_SIZE, "0x%8phN\n", lunid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6345) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6346)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6347) #define MAX_PATHS 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6348)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6349) static ssize_t pqi_path_info_show(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6350) struct device_attribute *attr, char *buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6351) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6352) struct pqi_ctrl_info *ctrl_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6353) struct scsi_device *sdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6354) struct pqi_scsi_dev *device;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6355) unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6356) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6357) int output_len = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6358) u8 box;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6359) u8 bay;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6360) u8 path_map_index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6361) char *active;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6362) u8 phys_connector[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6363)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6364) sdev = to_scsi_device(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6365) ctrl_info = shost_to_hba(sdev->host);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6366)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6367) spin_lock_irqsave(&ctrl_info->scsi_device_list_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6368)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6369) device = sdev->hostdata;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6370) if (!device) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6371) spin_unlock_irqrestore(&ctrl_info->scsi_device_list_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6372) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6373) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6374)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6375) bay = device->bay;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6376) for (i = 0; i < MAX_PATHS; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6377) path_map_index = 1 << i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6378) if (i == device->active_path_index)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6379) active = "Active";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6380) else if (device->path_map & path_map_index)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6381) active = "Inactive";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6382) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6383) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6384)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6385) output_len += scnprintf(buf + output_len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6386) PAGE_SIZE - output_len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6387) "[%d:%d:%d:%d] %20.20s ",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6388) ctrl_info->scsi_host->host_no,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6389) device->bus, device->target,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6390) device->lun,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6391) scsi_device_type(device->devtype));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6392)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6393) if (device->devtype == TYPE_RAID ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6394) pqi_is_logical_device(device))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6395) goto end_buffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6396)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6397) memcpy(&phys_connector, &device->phys_connector[i],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6398) sizeof(phys_connector));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6399) if (phys_connector[0] < '0')
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6400) phys_connector[0] = '0';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6401) if (phys_connector[1] < '0')
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6402) phys_connector[1] = '0';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6403)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6404) output_len += scnprintf(buf + output_len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6405) PAGE_SIZE - output_len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6406) "PORT: %.2s ", phys_connector);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6407)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6408) box = device->box[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6409) if (box != 0 && box != 0xFF)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6410) output_len += scnprintf(buf + output_len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6411) PAGE_SIZE - output_len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6412) "BOX: %hhu ", box);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6413)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6414) if ((device->devtype == TYPE_DISK ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6415) device->devtype == TYPE_ZBC) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6416) pqi_expose_device(device))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6417) output_len += scnprintf(buf + output_len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6418) PAGE_SIZE - output_len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6419) "BAY: %hhu ", bay);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6420)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6421) end_buffer:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6422) output_len += scnprintf(buf + output_len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6423) PAGE_SIZE - output_len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6424) "%s\n", active);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6425) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6426)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6427) spin_unlock_irqrestore(&ctrl_info->scsi_device_list_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6428)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6429) return output_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6430) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6431)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6432) static ssize_t pqi_sas_address_show(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6433) struct device_attribute *attr, char *buffer)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6434) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6435) struct pqi_ctrl_info *ctrl_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6436) struct scsi_device *sdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6437) struct pqi_scsi_dev *device;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6438) unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6439) u64 sas_address;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6440)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6441) sdev = to_scsi_device(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6442) ctrl_info = shost_to_hba(sdev->host);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6443)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6444) spin_lock_irqsave(&ctrl_info->scsi_device_list_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6445)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6446) device = sdev->hostdata;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6447) if (!device || !pqi_is_device_with_sas_address(device)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6448) spin_unlock_irqrestore(&ctrl_info->scsi_device_list_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6449) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6450) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6451)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6452) sas_address = device->sas_address;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6453)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6454) spin_unlock_irqrestore(&ctrl_info->scsi_device_list_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6455)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6456) return snprintf(buffer, PAGE_SIZE, "0x%016llx\n", sas_address);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6457) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6458)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6459) static ssize_t pqi_ssd_smart_path_enabled_show(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6460) struct device_attribute *attr, char *buffer)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6461) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6462) struct pqi_ctrl_info *ctrl_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6463) struct scsi_device *sdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6464) struct pqi_scsi_dev *device;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6465) unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6466)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6467) sdev = to_scsi_device(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6468) ctrl_info = shost_to_hba(sdev->host);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6469)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6470) spin_lock_irqsave(&ctrl_info->scsi_device_list_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6471)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6472) device = sdev->hostdata;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6473) if (!device) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6474) spin_unlock_irqrestore(&ctrl_info->scsi_device_list_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6475) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6476) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6477)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6478) buffer[0] = device->raid_bypass_enabled ? '1' : '0';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6479) buffer[1] = '\n';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6480) buffer[2] = '\0';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6481)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6482) spin_unlock_irqrestore(&ctrl_info->scsi_device_list_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6483)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6484) return 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6485) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6486)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6487) static ssize_t pqi_raid_level_show(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6488) struct device_attribute *attr, char *buffer)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6489) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6490) struct pqi_ctrl_info *ctrl_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6491) struct scsi_device *sdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6492) struct pqi_scsi_dev *device;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6493) unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6494) char *raid_level;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6495)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6496) sdev = to_scsi_device(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6497) ctrl_info = shost_to_hba(sdev->host);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6498)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6499) spin_lock_irqsave(&ctrl_info->scsi_device_list_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6500)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6501) device = sdev->hostdata;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6502) if (!device) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6503) spin_unlock_irqrestore(&ctrl_info->scsi_device_list_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6504) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6505) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6506)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6507) if (pqi_is_logical_device(device))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6508) raid_level = pqi_raid_level_to_string(device->raid_level);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6509) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6510) raid_level = "N/A";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6511)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6512) spin_unlock_irqrestore(&ctrl_info->scsi_device_list_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6513)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6514) return snprintf(buffer, PAGE_SIZE, "%s\n", raid_level);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6515) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6516)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6517) static ssize_t pqi_raid_bypass_cnt_show(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6518) struct device_attribute *attr, char *buffer)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6519) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6520) struct pqi_ctrl_info *ctrl_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6521) struct scsi_device *sdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6522) struct pqi_scsi_dev *device;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6523) unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6524) int raid_bypass_cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6525)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6526) sdev = to_scsi_device(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6527) ctrl_info = shost_to_hba(sdev->host);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6528)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6529) spin_lock_irqsave(&ctrl_info->scsi_device_list_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6530)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6531) device = sdev->hostdata;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6532) if (!device) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6533) spin_unlock_irqrestore(&ctrl_info->scsi_device_list_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6534) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6535) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6536)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6537) raid_bypass_cnt = atomic_read(&device->raid_bypass_cnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6538)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6539) spin_unlock_irqrestore(&ctrl_info->scsi_device_list_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6540)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6541) return snprintf(buffer, PAGE_SIZE, "0x%x\n", raid_bypass_cnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6542) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6543)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6544) static DEVICE_ATTR(lunid, 0444, pqi_lunid_show, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6545) static DEVICE_ATTR(unique_id, 0444, pqi_unique_id_show, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6546) static DEVICE_ATTR(path_info, 0444, pqi_path_info_show, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6547) static DEVICE_ATTR(sas_address, 0444, pqi_sas_address_show, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6548) static DEVICE_ATTR(ssd_smart_path_enabled, 0444, pqi_ssd_smart_path_enabled_show, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6549) static DEVICE_ATTR(raid_level, 0444, pqi_raid_level_show, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6550) static DEVICE_ATTR(raid_bypass_cnt, 0444, pqi_raid_bypass_cnt_show, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6551)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6552) static struct device_attribute *pqi_sdev_attrs[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6553) &dev_attr_lunid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6554) &dev_attr_unique_id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6555) &dev_attr_path_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6556) &dev_attr_sas_address,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6557) &dev_attr_ssd_smart_path_enabled,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6558) &dev_attr_raid_level,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6559) &dev_attr_raid_bypass_cnt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6560) NULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6561) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6562)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6563) static struct scsi_host_template pqi_driver_template = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6564) .module = THIS_MODULE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6565) .name = DRIVER_NAME_SHORT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6566) .proc_name = DRIVER_NAME_SHORT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6567) .queuecommand = pqi_scsi_queue_command,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6568) .scan_start = pqi_scan_start,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6569) .scan_finished = pqi_scan_finished,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6570) .this_id = -1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6571) .eh_device_reset_handler = pqi_eh_device_reset_handler,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6572) .ioctl = pqi_ioctl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6573) .slave_alloc = pqi_slave_alloc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6574) .slave_configure = pqi_slave_configure,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6575) .slave_destroy = pqi_slave_destroy,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6576) .map_queues = pqi_map_queues,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6577) .sdev_attrs = pqi_sdev_attrs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6578) .shost_attrs = pqi_shost_attrs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6579) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6580)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6581) static int pqi_register_scsi(struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6582) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6583) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6584) struct Scsi_Host *shost;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6585)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6586) shost = scsi_host_alloc(&pqi_driver_template, sizeof(ctrl_info));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6587) if (!shost) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6588) dev_err(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6589) "scsi_host_alloc failed for controller %u\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6590) ctrl_info->ctrl_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6591) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6592) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6593)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6594) shost->io_port = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6595) shost->n_io_port = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6596) shost->this_id = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6597) shost->max_channel = PQI_MAX_BUS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6598) shost->max_cmd_len = MAX_COMMAND_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6599) shost->max_lun = ~0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6600) shost->max_id = ~0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6601) shost->max_sectors = ctrl_info->max_sectors;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6602) shost->can_queue = ctrl_info->scsi_ml_can_queue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6603) shost->cmd_per_lun = shost->can_queue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6604) shost->sg_tablesize = ctrl_info->sg_tablesize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6605) shost->transportt = pqi_sas_transport_template;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6606) shost->irq = pci_irq_vector(ctrl_info->pci_dev, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6607) shost->unique_id = shost->irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6608) shost->nr_hw_queues = ctrl_info->num_queue_groups;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6609) shost->host_tagset = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6610) shost->hostdata[0] = (unsigned long)ctrl_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6611)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6612) rc = scsi_add_host(shost, &ctrl_info->pci_dev->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6613) if (rc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6614) dev_err(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6615) "scsi_add_host failed for controller %u\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6616) ctrl_info->ctrl_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6617) goto free_host;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6618) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6619)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6620) rc = pqi_add_sas_host(shost, ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6621) if (rc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6622) dev_err(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6623) "add SAS host failed for controller %u\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6624) ctrl_info->ctrl_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6625) goto remove_host;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6626) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6627)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6628) ctrl_info->scsi_host = shost;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6629)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6630) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6631)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6632) remove_host:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6633) scsi_remove_host(shost);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6634) free_host:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6635) scsi_host_put(shost);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6636)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6637) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6638) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6639)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6640) static void pqi_unregister_scsi(struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6641) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6642) struct Scsi_Host *shost;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6643)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6644) pqi_delete_sas_host(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6645)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6646) shost = ctrl_info->scsi_host;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6647) if (!shost)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6648) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6649)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6650) scsi_remove_host(shost);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6651) scsi_host_put(shost);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6652) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6653)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6654) static int pqi_wait_for_pqi_reset_completion(struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6655) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6656) int rc = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6657) struct pqi_device_registers __iomem *pqi_registers;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6658) unsigned long timeout;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6659) unsigned int timeout_msecs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6660) union pqi_reset_register reset_reg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6661)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6662) pqi_registers = ctrl_info->pqi_registers;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6663) timeout_msecs = readw(&pqi_registers->max_reset_timeout) * 100;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6664) timeout = msecs_to_jiffies(timeout_msecs) + jiffies;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6665)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6666) while (1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6667) msleep(PQI_RESET_POLL_INTERVAL_MSECS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6668) reset_reg.all_bits = readl(&pqi_registers->device_reset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6669) if (reset_reg.bits.reset_action == PQI_RESET_ACTION_COMPLETED)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6670) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6671) pqi_check_ctrl_health(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6672) if (pqi_ctrl_offline(ctrl_info)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6673) rc = -ENXIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6674) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6675) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6676) if (time_after(jiffies, timeout)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6677) rc = -ETIMEDOUT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6678) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6679) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6680) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6681)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6682) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6683) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6684)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6685) static int pqi_reset(struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6686) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6687) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6688) union pqi_reset_register reset_reg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6689)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6690) if (ctrl_info->pqi_reset_quiesce_supported) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6691) rc = sis_pqi_reset_quiesce(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6692) if (rc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6693) dev_err(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6694) "PQI reset failed during quiesce with error %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6695) rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6696) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6697) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6698) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6699)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6700) reset_reg.all_bits = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6701) reset_reg.bits.reset_type = PQI_RESET_TYPE_HARD_RESET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6702) reset_reg.bits.reset_action = PQI_RESET_ACTION_RESET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6703)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6704) writel(reset_reg.all_bits, &ctrl_info->pqi_registers->device_reset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6705)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6706) rc = pqi_wait_for_pqi_reset_completion(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6707) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6708) dev_err(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6709) "PQI reset failed with error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6710)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6711) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6712) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6713)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6714) static int pqi_get_ctrl_serial_number(struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6715) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6716) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6717) struct bmic_sense_subsystem_info *sense_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6718)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6719) sense_info = kzalloc(sizeof(*sense_info), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6720) if (!sense_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6721) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6722)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6723) rc = pqi_sense_subsystem_info(ctrl_info, sense_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6724) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6725) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6726)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6727) memcpy(ctrl_info->serial_number, sense_info->ctrl_serial_number,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6728) sizeof(sense_info->ctrl_serial_number));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6729) ctrl_info->serial_number[sizeof(sense_info->ctrl_serial_number)] = '\0';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6730)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6731) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6732) kfree(sense_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6733)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6734) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6735) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6736)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6737) static int pqi_get_ctrl_product_details(struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6738) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6739) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6740) struct bmic_identify_controller *identify;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6741)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6742) identify = kmalloc(sizeof(*identify), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6743) if (!identify)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6744) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6745)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6746) rc = pqi_identify_controller(ctrl_info, identify);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6747) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6748) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6749)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6750) memcpy(ctrl_info->firmware_version, identify->firmware_version,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6751) sizeof(identify->firmware_version));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6752) ctrl_info->firmware_version[sizeof(identify->firmware_version)] = '\0';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6753) snprintf(ctrl_info->firmware_version +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6754) strlen(ctrl_info->firmware_version),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6755) sizeof(ctrl_info->firmware_version),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6756) "-%u", get_unaligned_le16(&identify->firmware_build_number));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6757)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6758) memcpy(ctrl_info->model, identify->product_id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6759) sizeof(identify->product_id));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6760) ctrl_info->model[sizeof(identify->product_id)] = '\0';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6761)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6762) memcpy(ctrl_info->vendor, identify->vendor_id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6763) sizeof(identify->vendor_id));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6764) ctrl_info->vendor[sizeof(identify->vendor_id)] = '\0';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6765)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6766) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6767) kfree(identify);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6768)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6769) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6770) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6771)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6772) struct pqi_config_table_section_info {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6773) struct pqi_ctrl_info *ctrl_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6774) void *section;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6775) u32 section_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6776) void __iomem *section_iomem_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6777) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6778)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6779) static inline bool pqi_is_firmware_feature_supported(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6780) struct pqi_config_table_firmware_features *firmware_features,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6781) unsigned int bit_position)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6782) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6783) unsigned int byte_index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6784)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6785) byte_index = bit_position / BITS_PER_BYTE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6786)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6787) if (byte_index >= le16_to_cpu(firmware_features->num_elements))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6788) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6789)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6790) return firmware_features->features_supported[byte_index] &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6791) (1 << (bit_position % BITS_PER_BYTE)) ? true : false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6792) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6793)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6794) static inline bool pqi_is_firmware_feature_enabled(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6795) struct pqi_config_table_firmware_features *firmware_features,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6796) void __iomem *firmware_features_iomem_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6797) unsigned int bit_position)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6798) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6799) unsigned int byte_index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6800) u8 __iomem *features_enabled_iomem_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6801)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6802) byte_index = (bit_position / BITS_PER_BYTE) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6803) (le16_to_cpu(firmware_features->num_elements) * 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6804)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6805) features_enabled_iomem_addr = firmware_features_iomem_addr +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6806) offsetof(struct pqi_config_table_firmware_features,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6807) features_supported) + byte_index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6808)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6809) return *((__force u8 *)features_enabled_iomem_addr) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6810) (1 << (bit_position % BITS_PER_BYTE)) ? true : false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6811) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6812)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6813) static inline void pqi_request_firmware_feature(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6814) struct pqi_config_table_firmware_features *firmware_features,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6815) unsigned int bit_position)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6816) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6817) unsigned int byte_index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6818)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6819) byte_index = (bit_position / BITS_PER_BYTE) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6820) le16_to_cpu(firmware_features->num_elements);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6821)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6822) firmware_features->features_supported[byte_index] |=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6823) (1 << (bit_position % BITS_PER_BYTE));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6824) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6825)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6826) static int pqi_config_table_update(struct pqi_ctrl_info *ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6827) u16 first_section, u16 last_section)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6828) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6829) struct pqi_vendor_general_request request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6830)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6831) memset(&request, 0, sizeof(request));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6832)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6833) request.header.iu_type = PQI_REQUEST_IU_VENDOR_GENERAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6834) put_unaligned_le16(sizeof(request) - PQI_REQUEST_HEADER_LENGTH,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6835) &request.header.iu_length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6836) put_unaligned_le16(PQI_VENDOR_GENERAL_CONFIG_TABLE_UPDATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6837) &request.function_code);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6838) put_unaligned_le16(first_section,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6839) &request.data.config_table_update.first_section);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6840) put_unaligned_le16(last_section,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6841) &request.data.config_table_update.last_section);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6842)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6843) return pqi_submit_raid_request_synchronous(ctrl_info, &request.header,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6844) 0, NULL, NO_TIMEOUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6845) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6846)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6847) static int pqi_enable_firmware_features(struct pqi_ctrl_info *ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6848) struct pqi_config_table_firmware_features *firmware_features,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6849) void __iomem *firmware_features_iomem_addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6850) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6851) void *features_requested;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6852) void __iomem *features_requested_iomem_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6853)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6854) features_requested = firmware_features->features_supported +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6855) le16_to_cpu(firmware_features->num_elements);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6856)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6857) features_requested_iomem_addr = firmware_features_iomem_addr +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6858) (features_requested - (void *)firmware_features);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6859)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6860) memcpy_toio(features_requested_iomem_addr, features_requested,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6861) le16_to_cpu(firmware_features->num_elements));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6862)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6863) return pqi_config_table_update(ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6864) PQI_CONFIG_TABLE_SECTION_FIRMWARE_FEATURES,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6865) PQI_CONFIG_TABLE_SECTION_FIRMWARE_FEATURES);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6866) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6867)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6868) struct pqi_firmware_feature {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6869) char *feature_name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6870) unsigned int feature_bit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6871) bool supported;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6872) bool enabled;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6873) void (*feature_status)(struct pqi_ctrl_info *ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6874) struct pqi_firmware_feature *firmware_feature);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6875) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6876)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6877) static void pqi_firmware_feature_status(struct pqi_ctrl_info *ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6878) struct pqi_firmware_feature *firmware_feature)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6879) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6880) if (!firmware_feature->supported) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6881) dev_info(&ctrl_info->pci_dev->dev, "%s not supported by controller\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6882) firmware_feature->feature_name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6883) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6884) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6885)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6886) if (firmware_feature->enabled) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6887) dev_info(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6888) "%s enabled\n", firmware_feature->feature_name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6889) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6890) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6891)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6892) dev_err(&ctrl_info->pci_dev->dev, "failed to enable %s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6893) firmware_feature->feature_name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6894) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6895)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6896) static void pqi_ctrl_update_feature_flags(struct pqi_ctrl_info *ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6897) struct pqi_firmware_feature *firmware_feature)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6898) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6899) switch (firmware_feature->feature_bit) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6900) case PQI_FIRMWARE_FEATURE_SOFT_RESET_HANDSHAKE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6901) ctrl_info->soft_reset_handshake_supported =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6902) firmware_feature->enabled;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6903) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6904) case PQI_FIRMWARE_FEATURE_RAID_IU_TIMEOUT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6905) ctrl_info->raid_iu_timeout_supported =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6906) firmware_feature->enabled;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6907) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6908) case PQI_FIRMWARE_FEATURE_TMF_IU_TIMEOUT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6909) ctrl_info->tmf_iu_timeout_supported =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6910) firmware_feature->enabled;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6911) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6912) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6913)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6914) pqi_firmware_feature_status(ctrl_info, firmware_feature);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6915) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6916)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6917) static inline void pqi_firmware_feature_update(struct pqi_ctrl_info *ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6918) struct pqi_firmware_feature *firmware_feature)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6919) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6920) if (firmware_feature->feature_status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6921) firmware_feature->feature_status(ctrl_info, firmware_feature);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6922) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6923)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6924) static DEFINE_MUTEX(pqi_firmware_features_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6925)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6926) static struct pqi_firmware_feature pqi_firmware_features[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6927) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6928) .feature_name = "Online Firmware Activation",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6929) .feature_bit = PQI_FIRMWARE_FEATURE_OFA,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6930) .feature_status = pqi_firmware_feature_status,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6931) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6932) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6933) .feature_name = "Serial Management Protocol",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6934) .feature_bit = PQI_FIRMWARE_FEATURE_SMP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6935) .feature_status = pqi_firmware_feature_status,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6936) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6937) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6938) .feature_name = "New Soft Reset Handshake",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6939) .feature_bit = PQI_FIRMWARE_FEATURE_SOFT_RESET_HANDSHAKE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6940) .feature_status = pqi_ctrl_update_feature_flags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6941) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6942) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6943) .feature_name = "RAID IU Timeout",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6944) .feature_bit = PQI_FIRMWARE_FEATURE_RAID_IU_TIMEOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6945) .feature_status = pqi_ctrl_update_feature_flags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6946) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6947) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6948) .feature_name = "TMF IU Timeout",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6949) .feature_bit = PQI_FIRMWARE_FEATURE_TMF_IU_TIMEOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6950) .feature_status = pqi_ctrl_update_feature_flags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6951) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6952) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6953)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6954) static void pqi_process_firmware_features(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6955) struct pqi_config_table_section_info *section_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6956) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6957) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6958) struct pqi_ctrl_info *ctrl_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6959) struct pqi_config_table_firmware_features *firmware_features;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6960) void __iomem *firmware_features_iomem_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6961) unsigned int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6962) unsigned int num_features_supported;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6963)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6964) ctrl_info = section_info->ctrl_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6965) firmware_features = section_info->section;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6966) firmware_features_iomem_addr = section_info->section_iomem_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6967)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6968) for (i = 0, num_features_supported = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6969) i < ARRAY_SIZE(pqi_firmware_features); i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6970) if (pqi_is_firmware_feature_supported(firmware_features,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6971) pqi_firmware_features[i].feature_bit)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6972) pqi_firmware_features[i].supported = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6973) num_features_supported++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6974) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6975) pqi_firmware_feature_update(ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6976) &pqi_firmware_features[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6977) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6978) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6979)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6980) if (num_features_supported == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6981) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6982)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6983) for (i = 0; i < ARRAY_SIZE(pqi_firmware_features); i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6984) if (!pqi_firmware_features[i].supported)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6985) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6986) pqi_request_firmware_feature(firmware_features,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6987) pqi_firmware_features[i].feature_bit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6988) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6989)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6990) rc = pqi_enable_firmware_features(ctrl_info, firmware_features,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6991) firmware_features_iomem_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6992) if (rc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6993) dev_err(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6994) "failed to enable firmware features in PQI configuration table\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6995) for (i = 0; i < ARRAY_SIZE(pqi_firmware_features); i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6996) if (!pqi_firmware_features[i].supported)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6997) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6998) pqi_firmware_feature_update(ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6999) &pqi_firmware_features[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7000) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7001) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7002) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7003)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7004) for (i = 0; i < ARRAY_SIZE(pqi_firmware_features); i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7005) if (!pqi_firmware_features[i].supported)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7006) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7007) if (pqi_is_firmware_feature_enabled(firmware_features,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7008) firmware_features_iomem_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7009) pqi_firmware_features[i].feature_bit)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7010) pqi_firmware_features[i].enabled = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7011) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7012) pqi_firmware_feature_update(ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7013) &pqi_firmware_features[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7014) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7015) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7016)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7017) static void pqi_init_firmware_features(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7018) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7019) unsigned int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7020)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7021) for (i = 0; i < ARRAY_SIZE(pqi_firmware_features); i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7022) pqi_firmware_features[i].supported = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7023) pqi_firmware_features[i].enabled = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7024) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7025) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7026)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7027) static void pqi_process_firmware_features_section(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7028) struct pqi_config_table_section_info *section_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7029) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7030) mutex_lock(&pqi_firmware_features_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7031) pqi_init_firmware_features();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7032) pqi_process_firmware_features(section_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7033) mutex_unlock(&pqi_firmware_features_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7034) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7035)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7036) static int pqi_process_config_table(struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7037) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7038) u32 table_length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7039) u32 section_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7040) void __iomem *table_iomem_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7041) struct pqi_config_table *config_table;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7042) struct pqi_config_table_section_header *section;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7043) struct pqi_config_table_section_info section_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7044)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7045) table_length = ctrl_info->config_table_length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7046) if (table_length == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7047) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7048)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7049) config_table = kmalloc(table_length, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7050) if (!config_table) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7051) dev_err(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7052) "failed to allocate memory for PQI configuration table\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7053) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7054) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7055)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7056) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7057) * Copy the config table contents from I/O memory space into the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7058) * temporary buffer.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7059) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7060) table_iomem_addr = ctrl_info->iomem_base +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7061) ctrl_info->config_table_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7062) memcpy_fromio(config_table, table_iomem_addr, table_length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7063)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7064) section_info.ctrl_info = ctrl_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7065) section_offset =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7066) get_unaligned_le32(&config_table->first_section_offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7067)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7068) while (section_offset) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7069) section = (void *)config_table + section_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7070)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7071) section_info.section = section;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7072) section_info.section_offset = section_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7073) section_info.section_iomem_addr =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7074) table_iomem_addr + section_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7075)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7076) switch (get_unaligned_le16(§ion->section_id)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7077) case PQI_CONFIG_TABLE_SECTION_FIRMWARE_FEATURES:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7078) pqi_process_firmware_features_section(§ion_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7079) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7080) case PQI_CONFIG_TABLE_SECTION_HEARTBEAT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7081) if (pqi_disable_heartbeat)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7082) dev_warn(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7083) "heartbeat disabled by module parameter\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7084) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7085) ctrl_info->heartbeat_counter =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7086) table_iomem_addr +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7087) section_offset +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7088) offsetof(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7089) struct pqi_config_table_heartbeat,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7090) heartbeat_counter);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7091) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7092) case PQI_CONFIG_TABLE_SECTION_SOFT_RESET:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7093) ctrl_info->soft_reset_status =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7094) table_iomem_addr +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7095) section_offset +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7096) offsetof(struct pqi_config_table_soft_reset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7097) soft_reset_status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7098) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7099) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7101) section_offset =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7102) get_unaligned_le16(§ion->next_section_offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7103) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7104)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7105) kfree(config_table);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7106)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7107) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7108) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7109)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7110) /* Switches the controller from PQI mode back into SIS mode. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7111)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7112) static int pqi_revert_to_sis_mode(struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7113) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7114) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7115)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7116) pqi_change_irq_mode(ctrl_info, IRQ_MODE_NONE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7117) rc = pqi_reset(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7118) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7119) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7120) rc = sis_reenable_sis_mode(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7121) if (rc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7122) dev_err(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7123) "re-enabling SIS mode failed with error %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7124) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7125) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7126) pqi_save_ctrl_mode(ctrl_info, SIS_MODE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7127)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7128) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7129) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7130)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7131) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7132) * If the controller isn't already in SIS mode, this function forces it into
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7133) * SIS mode.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7134) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7135)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7136) static int pqi_force_sis_mode(struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7137) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7138) if (!sis_is_firmware_running(ctrl_info))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7139) return -ENXIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7140)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7141) if (pqi_get_ctrl_mode(ctrl_info) == SIS_MODE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7142) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7143)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7144) if (sis_is_kernel_up(ctrl_info)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7145) pqi_save_ctrl_mode(ctrl_info, SIS_MODE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7146) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7147) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7148)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7149) return pqi_revert_to_sis_mode(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7150) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7151)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7152) #define PQI_POST_RESET_DELAY_B4_MSGU_READY 5000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7153)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7154) static int pqi_ctrl_init(struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7155) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7156) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7157)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7158) if (reset_devices) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7159) sis_soft_reset(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7160) msleep(PQI_POST_RESET_DELAY_B4_MSGU_READY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7161) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7162) rc = pqi_force_sis_mode(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7163) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7164) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7165) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7166)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7167) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7168) * Wait until the controller is ready to start accepting SIS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7169) * commands.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7170) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7171) rc = sis_wait_for_ctrl_ready(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7172) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7173) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7174)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7175) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7176) * Get the controller properties. This allows us to determine
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7177) * whether or not it supports PQI mode.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7178) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7179) rc = sis_get_ctrl_properties(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7180) if (rc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7181) dev_err(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7182) "error obtaining controller properties\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7183) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7184) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7185)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7186) rc = sis_get_pqi_capabilities(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7187) if (rc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7188) dev_err(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7189) "error obtaining controller capabilities\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7190) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7191) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7192)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7193) if (reset_devices) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7194) if (ctrl_info->max_outstanding_requests >
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7195) PQI_MAX_OUTSTANDING_REQUESTS_KDUMP)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7196) ctrl_info->max_outstanding_requests =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7197) PQI_MAX_OUTSTANDING_REQUESTS_KDUMP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7198) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7199) if (ctrl_info->max_outstanding_requests >
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7200) PQI_MAX_OUTSTANDING_REQUESTS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7201) ctrl_info->max_outstanding_requests =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7202) PQI_MAX_OUTSTANDING_REQUESTS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7203) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7204)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7205) pqi_calculate_io_resources(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7206)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7207) rc = pqi_alloc_error_buffer(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7208) if (rc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7209) dev_err(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7210) "failed to allocate PQI error buffer\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7211) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7212) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7213)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7214) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7215) * If the function we are about to call succeeds, the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7216) * controller will transition from legacy SIS mode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7217) * into PQI mode.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7218) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7219) rc = sis_init_base_struct_addr(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7220) if (rc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7221) dev_err(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7222) "error initializing PQI mode\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7223) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7224) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7225)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7226) /* Wait for the controller to complete the SIS -> PQI transition. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7227) rc = pqi_wait_for_pqi_mode_ready(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7228) if (rc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7229) dev_err(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7230) "transition to PQI mode failed\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7231) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7232) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7233)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7234) /* From here on, we are running in PQI mode. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7235) ctrl_info->pqi_mode_enabled = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7236) pqi_save_ctrl_mode(ctrl_info, PQI_MODE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7237)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7238) rc = pqi_alloc_admin_queues(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7239) if (rc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7240) dev_err(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7241) "failed to allocate admin queues\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7242) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7243) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7244)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7245) rc = pqi_create_admin_queues(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7246) if (rc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7247) dev_err(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7248) "error creating admin queues\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7249) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7250) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7251)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7252) rc = pqi_report_device_capability(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7253) if (rc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7254) dev_err(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7255) "obtaining device capability failed\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7256) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7257) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7258)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7259) rc = pqi_validate_device_capability(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7260) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7261) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7262)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7263) pqi_calculate_queue_resources(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7264)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7265) rc = pqi_enable_msix_interrupts(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7266) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7267) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7268)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7269) if (ctrl_info->num_msix_vectors_enabled < ctrl_info->num_queue_groups) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7270) ctrl_info->max_msix_vectors =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7271) ctrl_info->num_msix_vectors_enabled;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7272) pqi_calculate_queue_resources(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7273) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7274)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7275) rc = pqi_alloc_io_resources(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7276) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7277) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7278)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7279) rc = pqi_alloc_operational_queues(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7280) if (rc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7281) dev_err(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7282) "failed to allocate operational queues\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7283) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7284) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7285)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7286) pqi_init_operational_queues(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7287)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7288) rc = pqi_request_irqs(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7289) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7290) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7291)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7292) rc = pqi_create_queues(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7293) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7294) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7295)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7296) pqi_change_irq_mode(ctrl_info, IRQ_MODE_MSIX);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7297)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7298) ctrl_info->controller_online = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7299)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7300) rc = pqi_process_config_table(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7301) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7302) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7303)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7304) pqi_start_heartbeat_timer(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7305)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7306) rc = pqi_enable_events(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7307) if (rc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7308) dev_err(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7309) "error enabling events\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7310) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7311) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7312)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7313) /* Register with the SCSI subsystem. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7314) rc = pqi_register_scsi(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7315) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7316) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7317)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7318) rc = pqi_get_ctrl_product_details(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7319) if (rc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7320) dev_err(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7321) "error obtaining product details\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7322) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7323) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7324)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7325) rc = pqi_get_ctrl_serial_number(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7326) if (rc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7327) dev_err(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7328) "error obtaining ctrl serial number\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7329) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7330) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7331)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7332) rc = pqi_set_diag_rescan(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7333) if (rc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7334) dev_err(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7335) "error enabling multi-lun rescan\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7336) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7337) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7338)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7339) rc = pqi_write_driver_version_to_host_wellness(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7340) if (rc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7341) dev_err(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7342) "error updating host wellness\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7343) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7344) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7345)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7346) pqi_schedule_update_time_worker(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7347)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7348) pqi_scan_scsi_devices(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7349)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7350) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7351) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7352)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7353) static void pqi_reinit_queues(struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7354) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7355) unsigned int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7356) struct pqi_admin_queues *admin_queues;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7357) struct pqi_event_queue *event_queue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7358)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7359) admin_queues = &ctrl_info->admin_queues;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7360) admin_queues->iq_pi_copy = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7361) admin_queues->oq_ci_copy = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7362) writel(0, admin_queues->oq_pi);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7363)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7364) for (i = 0; i < ctrl_info->num_queue_groups; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7365) ctrl_info->queue_groups[i].iq_pi_copy[RAID_PATH] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7366) ctrl_info->queue_groups[i].iq_pi_copy[AIO_PATH] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7367) ctrl_info->queue_groups[i].oq_ci_copy = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7368)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7369) writel(0, ctrl_info->queue_groups[i].iq_ci[RAID_PATH]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7370) writel(0, ctrl_info->queue_groups[i].iq_ci[AIO_PATH]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7371) writel(0, ctrl_info->queue_groups[i].oq_pi);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7372) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7373)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7374) event_queue = &ctrl_info->event_queue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7375) writel(0, event_queue->oq_pi);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7376) event_queue->oq_ci_copy = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7377) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7378)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7379) static int pqi_ctrl_init_resume(struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7380) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7381) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7382)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7383) rc = pqi_force_sis_mode(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7384) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7385) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7386)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7387) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7388) * Wait until the controller is ready to start accepting SIS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7389) * commands.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7390) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7391) rc = sis_wait_for_ctrl_ready_resume(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7392) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7393) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7394)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7395) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7396) * Get the controller properties. This allows us to determine
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7397) * whether or not it supports PQI mode.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7398) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7399) rc = sis_get_ctrl_properties(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7400) if (rc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7401) dev_err(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7402) "error obtaining controller properties\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7403) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7404) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7405)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7406) rc = sis_get_pqi_capabilities(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7407) if (rc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7408) dev_err(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7409) "error obtaining controller capabilities\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7410) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7411) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7412)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7413) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7414) * If the function we are about to call succeeds, the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7415) * controller will transition from legacy SIS mode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7416) * into PQI mode.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7417) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7418) rc = sis_init_base_struct_addr(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7419) if (rc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7420) dev_err(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7421) "error initializing PQI mode\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7422) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7423) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7424)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7425) /* Wait for the controller to complete the SIS -> PQI transition. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7426) rc = pqi_wait_for_pqi_mode_ready(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7427) if (rc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7428) dev_err(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7429) "transition to PQI mode failed\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7430) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7431) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7432)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7433) /* From here on, we are running in PQI mode. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7434) ctrl_info->pqi_mode_enabled = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7435) pqi_save_ctrl_mode(ctrl_info, PQI_MODE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7436)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7437) pqi_reinit_queues(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7438)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7439) rc = pqi_create_admin_queues(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7440) if (rc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7441) dev_err(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7442) "error creating admin queues\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7443) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7444) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7445)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7446) rc = pqi_create_queues(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7447) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7448) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7449)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7450) pqi_change_irq_mode(ctrl_info, IRQ_MODE_MSIX);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7451)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7452) ctrl_info->controller_online = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7453) pqi_ctrl_unblock_requests(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7454)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7455) rc = pqi_process_config_table(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7456) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7457) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7458)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7459) pqi_start_heartbeat_timer(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7460)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7461) rc = pqi_enable_events(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7462) if (rc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7463) dev_err(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7464) "error enabling events\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7465) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7466) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7467)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7468) rc = pqi_get_ctrl_product_details(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7469) if (rc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7470) dev_err(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7471) "error obtaining product details\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7472) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7473) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7474)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7475) rc = pqi_set_diag_rescan(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7476) if (rc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7477) dev_err(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7478) "error enabling multi-lun rescan\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7479) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7480) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7481)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7482) rc = pqi_write_driver_version_to_host_wellness(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7483) if (rc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7484) dev_err(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7485) "error updating host wellness\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7486) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7487) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7488)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7489) pqi_schedule_update_time_worker(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7490)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7491) pqi_scan_scsi_devices(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7492)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7493) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7494) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7495)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7496) static inline int pqi_set_pcie_completion_timeout(struct pci_dev *pci_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7497) u16 timeout)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7498) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7499) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7500)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7501) rc = pcie_capability_clear_and_set_word(pci_dev, PCI_EXP_DEVCTL2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7502) PCI_EXP_DEVCTL2_COMP_TIMEOUT, timeout);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7503)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7504) return pcibios_err_to_errno(rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7505) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7506)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7507) static int pqi_pci_init(struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7508) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7509) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7510) u64 mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7511)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7512) rc = pci_enable_device(ctrl_info->pci_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7513) if (rc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7514) dev_err(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7515) "failed to enable PCI device\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7516) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7517) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7518)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7519) if (sizeof(dma_addr_t) > 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7520) mask = DMA_BIT_MASK(64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7521) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7522) mask = DMA_BIT_MASK(32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7523)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7524) rc = dma_set_mask_and_coherent(&ctrl_info->pci_dev->dev, mask);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7525) if (rc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7526) dev_err(&ctrl_info->pci_dev->dev, "failed to set DMA mask\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7527) goto disable_device;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7528) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7529)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7530) rc = pci_request_regions(ctrl_info->pci_dev, DRIVER_NAME_SHORT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7531) if (rc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7532) dev_err(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7533) "failed to obtain PCI resources\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7534) goto disable_device;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7535) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7536)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7537) ctrl_info->iomem_base = ioremap(pci_resource_start(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7538) ctrl_info->pci_dev, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7539) sizeof(struct pqi_ctrl_registers));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7540) if (!ctrl_info->iomem_base) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7541) dev_err(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7542) "failed to map memory for controller registers\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7543) rc = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7544) goto release_regions;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7545) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7546)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7547) #define PCI_EXP_COMP_TIMEOUT_65_TO_210_MS 0x6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7548)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7549) /* Increase the PCIe completion timeout. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7550) rc = pqi_set_pcie_completion_timeout(ctrl_info->pci_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7551) PCI_EXP_COMP_TIMEOUT_65_TO_210_MS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7552) if (rc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7553) dev_err(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7554) "failed to set PCIe completion timeout\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7555) goto release_regions;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7556) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7557)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7558) /* Enable bus mastering. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7559) pci_set_master(ctrl_info->pci_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7560)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7561) ctrl_info->registers = ctrl_info->iomem_base;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7562) ctrl_info->pqi_registers = &ctrl_info->registers->pqi_registers;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7563)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7564) pci_set_drvdata(ctrl_info->pci_dev, ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7565)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7566) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7567)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7568) release_regions:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7569) pci_release_regions(ctrl_info->pci_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7570) disable_device:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7571) pci_disable_device(ctrl_info->pci_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7572)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7573) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7574) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7575)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7576) static void pqi_cleanup_pci_init(struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7577) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7578) iounmap(ctrl_info->iomem_base);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7579) pci_release_regions(ctrl_info->pci_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7580) if (pci_is_enabled(ctrl_info->pci_dev))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7581) pci_disable_device(ctrl_info->pci_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7582) pci_set_drvdata(ctrl_info->pci_dev, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7583) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7584)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7585) static struct pqi_ctrl_info *pqi_alloc_ctrl_info(int numa_node)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7586) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7587) struct pqi_ctrl_info *ctrl_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7588)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7589) ctrl_info = kzalloc_node(sizeof(struct pqi_ctrl_info),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7590) GFP_KERNEL, numa_node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7591) if (!ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7592) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7593)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7594) mutex_init(&ctrl_info->scan_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7595) mutex_init(&ctrl_info->lun_reset_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7596) mutex_init(&ctrl_info->ofa_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7597)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7598) INIT_LIST_HEAD(&ctrl_info->scsi_device_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7599) spin_lock_init(&ctrl_info->scsi_device_list_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7600)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7601) INIT_WORK(&ctrl_info->event_work, pqi_event_worker);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7602) atomic_set(&ctrl_info->num_interrupts, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7603) atomic_set(&ctrl_info->sync_cmds_outstanding, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7604)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7605) INIT_DELAYED_WORK(&ctrl_info->rescan_work, pqi_rescan_worker);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7606) INIT_DELAYED_WORK(&ctrl_info->update_time_work, pqi_update_time_worker);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7607)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7608) timer_setup(&ctrl_info->heartbeat_timer, pqi_heartbeat_timer_handler, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7609) INIT_WORK(&ctrl_info->ctrl_offline_work, pqi_ctrl_offline_worker);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7610)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7611) sema_init(&ctrl_info->sync_request_sem,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7612) PQI_RESERVED_IO_SLOTS_SYNCHRONOUS_REQUESTS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7613) init_waitqueue_head(&ctrl_info->block_requests_wait);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7614)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7615) INIT_LIST_HEAD(&ctrl_info->raid_bypass_retry_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7616) spin_lock_init(&ctrl_info->raid_bypass_retry_list_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7617) INIT_WORK(&ctrl_info->raid_bypass_retry_work,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7618) pqi_raid_bypass_retry_worker);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7619)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7620) ctrl_info->ctrl_id = atomic_inc_return(&pqi_controller_count) - 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7621) ctrl_info->irq_mode = IRQ_MODE_NONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7622) ctrl_info->max_msix_vectors = PQI_MAX_MSIX_VECTORS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7623)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7624) return ctrl_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7625) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7626)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7627) static inline void pqi_free_ctrl_info(struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7628) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7629) kfree(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7630) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7631)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7632) static void pqi_free_interrupts(struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7633) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7634) pqi_free_irqs(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7635) pqi_disable_msix_interrupts(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7636) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7637)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7638) static void pqi_free_ctrl_resources(struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7639) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7640) pqi_stop_heartbeat_timer(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7641) pqi_free_interrupts(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7642) if (ctrl_info->queue_memory_base)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7643) dma_free_coherent(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7644) ctrl_info->queue_memory_length,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7645) ctrl_info->queue_memory_base,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7646) ctrl_info->queue_memory_base_dma_handle);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7647) if (ctrl_info->admin_queue_memory_base)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7648) dma_free_coherent(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7649) ctrl_info->admin_queue_memory_length,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7650) ctrl_info->admin_queue_memory_base,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7651) ctrl_info->admin_queue_memory_base_dma_handle);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7652) pqi_free_all_io_requests(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7653) if (ctrl_info->error_buffer)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7654) dma_free_coherent(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7655) ctrl_info->error_buffer_length,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7656) ctrl_info->error_buffer,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7657) ctrl_info->error_buffer_dma_handle);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7658) if (ctrl_info->iomem_base)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7659) pqi_cleanup_pci_init(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7660) pqi_free_ctrl_info(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7661) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7662)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7663) static void pqi_remove_ctrl(struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7664) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7665) pqi_cancel_rescan_worker(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7666) pqi_cancel_update_time_worker(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7667) pqi_unregister_scsi(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7668) if (ctrl_info->pqi_mode_enabled)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7669) pqi_revert_to_sis_mode(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7670) pqi_free_ctrl_resources(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7671) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7672)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7673) static void pqi_ofa_ctrl_quiesce(struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7674) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7675) pqi_cancel_update_time_worker(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7676) pqi_cancel_rescan_worker(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7677) pqi_wait_until_lun_reset_finished(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7678) pqi_wait_until_scan_finished(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7679) pqi_ctrl_ofa_start(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7680) pqi_ctrl_block_requests(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7681) pqi_ctrl_wait_until_quiesced(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7682) pqi_ctrl_wait_for_pending_io(ctrl_info, PQI_PENDING_IO_TIMEOUT_SECS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7683) pqi_fail_io_queued_for_all_devices(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7684) pqi_wait_until_inbound_queues_empty(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7685) pqi_stop_heartbeat_timer(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7686) ctrl_info->pqi_mode_enabled = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7687) pqi_save_ctrl_mode(ctrl_info, SIS_MODE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7688) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7689)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7690) static void pqi_ofa_ctrl_unquiesce(struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7691) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7692) pqi_ofa_free_host_buffer(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7693) ctrl_info->pqi_mode_enabled = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7694) pqi_save_ctrl_mode(ctrl_info, PQI_MODE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7695) ctrl_info->controller_online = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7696) pqi_ctrl_unblock_requests(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7697) pqi_start_heartbeat_timer(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7698) pqi_schedule_update_time_worker(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7699) pqi_clear_soft_reset_status(ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7700) PQI_SOFT_RESET_ABORT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7701) pqi_scan_scsi_devices(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7702) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7703)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7704) static int pqi_ofa_alloc_mem(struct pqi_ctrl_info *ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7705) u32 total_size, u32 chunk_size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7706) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7707) u32 sg_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7708) u32 size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7709) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7710) struct pqi_sg_descriptor *mem_descriptor = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7711) struct device *dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7712) struct pqi_ofa_memory *ofap;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7713)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7714) dev = &ctrl_info->pci_dev->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7715)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7716) sg_count = (total_size + chunk_size - 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7717) sg_count /= chunk_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7718)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7719) ofap = ctrl_info->pqi_ofa_mem_virt_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7720)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7721) if (sg_count*chunk_size < total_size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7722) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7723)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7724) ctrl_info->pqi_ofa_chunk_virt_addr =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7725) kcalloc(sg_count, sizeof(void *), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7726) if (!ctrl_info->pqi_ofa_chunk_virt_addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7727) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7728)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7729) for (size = 0, i = 0; size < total_size; size += chunk_size, i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7730) dma_addr_t dma_handle;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7731)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7732) ctrl_info->pqi_ofa_chunk_virt_addr[i] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7733) dma_alloc_coherent(dev, chunk_size, &dma_handle,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7734) GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7735)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7736) if (!ctrl_info->pqi_ofa_chunk_virt_addr[i])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7737) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7738)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7739) mem_descriptor = &ofap->sg_descriptor[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7740) put_unaligned_le64 ((u64) dma_handle, &mem_descriptor->address);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7741) put_unaligned_le32 (chunk_size, &mem_descriptor->length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7742) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7743)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7744) if (!size || size < total_size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7745) goto out_free_chunks;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7746)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7747) put_unaligned_le32(CISS_SG_LAST, &mem_descriptor->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7748) put_unaligned_le16(sg_count, &ofap->num_memory_descriptors);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7749) put_unaligned_le32(size, &ofap->bytes_allocated);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7750)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7751) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7752)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7753) out_free_chunks:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7754) while (--i >= 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7755) mem_descriptor = &ofap->sg_descriptor[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7756) dma_free_coherent(dev, chunk_size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7757) ctrl_info->pqi_ofa_chunk_virt_addr[i],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7758) get_unaligned_le64(&mem_descriptor->address));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7759) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7760) kfree(ctrl_info->pqi_ofa_chunk_virt_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7761)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7762) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7763) put_unaligned_le32 (0, &ofap->bytes_allocated);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7764) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7765) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7766)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7767) static int pqi_ofa_alloc_host_buffer(struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7768) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7769) u32 total_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7770) u32 min_chunk_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7771) u32 chunk_sz;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7772)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7773) total_size = le32_to_cpu(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7774) ctrl_info->pqi_ofa_mem_virt_addr->bytes_allocated);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7775) min_chunk_size = total_size / PQI_OFA_MAX_SG_DESCRIPTORS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7776)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7777) for (chunk_sz = total_size; chunk_sz >= min_chunk_size; chunk_sz /= 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7778) if (!pqi_ofa_alloc_mem(ctrl_info, total_size, chunk_sz))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7779) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7780)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7781) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7782) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7783)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7784) static void pqi_ofa_setup_host_buffer(struct pqi_ctrl_info *ctrl_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7785) u32 bytes_requested)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7786) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7787) struct pqi_ofa_memory *pqi_ofa_memory;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7788) struct device *dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7789)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7790) dev = &ctrl_info->pci_dev->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7791) pqi_ofa_memory = dma_alloc_coherent(dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7792) PQI_OFA_MEMORY_DESCRIPTOR_LENGTH,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7793) &ctrl_info->pqi_ofa_mem_dma_handle,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7794) GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7795)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7796) if (!pqi_ofa_memory)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7797) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7798)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7799) put_unaligned_le16(PQI_OFA_VERSION, &pqi_ofa_memory->version);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7800) memcpy(&pqi_ofa_memory->signature, PQI_OFA_SIGNATURE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7801) sizeof(pqi_ofa_memory->signature));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7802) pqi_ofa_memory->bytes_allocated = cpu_to_le32(bytes_requested);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7803)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7804) ctrl_info->pqi_ofa_mem_virt_addr = pqi_ofa_memory;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7805)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7806) if (pqi_ofa_alloc_host_buffer(ctrl_info) < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7807) dev_err(dev, "Failed to allocate host buffer of size = %u",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7808) bytes_requested);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7809) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7810)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7811) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7812) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7813)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7814) static void pqi_ofa_free_host_buffer(struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7815) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7816) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7817) struct pqi_sg_descriptor *mem_descriptor;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7818) struct pqi_ofa_memory *ofap;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7819)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7820) ofap = ctrl_info->pqi_ofa_mem_virt_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7821)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7822) if (!ofap)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7823) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7824)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7825) if (!ofap->bytes_allocated)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7826) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7827)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7828) mem_descriptor = ofap->sg_descriptor;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7829)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7830) for (i = 0; i < get_unaligned_le16(&ofap->num_memory_descriptors);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7831) i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7832) dma_free_coherent(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7833) get_unaligned_le32(&mem_descriptor[i].length),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7834) ctrl_info->pqi_ofa_chunk_virt_addr[i],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7835) get_unaligned_le64(&mem_descriptor[i].address));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7836) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7837) kfree(ctrl_info->pqi_ofa_chunk_virt_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7838)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7839) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7840) dma_free_coherent(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7841) PQI_OFA_MEMORY_DESCRIPTOR_LENGTH, ofap,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7842) ctrl_info->pqi_ofa_mem_dma_handle);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7843) ctrl_info->pqi_ofa_mem_virt_addr = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7844) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7845)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7846) static int pqi_ofa_host_memory_update(struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7847) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7848) struct pqi_vendor_general_request request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7849) size_t size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7850) struct pqi_ofa_memory *ofap;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7851)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7852) memset(&request, 0, sizeof(request));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7853)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7854) ofap = ctrl_info->pqi_ofa_mem_virt_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7855)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7856) request.header.iu_type = PQI_REQUEST_IU_VENDOR_GENERAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7857) put_unaligned_le16(sizeof(request) - PQI_REQUEST_HEADER_LENGTH,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7858) &request.header.iu_length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7859) put_unaligned_le16(PQI_VENDOR_GENERAL_HOST_MEMORY_UPDATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7860) &request.function_code);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7861)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7862) if (ofap) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7863) size = offsetof(struct pqi_ofa_memory, sg_descriptor) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7864) get_unaligned_le16(&ofap->num_memory_descriptors) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7865) sizeof(struct pqi_sg_descriptor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7866)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7867) put_unaligned_le64((u64)ctrl_info->pqi_ofa_mem_dma_handle,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7868) &request.data.ofa_memory_allocation.buffer_address);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7869) put_unaligned_le32(size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7870) &request.data.ofa_memory_allocation.buffer_length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7871)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7872) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7873)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7874) return pqi_submit_raid_request_synchronous(ctrl_info, &request.header,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7875) 0, NULL, NO_TIMEOUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7876) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7877)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7878) static int pqi_ofa_ctrl_restart(struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7879) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7880) msleep(PQI_POST_RESET_DELAY_B4_MSGU_READY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7881) return pqi_ctrl_init_resume(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7882) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7883)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7884) static void pqi_perform_lockup_action(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7885) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7886) switch (pqi_lockup_action) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7887) case PANIC:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7888) panic("FATAL: Smart Family Controller lockup detected");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7889) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7890) case REBOOT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7891) emergency_restart();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7892) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7893) case NONE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7894) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7895) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7896) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7897) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7898)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7899) static struct pqi_raid_error_info pqi_ctrl_offline_raid_error_info = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7900) .data_out_result = PQI_DATA_IN_OUT_HARDWARE_ERROR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7901) .status = SAM_STAT_CHECK_CONDITION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7902) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7903)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7904) static void pqi_fail_all_outstanding_requests(struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7905) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7906) unsigned int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7907) struct pqi_io_request *io_request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7908) struct scsi_cmnd *scmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7909)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7910) for (i = 0; i < ctrl_info->max_io_slots; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7911) io_request = &ctrl_info->io_request_pool[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7912) if (atomic_read(&io_request->refcount) == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7913) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7914)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7915) scmd = io_request->scmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7916) if (scmd) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7917) set_host_byte(scmd, DID_NO_CONNECT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7918) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7919) io_request->status = -ENXIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7920) io_request->error_info =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7921) &pqi_ctrl_offline_raid_error_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7922) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7923)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7924) io_request->io_complete_callback(io_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7925) io_request->context);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7926) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7927) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7928)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7929) static void pqi_take_ctrl_offline_deferred(struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7930) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7931) pqi_perform_lockup_action();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7932) pqi_stop_heartbeat_timer(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7933) pqi_free_interrupts(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7934) pqi_cancel_rescan_worker(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7935) pqi_cancel_update_time_worker(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7936) pqi_ctrl_wait_until_quiesced(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7937) pqi_fail_all_outstanding_requests(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7938) pqi_clear_all_queued_raid_bypass_retries(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7939) pqi_ctrl_unblock_requests(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7940) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7941)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7942) static void pqi_ctrl_offline_worker(struct work_struct *work)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7943) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7944) struct pqi_ctrl_info *ctrl_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7945)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7946) ctrl_info = container_of(work, struct pqi_ctrl_info, ctrl_offline_work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7947) pqi_take_ctrl_offline_deferred(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7948) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7949)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7950) static void pqi_take_ctrl_offline(struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7951) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7952) if (!ctrl_info->controller_online)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7953) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7954)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7955) ctrl_info->controller_online = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7956) ctrl_info->pqi_mode_enabled = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7957) pqi_ctrl_block_requests(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7958) if (!pqi_disable_ctrl_shutdown)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7959) sis_shutdown_ctrl(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7960) pci_disable_device(ctrl_info->pci_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7961) dev_err(&ctrl_info->pci_dev->dev, "controller offline\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7962) schedule_work(&ctrl_info->ctrl_offline_work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7963) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7964)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7965) static void pqi_print_ctrl_info(struct pci_dev *pci_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7966) const struct pci_device_id *id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7967) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7968) char *ctrl_description;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7969)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7970) if (id->driver_data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7971) ctrl_description = (char *)id->driver_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7972) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7973) ctrl_description = "Microsemi Smart Family Controller";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7974)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7975) dev_info(&pci_dev->dev, "%s found\n", ctrl_description);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7976) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7977)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7978) static int pqi_pci_probe(struct pci_dev *pci_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7979) const struct pci_device_id *id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7980) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7981) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7982) int node, cp_node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7983) struct pqi_ctrl_info *ctrl_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7984)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7985) pqi_print_ctrl_info(pci_dev, id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7986)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7987) if (pqi_disable_device_id_wildcards &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7988) id->subvendor == PCI_ANY_ID &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7989) id->subdevice == PCI_ANY_ID) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7990) dev_warn(&pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7991) "controller not probed because device ID wildcards are disabled\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7992) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7993) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7994)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7995) if (id->subvendor == PCI_ANY_ID || id->subdevice == PCI_ANY_ID)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7996) dev_warn(&pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7997) "controller device ID matched using wildcards\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7998)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7999) node = dev_to_node(&pci_dev->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8000) if (node == NUMA_NO_NODE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8001) cp_node = cpu_to_node(0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8002) if (cp_node == NUMA_NO_NODE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8003) cp_node = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8004) set_dev_node(&pci_dev->dev, cp_node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8005) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8006)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8007) ctrl_info = pqi_alloc_ctrl_info(node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8008) if (!ctrl_info) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8009) dev_err(&pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8010) "failed to allocate controller info block\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8011) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8012) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8013)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8014) ctrl_info->pci_dev = pci_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8015)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8016) rc = pqi_pci_init(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8017) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8018) goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8019)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8020) rc = pqi_ctrl_init(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8021) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8022) goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8023)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8024) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8025)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8026) error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8027) pqi_remove_ctrl(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8028)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8029) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8030) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8031)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8032) static void pqi_pci_remove(struct pci_dev *pci_dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8033) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8034) struct pqi_ctrl_info *ctrl_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8035)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8036) ctrl_info = pci_get_drvdata(pci_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8037) if (!ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8038) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8039)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8040) ctrl_info->in_shutdown = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8041)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8042) pqi_remove_ctrl(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8043) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8044)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8045) static void pqi_crash_if_pending_command(struct pqi_ctrl_info *ctrl_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8046) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8047) unsigned int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8048) struct pqi_io_request *io_request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8049) struct scsi_cmnd *scmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8050)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8051) for (i = 0; i < ctrl_info->max_io_slots; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8052) io_request = &ctrl_info->io_request_pool[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8053) if (atomic_read(&io_request->refcount) == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8054) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8055) scmd = io_request->scmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8056) WARN_ON(scmd != NULL); /* IO command from SML */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8057) WARN_ON(scmd == NULL); /* Non-IO cmd or driver initiated*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8058) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8059) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8060)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8061) static void pqi_shutdown(struct pci_dev *pci_dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8062) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8063) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8064) struct pqi_ctrl_info *ctrl_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8065)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8066) ctrl_info = pci_get_drvdata(pci_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8067) if (!ctrl_info) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8068) dev_err(&pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8069) "cache could not be flushed\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8070) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8071) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8072)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8073) pqi_disable_events(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8074) pqi_wait_until_ofa_finished(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8075) pqi_cancel_update_time_worker(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8076) pqi_cancel_rescan_worker(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8077) pqi_cancel_event_worker(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8078)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8079) pqi_ctrl_shutdown_start(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8080) pqi_ctrl_wait_until_quiesced(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8081)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8082) rc = pqi_ctrl_wait_for_pending_io(ctrl_info, NO_TIMEOUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8083) if (rc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8084) dev_err(&pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8085) "wait for pending I/O failed\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8086) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8087) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8088)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8089) pqi_ctrl_block_device_reset(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8090) pqi_wait_until_lun_reset_finished(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8091)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8092) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8093) * Write all data in the controller's battery-backed cache to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8094) * storage.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8095) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8096) rc = pqi_flush_cache(ctrl_info, SHUTDOWN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8097) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8098) dev_err(&pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8099) "unable to flush controller cache\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8101) pqi_ctrl_block_requests(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8102)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8103) rc = pqi_ctrl_wait_for_pending_sync_cmds(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8104) if (rc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8105) dev_err(&pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8106) "wait for pending sync cmds failed\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8107) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8108) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8109)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8110) pqi_crash_if_pending_command(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8111) pqi_reset(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8112) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8113)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8114) static void pqi_process_lockup_action_param(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8115) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8116) unsigned int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8117)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8118) if (!pqi_lockup_action_param)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8119) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8120)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8121) for (i = 0; i < ARRAY_SIZE(pqi_lockup_actions); i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8122) if (strcmp(pqi_lockup_action_param,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8123) pqi_lockup_actions[i].name) == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8124) pqi_lockup_action = pqi_lockup_actions[i].action;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8125) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8126) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8127) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8128)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8129) pr_warn("%s: invalid lockup action setting \"%s\" - supported settings: none, reboot, panic\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8130) DRIVER_NAME_SHORT, pqi_lockup_action_param);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8131) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8132)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8133) static void pqi_process_module_params(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8134) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8135) pqi_process_lockup_action_param();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8136) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8137)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8138) static __maybe_unused int pqi_suspend(struct pci_dev *pci_dev, pm_message_t state)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8139) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8140) struct pqi_ctrl_info *ctrl_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8141)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8142) ctrl_info = pci_get_drvdata(pci_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8143)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8144) pqi_disable_events(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8145) pqi_cancel_update_time_worker(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8146) pqi_cancel_rescan_worker(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8147) pqi_wait_until_scan_finished(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8148) pqi_wait_until_lun_reset_finished(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8149) pqi_wait_until_ofa_finished(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8150) pqi_flush_cache(ctrl_info, SUSPEND);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8151) pqi_ctrl_block_requests(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8152) pqi_ctrl_wait_until_quiesced(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8153) pqi_wait_until_inbound_queues_empty(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8154) pqi_ctrl_wait_for_pending_io(ctrl_info, NO_TIMEOUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8155) pqi_stop_heartbeat_timer(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8156)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8157) if (state.event == PM_EVENT_FREEZE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8158) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8159)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8160) pci_save_state(pci_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8161) pci_set_power_state(pci_dev, pci_choose_state(pci_dev, state));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8162)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8163) ctrl_info->controller_online = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8164) ctrl_info->pqi_mode_enabled = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8165)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8166) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8167) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8168)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8169) static __maybe_unused int pqi_resume(struct pci_dev *pci_dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8170) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8171) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8172) struct pqi_ctrl_info *ctrl_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8173)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8174) ctrl_info = pci_get_drvdata(pci_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8175)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8176) if (pci_dev->current_state != PCI_D0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8177) ctrl_info->max_hw_queue_index = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8178) pqi_free_interrupts(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8179) pqi_change_irq_mode(ctrl_info, IRQ_MODE_INTX);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8180) rc = request_irq(pci_irq_vector(pci_dev, 0), pqi_irq_handler,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8181) IRQF_SHARED, DRIVER_NAME_SHORT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8182) &ctrl_info->queue_groups[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8183) if (rc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8184) dev_err(&ctrl_info->pci_dev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8185) "irq %u init failed with error %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8186) pci_dev->irq, rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8187) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8188) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8189) pqi_start_heartbeat_timer(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8190) pqi_ctrl_unblock_requests(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8191) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8192) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8193)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8194) pci_set_power_state(pci_dev, PCI_D0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8195) pci_restore_state(pci_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8196)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8197) return pqi_ctrl_init_resume(ctrl_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8198) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8199)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8200) /* Define the PCI IDs for the controllers that we support. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8201) static const struct pci_device_id pqi_pci_id_table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8202) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8203) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8204) 0x105b, 0x1211)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8205) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8206) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8207) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8208) 0x105b, 0x1321)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8209) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8210) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8211) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8212) 0x152d, 0x8a22)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8213) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8214) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8215) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8216) 0x152d, 0x8a23)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8217) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8218) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8219) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8220) 0x152d, 0x8a24)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8221) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8222) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8223) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8224) 0x152d, 0x8a36)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8225) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8226) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8227) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8228) 0x152d, 0x8a37)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8229) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8230) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8231) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8232) 0x193d, 0x8460)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8233) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8234) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8235) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8236) 0x193d, 0x1104)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8237) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8238) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8239) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8240) 0x193d, 0x1105)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8241) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8242) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8243) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8244) 0x193d, 0x1106)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8245) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8246) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8247) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8248) 0x193d, 0x1107)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8249) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8250) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8251) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8252) 0x193d, 0x8460)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8253) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8254) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8255) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8256) 0x193d, 0x8461)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8257) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8258) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8259) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8260) 0x193d, 0xc460)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8261) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8262) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8263) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8264) 0x193d, 0xc461)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8265) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8266) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8267) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8268) 0x193d, 0xf460)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8269) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8270) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8271) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8272) 0x193d, 0xf461)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8273) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8274) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8275) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8276) 0x1bd4, 0x0045)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8277) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8278) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8279) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8280) 0x1bd4, 0x0046)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8281) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8282) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8283) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8284) 0x1bd4, 0x0047)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8285) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8286) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8287) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8288) 0x1bd4, 0x0048)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8289) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8290) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8291) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8292) 0x1bd4, 0x004a)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8293) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8294) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8295) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8296) 0x1bd4, 0x004b)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8297) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8298) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8299) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8300) 0x1bd4, 0x004c)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8301) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8302) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8303) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8304) 0x1bd4, 0x004f)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8305) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8306) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8307) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8308) 0x1bd4, 0x0051)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8309) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8310) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8311) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8312) 0x1bd4, 0x0052)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8313) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8314) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8315) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8316) 0x1bd4, 0x0053)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8317) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8318) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8319) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8320) 0x1bd4, 0x0054)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8321) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8322) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8323) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8324) 0x19e5, 0xd227)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8325) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8326) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8327) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8328) 0x19e5, 0xd228)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8329) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8330) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8331) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8332) 0x19e5, 0xd229)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8333) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8334) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8335) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8336) 0x19e5, 0xd22a)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8337) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8338) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8339) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8340) 0x19e5, 0xd22b)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8341) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8342) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8343) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8344) 0x19e5, 0xd22c)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8345) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8346) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8347) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8348) PCI_VENDOR_ID_ADAPTEC2, 0x0110)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8349) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8350) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8351) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8352) PCI_VENDOR_ID_ADAPTEC2, 0x0608)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8353) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8354) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8355) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8356) PCI_VENDOR_ID_ADAPTEC2, 0x0800)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8357) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8358) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8359) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8360) PCI_VENDOR_ID_ADAPTEC2, 0x0801)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8361) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8362) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8363) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8364) PCI_VENDOR_ID_ADAPTEC2, 0x0802)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8365) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8366) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8367) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8368) PCI_VENDOR_ID_ADAPTEC2, 0x0803)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8369) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8370) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8371) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8372) PCI_VENDOR_ID_ADAPTEC2, 0x0804)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8373) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8374) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8375) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8376) PCI_VENDOR_ID_ADAPTEC2, 0x0805)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8377) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8378) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8379) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8380) PCI_VENDOR_ID_ADAPTEC2, 0x0806)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8381) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8382) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8383) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8384) PCI_VENDOR_ID_ADAPTEC2, 0x0807)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8385) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8386) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8387) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8388) PCI_VENDOR_ID_ADAPTEC2, 0x0808)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8389) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8390) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8391) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8392) PCI_VENDOR_ID_ADAPTEC2, 0x0809)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8393) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8394) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8395) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8396) PCI_VENDOR_ID_ADAPTEC2, 0x080a)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8397) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8398) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8399) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8400) PCI_VENDOR_ID_ADAPTEC2, 0x0900)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8401) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8402) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8403) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8404) PCI_VENDOR_ID_ADAPTEC2, 0x0901)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8405) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8406) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8407) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8408) PCI_VENDOR_ID_ADAPTEC2, 0x0902)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8409) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8410) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8411) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8412) PCI_VENDOR_ID_ADAPTEC2, 0x0903)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8413) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8414) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8415) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8416) PCI_VENDOR_ID_ADAPTEC2, 0x0904)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8417) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8418) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8419) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8420) PCI_VENDOR_ID_ADAPTEC2, 0x0905)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8421) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8422) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8423) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8424) PCI_VENDOR_ID_ADAPTEC2, 0x0906)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8425) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8426) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8427) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8428) PCI_VENDOR_ID_ADAPTEC2, 0x0907)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8429) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8430) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8431) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8432) PCI_VENDOR_ID_ADAPTEC2, 0x0908)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8433) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8434) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8435) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8436) PCI_VENDOR_ID_ADAPTEC2, 0x090a)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8437) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8438) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8439) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8440) PCI_VENDOR_ID_ADAPTEC2, 0x1200)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8441) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8442) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8443) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8444) PCI_VENDOR_ID_ADAPTEC2, 0x1201)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8445) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8446) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8447) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8448) PCI_VENDOR_ID_ADAPTEC2, 0x1202)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8449) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8450) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8451) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8452) PCI_VENDOR_ID_ADAPTEC2, 0x1280)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8453) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8454) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8455) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8456) PCI_VENDOR_ID_ADAPTEC2, 0x1281)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8457) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8458) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8459) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8460) PCI_VENDOR_ID_ADAPTEC2, 0x1282)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8461) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8462) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8463) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8464) PCI_VENDOR_ID_ADAPTEC2, 0x1300)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8465) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8466) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8467) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8468) PCI_VENDOR_ID_ADAPTEC2, 0x1301)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8469) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8470) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8471) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8472) PCI_VENDOR_ID_ADAPTEC2, 0x1302)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8473) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8474) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8475) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8476) PCI_VENDOR_ID_ADAPTEC2, 0x1303)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8477) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8478) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8479) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8480) PCI_VENDOR_ID_ADAPTEC2, 0x1380)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8481) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8482) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8483) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8484) PCI_VENDOR_ID_ADAPTEC2, 0x1400)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8485) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8486) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8487) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8488) PCI_VENDOR_ID_ADAPTEC2, 0x1402)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8489) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8490) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8491) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8492) PCI_VENDOR_ID_ADAPTEC2, 0x1410)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8493) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8494) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8495) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8496) PCI_VENDOR_ID_ADAPTEC2, 0x1411)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8497) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8498) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8499) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8500) PCI_VENDOR_ID_ADAPTEC2, 0x1412)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8501) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8502) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8503) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8504) PCI_VENDOR_ID_ADAPTEC2, 0x1420)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8505) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8506) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8507) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8508) PCI_VENDOR_ID_ADAPTEC2, 0x1430)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8509) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8510) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8511) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8512) PCI_VENDOR_ID_ADAPTEC2, 0x1440)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8513) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8514) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8515) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8516) PCI_VENDOR_ID_ADAPTEC2, 0x1441)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8517) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8518) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8519) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8520) PCI_VENDOR_ID_ADAPTEC2, 0x1450)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8521) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8522) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8523) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8524) PCI_VENDOR_ID_ADAPTEC2, 0x1452)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8525) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8526) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8527) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8528) PCI_VENDOR_ID_ADAPTEC2, 0x1460)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8529) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8530) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8531) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8532) PCI_VENDOR_ID_ADAPTEC2, 0x1461)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8533) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8534) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8535) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8536) PCI_VENDOR_ID_ADAPTEC2, 0x1462)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8537) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8538) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8539) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8540) PCI_VENDOR_ID_ADAPTEC2, 0x1470)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8541) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8542) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8543) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8544) PCI_VENDOR_ID_ADAPTEC2, 0x1471)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8545) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8546) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8547) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8548) PCI_VENDOR_ID_ADAPTEC2, 0x1472)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8549) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8550) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8551) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8552) PCI_VENDOR_ID_ADAPTEC2, 0x1480)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8553) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8554) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8555) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8556) PCI_VENDOR_ID_ADAPTEC2, 0x1490)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8557) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8558) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8559) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8560) PCI_VENDOR_ID_ADAPTEC2, 0x1491)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8561) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8562) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8563) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8564) PCI_VENDOR_ID_ADAPTEC2, 0x14a0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8565) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8566) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8567) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8568) PCI_VENDOR_ID_ADAPTEC2, 0x14a1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8569) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8570) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8571) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8572) PCI_VENDOR_ID_ADAPTEC2, 0x14b0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8573) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8574) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8575) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8576) PCI_VENDOR_ID_ADAPTEC2, 0x14b1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8577) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8578) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8579) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8580) PCI_VENDOR_ID_ADAPTEC2, 0x14c0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8581) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8582) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8583) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8584) PCI_VENDOR_ID_ADAPTEC2, 0x14c1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8585) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8586) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8587) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8588) PCI_VENDOR_ID_ADAPTEC2, 0x14d0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8589) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8590) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8591) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8592) PCI_VENDOR_ID_ADAPTEC2, 0x14e0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8593) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8594) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8595) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8596) PCI_VENDOR_ID_ADAPTEC2, 0x14f0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8597) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8598) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8599) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8600) PCI_VENDOR_ID_ADVANTECH, 0x8312)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8601) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8602) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8603) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8604) PCI_VENDOR_ID_DELL, 0x1fe0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8605) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8606) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8607) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8608) PCI_VENDOR_ID_HP, 0x0600)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8609) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8610) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8611) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8612) PCI_VENDOR_ID_HP, 0x0601)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8613) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8614) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8615) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8616) PCI_VENDOR_ID_HP, 0x0602)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8617) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8618) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8619) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8620) PCI_VENDOR_ID_HP, 0x0603)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8621) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8622) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8623) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8624) PCI_VENDOR_ID_HP, 0x0609)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8625) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8626) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8627) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8628) PCI_VENDOR_ID_HP, 0x0650)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8629) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8630) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8631) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8632) PCI_VENDOR_ID_HP, 0x0651)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8633) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8634) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8635) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8636) PCI_VENDOR_ID_HP, 0x0652)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8637) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8638) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8639) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8640) PCI_VENDOR_ID_HP, 0x0653)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8641) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8642) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8643) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8644) PCI_VENDOR_ID_HP, 0x0654)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8645) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8646) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8647) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8648) PCI_VENDOR_ID_HP, 0x0655)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8649) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8650) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8651) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8652) PCI_VENDOR_ID_HP, 0x0700)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8653) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8654) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8655) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8656) PCI_VENDOR_ID_HP, 0x0701)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8657) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8658) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8659) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8660) PCI_VENDOR_ID_HP, 0x1001)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8661) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8662) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8663) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8664) PCI_VENDOR_ID_HP, 0x1002)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8665) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8666) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8667) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8668) PCI_VENDOR_ID_HP, 0x1100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8669) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8670) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8671) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8672) PCI_VENDOR_ID_HP, 0x1101)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8673) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8674) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8675) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8676) 0x1590, 0x0294)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8677) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8678) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8679) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8680) 0x1590, 0x02db)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8681) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8682) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8683) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8684) 0x1590, 0x02dc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8685) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8686) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8687) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8688) 0x1590, 0x032e)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8689) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8690) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8691) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8692) 0x1d8d, 0x0800)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8693) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8694) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8695) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8696) 0x1d8d, 0x0908)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8697) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8698) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8699) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8700) 0x1d8d, 0x0806)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8701) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8702) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8703) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8704) 0x1d8d, 0x0916)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8705) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8706) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8707) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8708) PCI_VENDOR_ID_GIGABYTE, 0x1000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8709) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8710) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8711) PCI_DEVICE_SUB(PCI_VENDOR_ID_ADAPTEC2, 0x028f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8712) PCI_ANY_ID, PCI_ANY_ID)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8713) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8714) { 0 }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8715) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8716)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8717) MODULE_DEVICE_TABLE(pci, pqi_pci_id_table);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8718)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8719) static struct pci_driver pqi_pci_driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8720) .name = DRIVER_NAME_SHORT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8721) .id_table = pqi_pci_id_table,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8722) .probe = pqi_pci_probe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8723) .remove = pqi_pci_remove,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8724) .shutdown = pqi_shutdown,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8725) #if defined(CONFIG_PM)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8726) .suspend = pqi_suspend,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8727) .resume = pqi_resume,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8728) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8729) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8730)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8731) static int __init pqi_init(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8732) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8733) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8734)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8735) pr_info(DRIVER_NAME "\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8736)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8737) pqi_sas_transport_template = sas_attach_transport(&pqi_sas_transport_functions);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8738) if (!pqi_sas_transport_template)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8739) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8740)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8741) pqi_process_module_params();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8742)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8743) rc = pci_register_driver(&pqi_pci_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8744) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8745) sas_release_transport(pqi_sas_transport_template);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8746)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8747) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8748) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8749)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8750) static void __exit pqi_cleanup(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8751) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8752) pci_unregister_driver(&pqi_pci_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8753) sas_release_transport(pqi_sas_transport_template);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8754) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8755)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8756) module_init(pqi_init);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8757) module_exit(pqi_cleanup);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8758)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8759) static void __attribute__((unused)) verify_structures(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8760) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8761) BUILD_BUG_ON(offsetof(struct pqi_ctrl_registers,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8762) sis_host_to_ctrl_doorbell) != 0x20);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8763) BUILD_BUG_ON(offsetof(struct pqi_ctrl_registers,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8764) sis_interrupt_mask) != 0x34);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8765) BUILD_BUG_ON(offsetof(struct pqi_ctrl_registers,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8766) sis_ctrl_to_host_doorbell) != 0x9c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8767) BUILD_BUG_ON(offsetof(struct pqi_ctrl_registers,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8768) sis_ctrl_to_host_doorbell_clear) != 0xa0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8769) BUILD_BUG_ON(offsetof(struct pqi_ctrl_registers,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8770) sis_driver_scratch) != 0xb0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8771) BUILD_BUG_ON(offsetof(struct pqi_ctrl_registers,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8772) sis_firmware_status) != 0xbc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8773) BUILD_BUG_ON(offsetof(struct pqi_ctrl_registers,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8774) sis_mailbox) != 0x1000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8775) BUILD_BUG_ON(offsetof(struct pqi_ctrl_registers,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8776) pqi_registers) != 0x4000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8777)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8778) BUILD_BUG_ON(offsetof(struct pqi_iu_header,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8779) iu_type) != 0x0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8780) BUILD_BUG_ON(offsetof(struct pqi_iu_header,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8781) iu_length) != 0x2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8782) BUILD_BUG_ON(offsetof(struct pqi_iu_header,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8783) response_queue_id) != 0x4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8784) BUILD_BUG_ON(offsetof(struct pqi_iu_header,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8785) work_area) != 0x6);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8786) BUILD_BUG_ON(sizeof(struct pqi_iu_header) != 0x8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8787)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8788) BUILD_BUG_ON(offsetof(struct pqi_aio_error_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8789) status) != 0x0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8790) BUILD_BUG_ON(offsetof(struct pqi_aio_error_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8791) service_response) != 0x1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8792) BUILD_BUG_ON(offsetof(struct pqi_aio_error_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8793) data_present) != 0x2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8794) BUILD_BUG_ON(offsetof(struct pqi_aio_error_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8795) reserved) != 0x3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8796) BUILD_BUG_ON(offsetof(struct pqi_aio_error_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8797) residual_count) != 0x4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8798) BUILD_BUG_ON(offsetof(struct pqi_aio_error_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8799) data_length) != 0x8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8800) BUILD_BUG_ON(offsetof(struct pqi_aio_error_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8801) reserved1) != 0xa);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8802) BUILD_BUG_ON(offsetof(struct pqi_aio_error_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8803) data) != 0xc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8804) BUILD_BUG_ON(sizeof(struct pqi_aio_error_info) != 0x10c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8805)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8806) BUILD_BUG_ON(offsetof(struct pqi_raid_error_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8807) data_in_result) != 0x0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8808) BUILD_BUG_ON(offsetof(struct pqi_raid_error_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8809) data_out_result) != 0x1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8810) BUILD_BUG_ON(offsetof(struct pqi_raid_error_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8811) reserved) != 0x2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8812) BUILD_BUG_ON(offsetof(struct pqi_raid_error_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8813) status) != 0x5);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8814) BUILD_BUG_ON(offsetof(struct pqi_raid_error_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8815) status_qualifier) != 0x6);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8816) BUILD_BUG_ON(offsetof(struct pqi_raid_error_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8817) sense_data_length) != 0x8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8818) BUILD_BUG_ON(offsetof(struct pqi_raid_error_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8819) response_data_length) != 0xa);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8820) BUILD_BUG_ON(offsetof(struct pqi_raid_error_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8821) data_in_transferred) != 0xc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8822) BUILD_BUG_ON(offsetof(struct pqi_raid_error_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8823) data_out_transferred) != 0x10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8824) BUILD_BUG_ON(offsetof(struct pqi_raid_error_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8825) data) != 0x14);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8826) BUILD_BUG_ON(sizeof(struct pqi_raid_error_info) != 0x114);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8827)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8828) BUILD_BUG_ON(offsetof(struct pqi_device_registers,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8829) signature) != 0x0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8830) BUILD_BUG_ON(offsetof(struct pqi_device_registers,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8831) function_and_status_code) != 0x8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8832) BUILD_BUG_ON(offsetof(struct pqi_device_registers,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8833) max_admin_iq_elements) != 0x10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8834) BUILD_BUG_ON(offsetof(struct pqi_device_registers,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8835) max_admin_oq_elements) != 0x11);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8836) BUILD_BUG_ON(offsetof(struct pqi_device_registers,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8837) admin_iq_element_length) != 0x12);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8838) BUILD_BUG_ON(offsetof(struct pqi_device_registers,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8839) admin_oq_element_length) != 0x13);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8840) BUILD_BUG_ON(offsetof(struct pqi_device_registers,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8841) max_reset_timeout) != 0x14);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8842) BUILD_BUG_ON(offsetof(struct pqi_device_registers,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8843) legacy_intx_status) != 0x18);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8844) BUILD_BUG_ON(offsetof(struct pqi_device_registers,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8845) legacy_intx_mask_set) != 0x1c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8846) BUILD_BUG_ON(offsetof(struct pqi_device_registers,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8847) legacy_intx_mask_clear) != 0x20);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8848) BUILD_BUG_ON(offsetof(struct pqi_device_registers,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8849) device_status) != 0x40);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8850) BUILD_BUG_ON(offsetof(struct pqi_device_registers,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8851) admin_iq_pi_offset) != 0x48);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8852) BUILD_BUG_ON(offsetof(struct pqi_device_registers,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8853) admin_oq_ci_offset) != 0x50);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8854) BUILD_BUG_ON(offsetof(struct pqi_device_registers,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8855) admin_iq_element_array_addr) != 0x58);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8856) BUILD_BUG_ON(offsetof(struct pqi_device_registers,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8857) admin_oq_element_array_addr) != 0x60);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8858) BUILD_BUG_ON(offsetof(struct pqi_device_registers,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8859) admin_iq_ci_addr) != 0x68);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8860) BUILD_BUG_ON(offsetof(struct pqi_device_registers,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8861) admin_oq_pi_addr) != 0x70);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8862) BUILD_BUG_ON(offsetof(struct pqi_device_registers,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8863) admin_iq_num_elements) != 0x78);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8864) BUILD_BUG_ON(offsetof(struct pqi_device_registers,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8865) admin_oq_num_elements) != 0x79);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8866) BUILD_BUG_ON(offsetof(struct pqi_device_registers,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8867) admin_queue_int_msg_num) != 0x7a);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8868) BUILD_BUG_ON(offsetof(struct pqi_device_registers,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8869) device_error) != 0x80);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8870) BUILD_BUG_ON(offsetof(struct pqi_device_registers,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8871) error_details) != 0x88);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8872) BUILD_BUG_ON(offsetof(struct pqi_device_registers,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8873) device_reset) != 0x90);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8874) BUILD_BUG_ON(offsetof(struct pqi_device_registers,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8875) power_action) != 0x94);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8876) BUILD_BUG_ON(sizeof(struct pqi_device_registers) != 0x100);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8877)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8878) BUILD_BUG_ON(offsetof(struct pqi_general_admin_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8879) header.iu_type) != 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8880) BUILD_BUG_ON(offsetof(struct pqi_general_admin_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8881) header.iu_length) != 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8882) BUILD_BUG_ON(offsetof(struct pqi_general_admin_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8883) header.work_area) != 6);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8884) BUILD_BUG_ON(offsetof(struct pqi_general_admin_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8885) request_id) != 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8886) BUILD_BUG_ON(offsetof(struct pqi_general_admin_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8887) function_code) != 10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8888) BUILD_BUG_ON(offsetof(struct pqi_general_admin_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8889) data.report_device_capability.buffer_length) != 44);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8890) BUILD_BUG_ON(offsetof(struct pqi_general_admin_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8891) data.report_device_capability.sg_descriptor) != 48);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8892) BUILD_BUG_ON(offsetof(struct pqi_general_admin_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8893) data.create_operational_iq.queue_id) != 12);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8894) BUILD_BUG_ON(offsetof(struct pqi_general_admin_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8895) data.create_operational_iq.element_array_addr) != 16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8896) BUILD_BUG_ON(offsetof(struct pqi_general_admin_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8897) data.create_operational_iq.ci_addr) != 24);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8898) BUILD_BUG_ON(offsetof(struct pqi_general_admin_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8899) data.create_operational_iq.num_elements) != 32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8900) BUILD_BUG_ON(offsetof(struct pqi_general_admin_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8901) data.create_operational_iq.element_length) != 34);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8902) BUILD_BUG_ON(offsetof(struct pqi_general_admin_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8903) data.create_operational_iq.queue_protocol) != 36);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8904) BUILD_BUG_ON(offsetof(struct pqi_general_admin_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8905) data.create_operational_oq.queue_id) != 12);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8906) BUILD_BUG_ON(offsetof(struct pqi_general_admin_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8907) data.create_operational_oq.element_array_addr) != 16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8908) BUILD_BUG_ON(offsetof(struct pqi_general_admin_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8909) data.create_operational_oq.pi_addr) != 24);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8910) BUILD_BUG_ON(offsetof(struct pqi_general_admin_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8911) data.create_operational_oq.num_elements) != 32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8912) BUILD_BUG_ON(offsetof(struct pqi_general_admin_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8913) data.create_operational_oq.element_length) != 34);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8914) BUILD_BUG_ON(offsetof(struct pqi_general_admin_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8915) data.create_operational_oq.queue_protocol) != 36);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8916) BUILD_BUG_ON(offsetof(struct pqi_general_admin_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8917) data.create_operational_oq.int_msg_num) != 40);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8918) BUILD_BUG_ON(offsetof(struct pqi_general_admin_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8919) data.create_operational_oq.coalescing_count) != 42);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8920) BUILD_BUG_ON(offsetof(struct pqi_general_admin_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8921) data.create_operational_oq.min_coalescing_time) != 44);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8922) BUILD_BUG_ON(offsetof(struct pqi_general_admin_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8923) data.create_operational_oq.max_coalescing_time) != 48);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8924) BUILD_BUG_ON(offsetof(struct pqi_general_admin_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8925) data.delete_operational_queue.queue_id) != 12);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8926) BUILD_BUG_ON(sizeof(struct pqi_general_admin_request) != 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8927) BUILD_BUG_ON(sizeof_field(struct pqi_general_admin_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8928) data.create_operational_iq) != 64 - 11);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8929) BUILD_BUG_ON(sizeof_field(struct pqi_general_admin_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8930) data.create_operational_oq) != 64 - 11);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8931) BUILD_BUG_ON(sizeof_field(struct pqi_general_admin_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8932) data.delete_operational_queue) != 64 - 11);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8933)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8934) BUILD_BUG_ON(offsetof(struct pqi_general_admin_response,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8935) header.iu_type) != 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8936) BUILD_BUG_ON(offsetof(struct pqi_general_admin_response,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8937) header.iu_length) != 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8938) BUILD_BUG_ON(offsetof(struct pqi_general_admin_response,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8939) header.work_area) != 6);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8940) BUILD_BUG_ON(offsetof(struct pqi_general_admin_response,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8941) request_id) != 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8942) BUILD_BUG_ON(offsetof(struct pqi_general_admin_response,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8943) function_code) != 10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8944) BUILD_BUG_ON(offsetof(struct pqi_general_admin_response,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8945) status) != 11);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8946) BUILD_BUG_ON(offsetof(struct pqi_general_admin_response,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8947) data.create_operational_iq.status_descriptor) != 12);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8948) BUILD_BUG_ON(offsetof(struct pqi_general_admin_response,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8949) data.create_operational_iq.iq_pi_offset) != 16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8950) BUILD_BUG_ON(offsetof(struct pqi_general_admin_response,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8951) data.create_operational_oq.status_descriptor) != 12);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8952) BUILD_BUG_ON(offsetof(struct pqi_general_admin_response,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8953) data.create_operational_oq.oq_ci_offset) != 16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8954) BUILD_BUG_ON(sizeof(struct pqi_general_admin_response) != 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8955)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8956) BUILD_BUG_ON(offsetof(struct pqi_raid_path_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8957) header.iu_type) != 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8958) BUILD_BUG_ON(offsetof(struct pqi_raid_path_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8959) header.iu_length) != 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8960) BUILD_BUG_ON(offsetof(struct pqi_raid_path_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8961) header.response_queue_id) != 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8962) BUILD_BUG_ON(offsetof(struct pqi_raid_path_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8963) header.work_area) != 6);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8964) BUILD_BUG_ON(offsetof(struct pqi_raid_path_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8965) request_id) != 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8966) BUILD_BUG_ON(offsetof(struct pqi_raid_path_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8967) nexus_id) != 10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8968) BUILD_BUG_ON(offsetof(struct pqi_raid_path_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8969) buffer_length) != 12);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8970) BUILD_BUG_ON(offsetof(struct pqi_raid_path_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8971) lun_number) != 16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8972) BUILD_BUG_ON(offsetof(struct pqi_raid_path_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8973) protocol_specific) != 24);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8974) BUILD_BUG_ON(offsetof(struct pqi_raid_path_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8975) error_index) != 27);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8976) BUILD_BUG_ON(offsetof(struct pqi_raid_path_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8977) cdb) != 32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8978) BUILD_BUG_ON(offsetof(struct pqi_raid_path_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8979) timeout) != 60);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8980) BUILD_BUG_ON(offsetof(struct pqi_raid_path_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8981) sg_descriptors) != 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8982) BUILD_BUG_ON(sizeof(struct pqi_raid_path_request) !=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8983) PQI_OPERATIONAL_IQ_ELEMENT_LENGTH);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8984)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8985) BUILD_BUG_ON(offsetof(struct pqi_aio_path_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8986) header.iu_type) != 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8987) BUILD_BUG_ON(offsetof(struct pqi_aio_path_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8988) header.iu_length) != 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8989) BUILD_BUG_ON(offsetof(struct pqi_aio_path_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8990) header.response_queue_id) != 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8991) BUILD_BUG_ON(offsetof(struct pqi_aio_path_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8992) header.work_area) != 6);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8993) BUILD_BUG_ON(offsetof(struct pqi_aio_path_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8994) request_id) != 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8995) BUILD_BUG_ON(offsetof(struct pqi_aio_path_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8996) nexus_id) != 12);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8997) BUILD_BUG_ON(offsetof(struct pqi_aio_path_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8998) buffer_length) != 16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8999) BUILD_BUG_ON(offsetof(struct pqi_aio_path_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9000) data_encryption_key_index) != 22);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9001) BUILD_BUG_ON(offsetof(struct pqi_aio_path_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9002) encrypt_tweak_lower) != 24);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9003) BUILD_BUG_ON(offsetof(struct pqi_aio_path_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9004) encrypt_tweak_upper) != 28);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9005) BUILD_BUG_ON(offsetof(struct pqi_aio_path_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9006) cdb) != 32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9007) BUILD_BUG_ON(offsetof(struct pqi_aio_path_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9008) error_index) != 48);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9009) BUILD_BUG_ON(offsetof(struct pqi_aio_path_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9010) num_sg_descriptors) != 50);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9011) BUILD_BUG_ON(offsetof(struct pqi_aio_path_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9012) cdb_length) != 51);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9013) BUILD_BUG_ON(offsetof(struct pqi_aio_path_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9014) lun_number) != 52);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9015) BUILD_BUG_ON(offsetof(struct pqi_aio_path_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9016) sg_descriptors) != 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9017) BUILD_BUG_ON(sizeof(struct pqi_aio_path_request) !=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9018) PQI_OPERATIONAL_IQ_ELEMENT_LENGTH);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9019)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9020) BUILD_BUG_ON(offsetof(struct pqi_io_response,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9021) header.iu_type) != 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9022) BUILD_BUG_ON(offsetof(struct pqi_io_response,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9023) header.iu_length) != 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9024) BUILD_BUG_ON(offsetof(struct pqi_io_response,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9025) request_id) != 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9026) BUILD_BUG_ON(offsetof(struct pqi_io_response,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9027) error_index) != 10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9028)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9029) BUILD_BUG_ON(offsetof(struct pqi_general_management_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9030) header.iu_type) != 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9031) BUILD_BUG_ON(offsetof(struct pqi_general_management_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9032) header.iu_length) != 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9033) BUILD_BUG_ON(offsetof(struct pqi_general_management_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9034) header.response_queue_id) != 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9035) BUILD_BUG_ON(offsetof(struct pqi_general_management_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9036) request_id) != 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9037) BUILD_BUG_ON(offsetof(struct pqi_general_management_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9038) data.report_event_configuration.buffer_length) != 12);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9039) BUILD_BUG_ON(offsetof(struct pqi_general_management_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9040) data.report_event_configuration.sg_descriptors) != 16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9041) BUILD_BUG_ON(offsetof(struct pqi_general_management_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9042) data.set_event_configuration.global_event_oq_id) != 10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9043) BUILD_BUG_ON(offsetof(struct pqi_general_management_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9044) data.set_event_configuration.buffer_length) != 12);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9045) BUILD_BUG_ON(offsetof(struct pqi_general_management_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9046) data.set_event_configuration.sg_descriptors) != 16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9047)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9048) BUILD_BUG_ON(offsetof(struct pqi_iu_layer_descriptor,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9049) max_inbound_iu_length) != 6);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9050) BUILD_BUG_ON(offsetof(struct pqi_iu_layer_descriptor,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9051) max_outbound_iu_length) != 14);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9052) BUILD_BUG_ON(sizeof(struct pqi_iu_layer_descriptor) != 16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9053)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9054) BUILD_BUG_ON(offsetof(struct pqi_device_capability,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9055) data_length) != 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9056) BUILD_BUG_ON(offsetof(struct pqi_device_capability,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9057) iq_arbitration_priority_support_bitmask) != 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9058) BUILD_BUG_ON(offsetof(struct pqi_device_capability,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9059) maximum_aw_a) != 9);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9060) BUILD_BUG_ON(offsetof(struct pqi_device_capability,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9061) maximum_aw_b) != 10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9062) BUILD_BUG_ON(offsetof(struct pqi_device_capability,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9063) maximum_aw_c) != 11);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9064) BUILD_BUG_ON(offsetof(struct pqi_device_capability,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9065) max_inbound_queues) != 16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9066) BUILD_BUG_ON(offsetof(struct pqi_device_capability,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9067) max_elements_per_iq) != 18);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9068) BUILD_BUG_ON(offsetof(struct pqi_device_capability,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9069) max_iq_element_length) != 24);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9070) BUILD_BUG_ON(offsetof(struct pqi_device_capability,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9071) min_iq_element_length) != 26);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9072) BUILD_BUG_ON(offsetof(struct pqi_device_capability,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9073) max_outbound_queues) != 30);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9074) BUILD_BUG_ON(offsetof(struct pqi_device_capability,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9075) max_elements_per_oq) != 32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9076) BUILD_BUG_ON(offsetof(struct pqi_device_capability,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9077) intr_coalescing_time_granularity) != 34);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9078) BUILD_BUG_ON(offsetof(struct pqi_device_capability,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9079) max_oq_element_length) != 36);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9080) BUILD_BUG_ON(offsetof(struct pqi_device_capability,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9081) min_oq_element_length) != 38);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9082) BUILD_BUG_ON(offsetof(struct pqi_device_capability,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9083) iu_layer_descriptors) != 64);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9084) BUILD_BUG_ON(sizeof(struct pqi_device_capability) != 576);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9085)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9086) BUILD_BUG_ON(offsetof(struct pqi_event_descriptor,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9087) event_type) != 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9088) BUILD_BUG_ON(offsetof(struct pqi_event_descriptor,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9089) oq_id) != 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9090) BUILD_BUG_ON(sizeof(struct pqi_event_descriptor) != 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9091)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9092) BUILD_BUG_ON(offsetof(struct pqi_event_config,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9093) num_event_descriptors) != 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9094) BUILD_BUG_ON(offsetof(struct pqi_event_config,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9095) descriptors) != 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9096)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9097) BUILD_BUG_ON(PQI_NUM_SUPPORTED_EVENTS !=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9098) ARRAY_SIZE(pqi_supported_event_types));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9099)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9100) BUILD_BUG_ON(offsetof(struct pqi_event_response,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9101) header.iu_type) != 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9102) BUILD_BUG_ON(offsetof(struct pqi_event_response,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9103) header.iu_length) != 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9104) BUILD_BUG_ON(offsetof(struct pqi_event_response,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9105) event_type) != 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9106) BUILD_BUG_ON(offsetof(struct pqi_event_response,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9107) event_id) != 10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9108) BUILD_BUG_ON(offsetof(struct pqi_event_response,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9109) additional_event_id) != 12);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9110) BUILD_BUG_ON(offsetof(struct pqi_event_response,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9111) data) != 16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9112) BUILD_BUG_ON(sizeof(struct pqi_event_response) != 32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9113)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9114) BUILD_BUG_ON(offsetof(struct pqi_event_acknowledge_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9115) header.iu_type) != 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9116) BUILD_BUG_ON(offsetof(struct pqi_event_acknowledge_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9117) header.iu_length) != 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9118) BUILD_BUG_ON(offsetof(struct pqi_event_acknowledge_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9119) event_type) != 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9120) BUILD_BUG_ON(offsetof(struct pqi_event_acknowledge_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9121) event_id) != 10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9122) BUILD_BUG_ON(offsetof(struct pqi_event_acknowledge_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9123) additional_event_id) != 12);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9124) BUILD_BUG_ON(sizeof(struct pqi_event_acknowledge_request) != 16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9125)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9126) BUILD_BUG_ON(offsetof(struct pqi_task_management_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9127) header.iu_type) != 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9128) BUILD_BUG_ON(offsetof(struct pqi_task_management_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9129) header.iu_length) != 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9130) BUILD_BUG_ON(offsetof(struct pqi_task_management_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9131) request_id) != 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9132) BUILD_BUG_ON(offsetof(struct pqi_task_management_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9133) nexus_id) != 10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9134) BUILD_BUG_ON(offsetof(struct pqi_task_management_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9135) timeout) != 14);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9136) BUILD_BUG_ON(offsetof(struct pqi_task_management_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9137) lun_number) != 16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9138) BUILD_BUG_ON(offsetof(struct pqi_task_management_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9139) protocol_specific) != 24);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9140) BUILD_BUG_ON(offsetof(struct pqi_task_management_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9141) outbound_queue_id_to_manage) != 26);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9142) BUILD_BUG_ON(offsetof(struct pqi_task_management_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9143) request_id_to_manage) != 28);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9144) BUILD_BUG_ON(offsetof(struct pqi_task_management_request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9145) task_management_function) != 30);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9146) BUILD_BUG_ON(sizeof(struct pqi_task_management_request) != 32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9147)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9148) BUILD_BUG_ON(offsetof(struct pqi_task_management_response,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9149) header.iu_type) != 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9150) BUILD_BUG_ON(offsetof(struct pqi_task_management_response,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9151) header.iu_length) != 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9152) BUILD_BUG_ON(offsetof(struct pqi_task_management_response,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9153) request_id) != 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9154) BUILD_BUG_ON(offsetof(struct pqi_task_management_response,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9155) nexus_id) != 10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9156) BUILD_BUG_ON(offsetof(struct pqi_task_management_response,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9157) additional_response_info) != 12);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9158) BUILD_BUG_ON(offsetof(struct pqi_task_management_response,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9159) response_code) != 15);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9160) BUILD_BUG_ON(sizeof(struct pqi_task_management_response) != 16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9162) BUILD_BUG_ON(offsetof(struct bmic_identify_controller,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9163) configured_logical_drive_count) != 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9164) BUILD_BUG_ON(offsetof(struct bmic_identify_controller,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9165) configuration_signature) != 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9166) BUILD_BUG_ON(offsetof(struct bmic_identify_controller,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9167) firmware_version) != 5);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9168) BUILD_BUG_ON(offsetof(struct bmic_identify_controller,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9169) extended_logical_unit_count) != 154);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9170) BUILD_BUG_ON(offsetof(struct bmic_identify_controller,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9171) firmware_build_number) != 190);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9172) BUILD_BUG_ON(offsetof(struct bmic_identify_controller,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9173) controller_mode) != 292);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9174)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9175) BUILD_BUG_ON(offsetof(struct bmic_identify_physical_device,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9176) phys_bay_in_box) != 115);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9177) BUILD_BUG_ON(offsetof(struct bmic_identify_physical_device,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9178) device_type) != 120);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9179) BUILD_BUG_ON(offsetof(struct bmic_identify_physical_device,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9180) redundant_path_present_map) != 1736);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9181) BUILD_BUG_ON(offsetof(struct bmic_identify_physical_device,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9182) active_path_number) != 1738);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9183) BUILD_BUG_ON(offsetof(struct bmic_identify_physical_device,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9184) alternate_paths_phys_connector) != 1739);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9185) BUILD_BUG_ON(offsetof(struct bmic_identify_physical_device,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9186) alternate_paths_phys_box_on_port) != 1755);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9187) BUILD_BUG_ON(offsetof(struct bmic_identify_physical_device,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9188) current_queue_depth_limit) != 1796);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9189) BUILD_BUG_ON(sizeof(struct bmic_identify_physical_device) != 2560);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9190)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9191) BUILD_BUG_ON(PQI_ADMIN_IQ_NUM_ELEMENTS > 255);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9192) BUILD_BUG_ON(PQI_ADMIN_OQ_NUM_ELEMENTS > 255);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9193) BUILD_BUG_ON(PQI_ADMIN_IQ_ELEMENT_LENGTH %
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9194) PQI_QUEUE_ELEMENT_LENGTH_ALIGNMENT != 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9195) BUILD_BUG_ON(PQI_ADMIN_OQ_ELEMENT_LENGTH %
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9196) PQI_QUEUE_ELEMENT_LENGTH_ALIGNMENT != 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9197) BUILD_BUG_ON(PQI_OPERATIONAL_IQ_ELEMENT_LENGTH > 1048560);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9198) BUILD_BUG_ON(PQI_OPERATIONAL_IQ_ELEMENT_LENGTH %
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9199) PQI_QUEUE_ELEMENT_LENGTH_ALIGNMENT != 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9200) BUILD_BUG_ON(PQI_OPERATIONAL_OQ_ELEMENT_LENGTH > 1048560);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9201) BUILD_BUG_ON(PQI_OPERATIONAL_OQ_ELEMENT_LENGTH %
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9202) PQI_QUEUE_ELEMENT_LENGTH_ALIGNMENT != 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9203)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9204) BUILD_BUG_ON(PQI_RESERVED_IO_SLOTS >= PQI_MAX_OUTSTANDING_REQUESTS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9205) BUILD_BUG_ON(PQI_RESERVED_IO_SLOTS >=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9206) PQI_MAX_OUTSTANDING_REQUESTS_KDUMP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9207) }