^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) * This module provides common API for accessing firmware configuration pages
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * This code is based on drivers/scsi/mpt3sas/mpt3sas_base.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Copyright (C) 2012-2014 LSI Corporation
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * Copyright (C) 2013-2014 Avago Technologies
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) * (mailto: MPT-FusionLinux.pdl@avagotech.com)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) * This program is free software; you can redistribute it and/or
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) * modify it under the terms of the GNU General Public License
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) * as published by the Free Software Foundation; either version 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) * of the License, or (at your option) any later version.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) * This program is distributed in the hope that it will be useful,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) * but WITHOUT ANY WARRANTY; without even the implied warranty of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) * GNU General Public License for more details.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) * NO WARRANTY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) * THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) * CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) * LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) * solely responsible for determining the appropriateness of using and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) * distributing the Program and assumes all risks associated with its
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) * exercise of rights under this Agreement, including but not limited to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) * the risks and costs of program errors, damage to or loss of data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) * programs or equipment, and unavailability or interruption of operations.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) * DISCLAIMER OF LIABILITY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) * NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) * DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) * USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) * HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) * You should have received a copy of the GNU General Public License
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) * along with this program; if not, write to the Free Software
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) * USA.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) #include <linux/init.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) #include <linux/errno.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) #include <linux/blkdev.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) #include <linux/sched.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) #include <linux/workqueue.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) #include <linux/delay.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) #include <linux/pci.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) #include "mpt3sas_base.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) /* local definitions */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) /* Timeout for config page request (in seconds) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) #define MPT3_CONFIG_PAGE_DEFAULT_TIMEOUT 15
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) /* Common sgl flags for READING a config page. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) #define MPT3_CONFIG_COMMON_SGLFLAGS ((MPI2_SGE_FLAGS_SIMPLE_ELEMENT | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) MPI2_SGE_FLAGS_LAST_ELEMENT | MPI2_SGE_FLAGS_END_OF_BUFFER \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) | MPI2_SGE_FLAGS_END_OF_LIST) << MPI2_SGE_FLAGS_SHIFT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) /* Common sgl flags for WRITING a config page. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) #define MPT3_CONFIG_COMMON_WRITE_SGLFLAGS ((MPI2_SGE_FLAGS_SIMPLE_ELEMENT | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) MPI2_SGE_FLAGS_LAST_ELEMENT | MPI2_SGE_FLAGS_END_OF_BUFFER \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) | MPI2_SGE_FLAGS_END_OF_LIST | MPI2_SGE_FLAGS_HOST_TO_IOC) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) << MPI2_SGE_FLAGS_SHIFT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) * struct config_request - obtain dma memory via routine
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) * @sz: size
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) * @page: virt pointer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) * @page_dma: phys pointer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) struct config_request {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) u16 sz;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) void *page;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) dma_addr_t page_dma;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) * _config_display_some_debug - debug routine
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) * @ioc: per adapter object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) * @smid: system request message index
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) * @calling_function_name: string pass from calling function
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) * @mpi_reply: reply message frame
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) * Context: none.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) * Function for displaying debug info helpful when debugging issues
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) * in this module.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) _config_display_some_debug(struct MPT3SAS_ADAPTER *ioc, u16 smid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) char *calling_function_name, MPI2DefaultReply_t *mpi_reply)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) Mpi2ConfigRequest_t *mpi_request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) char *desc = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) mpi_request = mpt3sas_base_get_msg_frame(ioc, smid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) switch (mpi_request->Header.PageType & MPI2_CONFIG_PAGETYPE_MASK) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) case MPI2_CONFIG_PAGETYPE_IO_UNIT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) desc = "io_unit";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) case MPI2_CONFIG_PAGETYPE_IOC:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) desc = "ioc";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) case MPI2_CONFIG_PAGETYPE_BIOS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) desc = "bios";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) case MPI2_CONFIG_PAGETYPE_RAID_VOLUME:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) desc = "raid_volume";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) case MPI2_CONFIG_PAGETYPE_MANUFACTURING:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) desc = "manufacturing";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) case MPI2_CONFIG_PAGETYPE_RAID_PHYSDISK:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) desc = "physdisk";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) case MPI2_CONFIG_PAGETYPE_EXTENDED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) switch (mpi_request->ExtPageType) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) case MPI2_CONFIG_EXTPAGETYPE_SAS_IO_UNIT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) desc = "sas_io_unit";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) case MPI2_CONFIG_EXTPAGETYPE_SAS_EXPANDER:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) desc = "sas_expander";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) case MPI2_CONFIG_EXTPAGETYPE_SAS_DEVICE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) desc = "sas_device";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) case MPI2_CONFIG_EXTPAGETYPE_SAS_PHY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) desc = "sas_phy";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) case MPI2_CONFIG_EXTPAGETYPE_LOG:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) desc = "log";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) case MPI2_CONFIG_EXTPAGETYPE_ENCLOSURE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) desc = "enclosure";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) case MPI2_CONFIG_EXTPAGETYPE_RAID_CONFIG:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) desc = "raid_config";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) case MPI2_CONFIG_EXTPAGETYPE_DRIVER_MAPPING:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) desc = "driver_mapping";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) case MPI2_CONFIG_EXTPAGETYPE_SAS_PORT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) desc = "sas_port";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) case MPI2_CONFIG_EXTPAGETYPE_EXT_MANUFACTURING:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) desc = "ext_manufacturing";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) case MPI2_CONFIG_EXTPAGETYPE_PCIE_IO_UNIT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) desc = "pcie_io_unit";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) case MPI2_CONFIG_EXTPAGETYPE_PCIE_SWITCH:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) desc = "pcie_switch";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) case MPI2_CONFIG_EXTPAGETYPE_PCIE_DEVICE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) desc = "pcie_device";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) case MPI2_CONFIG_EXTPAGETYPE_PCIE_LINK:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) desc = "pcie_link";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) if (!desc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) ioc_info(ioc, "%s: %s(%d), action(%d), form(0x%08x), smid(%d)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) calling_function_name, desc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) mpi_request->Header.PageNumber, mpi_request->Action,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) le32_to_cpu(mpi_request->PageAddress), smid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) if (!mpi_reply)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) if (mpi_reply->IOCStatus || mpi_reply->IOCLogInfo)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) ioc_info(ioc, "\tiocstatus(0x%04x), loginfo(0x%08x)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) le16_to_cpu(mpi_reply->IOCStatus),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) le32_to_cpu(mpi_reply->IOCLogInfo));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) * _config_alloc_config_dma_memory - obtain physical memory
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) * @ioc: per adapter object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) * @mem: struct config_request
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) * A wrapper for obtaining dma-able memory for config page request.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) * Return: 0 for success, non-zero for failure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) _config_alloc_config_dma_memory(struct MPT3SAS_ADAPTER *ioc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) struct config_request *mem)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) int r = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) if (mem->sz > ioc->config_page_sz) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) mem->page = dma_alloc_coherent(&ioc->pdev->dev, mem->sz,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) &mem->page_dma, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) if (!mem->page) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) ioc_err(ioc, "%s: dma_alloc_coherent failed asking for (%d) bytes!!\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) __func__, mem->sz);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) r = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) } else { /* use tmp buffer if less than 512 bytes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) mem->page = ioc->config_page;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) mem->page_dma = ioc->config_page_dma;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) ioc->config_vaddr = mem->page;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) return r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) * _config_free_config_dma_memory - wrapper to free the memory
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) * @ioc: per adapter object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) * @mem: struct config_request
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) * A wrapper to free dma-able memory when using _config_alloc_config_dma_memory.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) * Return: 0 for success, non-zero for failure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) _config_free_config_dma_memory(struct MPT3SAS_ADAPTER *ioc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) struct config_request *mem)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) if (mem->sz > ioc->config_page_sz)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) dma_free_coherent(&ioc->pdev->dev, mem->sz, mem->page,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) mem->page_dma);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) * mpt3sas_config_done - config page completion routine
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) * @ioc: per adapter object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) * @smid: system request message index
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) * @msix_index: MSIX table index supplied by the OS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) * @reply: reply message frame(lower 32bit addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) * Context: none.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) * The callback handler when using _config_request.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) * Return: 1 meaning mf should be freed from _base_interrupt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) * 0 means the mf is freed from this function.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) u8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) mpt3sas_config_done(struct MPT3SAS_ADAPTER *ioc, u16 smid, u8 msix_index,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) u32 reply)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) MPI2DefaultReply_t *mpi_reply;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) if (ioc->config_cmds.status == MPT3_CMD_NOT_USED)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) if (ioc->config_cmds.smid != smid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) ioc->config_cmds.status |= MPT3_CMD_COMPLETE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) mpi_reply = mpt3sas_base_get_reply_virt_addr(ioc, reply);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) if (mpi_reply) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) ioc->config_cmds.status |= MPT3_CMD_REPLY_VALID;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) memcpy(ioc->config_cmds.reply, mpi_reply,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) mpi_reply->MsgLength*4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) ioc->config_cmds.status &= ~MPT3_CMD_PENDING;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) if (ioc->logging_level & MPT_DEBUG_CONFIG)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) _config_display_some_debug(ioc, smid, "config_done", mpi_reply);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) ioc->config_cmds.smid = USHRT_MAX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) complete(&ioc->config_cmds.done);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) * _config_request - main routine for sending config page requests
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) * @ioc: per adapter object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) * @mpi_request: request message frame
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) * @mpi_reply: reply mf payload returned from firmware
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) * @timeout: timeout in seconds
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) * @config_page: contents of the config page
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) * @config_page_sz: size of config page
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) * Context: sleep
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) * A generic API for config page requests to firmware.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) * The ioc->config_cmds.status flag should be MPT3_CMD_NOT_USED before calling
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) * this API.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) * The callback index is set inside `ioc->config_cb_idx.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) * Return: 0 for success, non-zero for failure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) _config_request(struct MPT3SAS_ADAPTER *ioc, Mpi2ConfigRequest_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) *mpi_request, Mpi2ConfigReply_t *mpi_reply, int timeout,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) void *config_page, u16 config_page_sz)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) u16 smid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) Mpi2ConfigRequest_t *config_request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) int r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) u8 retry_count, issue_host_reset = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) struct config_request mem;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) u32 ioc_status = UINT_MAX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) mutex_lock(&ioc->config_cmds.mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) if (ioc->config_cmds.status != MPT3_CMD_NOT_USED) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) ioc_err(ioc, "%s: config_cmd in use\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) mutex_unlock(&ioc->config_cmds.mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) return -EAGAIN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) retry_count = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) memset(&mem, 0, sizeof(struct config_request));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) mpi_request->VF_ID = 0; /* TODO */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) mpi_request->VP_ID = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) if (config_page) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) mpi_request->Header.PageVersion = mpi_reply->Header.PageVersion;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) mpi_request->Header.PageNumber = mpi_reply->Header.PageNumber;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) mpi_request->Header.PageType = mpi_reply->Header.PageType;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) mpi_request->Header.PageLength = mpi_reply->Header.PageLength;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) mpi_request->ExtPageLength = mpi_reply->ExtPageLength;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) mpi_request->ExtPageType = mpi_reply->ExtPageType;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) if (mpi_request->Header.PageLength)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) mem.sz = mpi_request->Header.PageLength * 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) mem.sz = le16_to_cpu(mpi_reply->ExtPageLength) * 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) r = _config_alloc_config_dma_memory(ioc, &mem);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) if (r != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) if (mpi_request->Action ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) MPI2_CONFIG_ACTION_PAGE_WRITE_CURRENT ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) mpi_request->Action ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) MPI2_CONFIG_ACTION_PAGE_WRITE_NVRAM) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) ioc->base_add_sg_single(&mpi_request->PageBufferSGE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) MPT3_CONFIG_COMMON_WRITE_SGLFLAGS | mem.sz,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) mem.page_dma);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) memcpy(mem.page, config_page, min_t(u16, mem.sz,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) config_page_sz));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) memset(config_page, 0, config_page_sz);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) ioc->base_add_sg_single(&mpi_request->PageBufferSGE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) MPT3_CONFIG_COMMON_SGLFLAGS | mem.sz, mem.page_dma);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) memset(mem.page, 0, min_t(u16, mem.sz, config_page_sz));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) retry_config:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) if (retry_count) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) if (retry_count > 2) { /* attempt only 2 retries */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) r = -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) goto free_mem;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) ioc_info(ioc, "%s: attempting retry (%d)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) __func__, retry_count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) r = mpt3sas_wait_for_ioc(ioc, MPT3_CONFIG_PAGE_DEFAULT_TIMEOUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) if (r)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) goto free_mem;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) smid = mpt3sas_base_get_smid(ioc, ioc->config_cb_idx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) if (!smid) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) ioc_err(ioc, "%s: failed obtaining a smid\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) ioc->config_cmds.status = MPT3_CMD_NOT_USED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) r = -EAGAIN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) goto free_mem;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) r = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) memset(ioc->config_cmds.reply, 0, sizeof(Mpi2ConfigReply_t));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) ioc->config_cmds.status = MPT3_CMD_PENDING;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) config_request = mpt3sas_base_get_msg_frame(ioc, smid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) ioc->config_cmds.smid = smid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) memcpy(config_request, mpi_request, sizeof(Mpi2ConfigRequest_t));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) if (ioc->logging_level & MPT_DEBUG_CONFIG)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) _config_display_some_debug(ioc, smid, "config_request", NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) init_completion(&ioc->config_cmds.done);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) ioc->put_smid_default(ioc, smid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) wait_for_completion_timeout(&ioc->config_cmds.done, timeout*HZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) if (!(ioc->config_cmds.status & MPT3_CMD_COMPLETE)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) if (!(ioc->logging_level & MPT_DEBUG_CONFIG))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) _config_display_some_debug(ioc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) smid, "config_request", NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) ioc_err(ioc, "%s: command timeout\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) mpt3sas_base_check_cmd_timeout(ioc, ioc->config_cmds.status,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) mpi_request, sizeof(Mpi2ConfigRequest_t) / 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) retry_count++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) if (ioc->config_cmds.smid == smid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) mpt3sas_base_free_smid(ioc, smid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) if ((ioc->shost_recovery) || (ioc->config_cmds.status &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) MPT3_CMD_RESET) || ioc->pci_error_recovery)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) goto retry_config;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) issue_host_reset = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) r = -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) goto free_mem;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) if (ioc->config_cmds.status & MPT3_CMD_REPLY_VALID) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) memcpy(mpi_reply, ioc->config_cmds.reply,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) sizeof(Mpi2ConfigReply_t));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) /* Reply Frame Sanity Checks to workaround FW issues */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) if ((mpi_request->Header.PageType & 0xF) !=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) (mpi_reply->Header.PageType & 0xF)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) if (!(ioc->logging_level & MPT_DEBUG_CONFIG))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) _config_display_some_debug(ioc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) smid, "config_request", NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) _debug_dump_mf(mpi_request, ioc->request_sz/4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) _debug_dump_reply(mpi_reply, ioc->reply_sz/4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) panic("%s: %s: Firmware BUG: mpi_reply mismatch: Requested PageType(0x%02x) Reply PageType(0x%02x)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) ioc->name, __func__,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) mpi_request->Header.PageType & 0xF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) mpi_reply->Header.PageType & 0xF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) if (((mpi_request->Header.PageType & 0xF) ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) MPI2_CONFIG_PAGETYPE_EXTENDED) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) mpi_request->ExtPageType != mpi_reply->ExtPageType) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) if (!(ioc->logging_level & MPT_DEBUG_CONFIG))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) _config_display_some_debug(ioc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) smid, "config_request", NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) _debug_dump_mf(mpi_request, ioc->request_sz/4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) _debug_dump_reply(mpi_reply, ioc->reply_sz/4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) panic("%s: %s: Firmware BUG: mpi_reply mismatch: Requested ExtPageType(0x%02x) Reply ExtPageType(0x%02x)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) ioc->name, __func__,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) mpi_request->ExtPageType,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) mpi_reply->ExtPageType);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) ioc_status = le16_to_cpu(mpi_reply->IOCStatus)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) & MPI2_IOCSTATUS_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) if (retry_count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) ioc_info(ioc, "%s: retry (%d) completed!!\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) __func__, retry_count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) if ((ioc_status == MPI2_IOCSTATUS_SUCCESS) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) config_page && mpi_request->Action ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) MPI2_CONFIG_ACTION_PAGE_READ_CURRENT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) u8 *p = (u8 *)mem.page;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) /* Config Page Sanity Checks to workaround FW issues */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) if (p) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) if ((mpi_request->Header.PageType & 0xF) !=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) (p[3] & 0xF)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) if (!(ioc->logging_level & MPT_DEBUG_CONFIG))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) _config_display_some_debug(ioc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) smid, "config_request", NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) _debug_dump_mf(mpi_request, ioc->request_sz/4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) _debug_dump_reply(mpi_reply, ioc->reply_sz/4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) _debug_dump_config(p, min_t(u16, mem.sz,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) config_page_sz)/4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) panic("%s: %s: Firmware BUG: config page mismatch: Requested PageType(0x%02x) Reply PageType(0x%02x)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) ioc->name, __func__,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) mpi_request->Header.PageType & 0xF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) p[3] & 0xF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) if (((mpi_request->Header.PageType & 0xF) ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) MPI2_CONFIG_PAGETYPE_EXTENDED) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) (mpi_request->ExtPageType != p[6])) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) if (!(ioc->logging_level & MPT_DEBUG_CONFIG))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) _config_display_some_debug(ioc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) smid, "config_request", NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) _debug_dump_mf(mpi_request, ioc->request_sz/4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) _debug_dump_reply(mpi_reply, ioc->reply_sz/4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) _debug_dump_config(p, min_t(u16, mem.sz,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) config_page_sz)/4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) panic("%s: %s: Firmware BUG: config page mismatch: Requested ExtPageType(0x%02x) Reply ExtPageType(0x%02x)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) ioc->name, __func__,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) mpi_request->ExtPageType, p[6]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) memcpy(config_page, mem.page, min_t(u16, mem.sz,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) config_page_sz));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) free_mem:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) if (config_page)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) _config_free_config_dma_memory(ioc, &mem);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) ioc->config_cmds.status = MPT3_CMD_NOT_USED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) mutex_unlock(&ioc->config_cmds.mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) if (issue_host_reset)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) mpt3sas_base_hard_reset_handler(ioc, FORCE_BIG_HAMMER);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) return r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) * mpt3sas_config_get_manufacturing_pg0 - obtain manufacturing page 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) * @ioc: per adapter object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) * @mpi_reply: reply mf payload returned from firmware
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) * @config_page: contents of the config page
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) * Context: sleep.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) * Return: 0 for success, non-zero for failure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) mpt3sas_config_get_manufacturing_pg0(struct MPT3SAS_ADAPTER *ioc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) Mpi2ConfigReply_t *mpi_reply, Mpi2ManufacturingPage0_t *config_page)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) Mpi2ConfigRequest_t mpi_request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) int r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) mpi_request.Function = MPI2_FUNCTION_CONFIG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_HEADER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) mpi_request.Header.PageType = MPI2_CONFIG_PAGETYPE_MANUFACTURING;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) mpi_request.Header.PageNumber = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) mpi_request.Header.PageVersion = MPI2_MANUFACTURING0_PAGEVERSION;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) ioc->build_zero_len_sge_mpi(ioc, &mpi_request.PageBufferSGE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) r = _config_request(ioc, &mpi_request, mpi_reply,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) MPT3_CONFIG_PAGE_DEFAULT_TIMEOUT, NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) if (r)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_READ_CURRENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) r = _config_request(ioc, &mpi_request, mpi_reply,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) MPT3_CONFIG_PAGE_DEFAULT_TIMEOUT, config_page,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) sizeof(*config_page));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) return r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) * mpt3sas_config_get_manufacturing_pg7 - obtain manufacturing page 7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) * @ioc: per adapter object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) * @mpi_reply: reply mf payload returned from firmware
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) * @config_page: contents of the config page
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) * @sz: size of buffer passed in config_page
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) * Context: sleep.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) * Return: 0 for success, non-zero for failure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) mpt3sas_config_get_manufacturing_pg7(struct MPT3SAS_ADAPTER *ioc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) Mpi2ConfigReply_t *mpi_reply, Mpi2ManufacturingPage7_t *config_page,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) u16 sz)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) Mpi2ConfigRequest_t mpi_request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) int r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) mpi_request.Function = MPI2_FUNCTION_CONFIG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_HEADER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) mpi_request.Header.PageType = MPI2_CONFIG_PAGETYPE_MANUFACTURING;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) mpi_request.Header.PageNumber = 7;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) mpi_request.Header.PageVersion = MPI2_MANUFACTURING7_PAGEVERSION;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) ioc->build_zero_len_sge_mpi(ioc, &mpi_request.PageBufferSGE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) r = _config_request(ioc, &mpi_request, mpi_reply,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) MPT3_CONFIG_PAGE_DEFAULT_TIMEOUT, NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) if (r)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_READ_CURRENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) r = _config_request(ioc, &mpi_request, mpi_reply,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) MPT3_CONFIG_PAGE_DEFAULT_TIMEOUT, config_page,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) sz);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) return r;
^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) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) * mpt3sas_config_get_manufacturing_pg10 - obtain manufacturing page 10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) * @ioc: per adapter object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) * @mpi_reply: reply mf payload returned from firmware
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) * @config_page: contents of the config page
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) * Context: sleep.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) * Return: 0 for success, non-zero for failure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) mpt3sas_config_get_manufacturing_pg10(struct MPT3SAS_ADAPTER *ioc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) Mpi2ConfigReply_t *mpi_reply,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) struct Mpi2ManufacturingPage10_t *config_page)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) Mpi2ConfigRequest_t mpi_request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) int r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) mpi_request.Function = MPI2_FUNCTION_CONFIG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_HEADER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) mpi_request.Header.PageType = MPI2_CONFIG_PAGETYPE_MANUFACTURING;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) mpi_request.Header.PageNumber = 10;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) mpi_request.Header.PageVersion = MPI2_MANUFACTURING0_PAGEVERSION;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) ioc->build_zero_len_sge_mpi(ioc, &mpi_request.PageBufferSGE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) r = _config_request(ioc, &mpi_request, mpi_reply,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) MPT3_CONFIG_PAGE_DEFAULT_TIMEOUT, NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) if (r)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_READ_CURRENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) r = _config_request(ioc, &mpi_request, mpi_reply,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) MPT3_CONFIG_PAGE_DEFAULT_TIMEOUT, config_page,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) sizeof(*config_page));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) return r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) * mpt3sas_config_get_manufacturing_pg11 - obtain manufacturing page 11
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) * @ioc: per adapter object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) * @mpi_reply: reply mf payload returned from firmware
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) * @config_page: contents of the config page
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) * Context: sleep.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) * Return: 0 for success, non-zero for failure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) mpt3sas_config_get_manufacturing_pg11(struct MPT3SAS_ADAPTER *ioc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) Mpi2ConfigReply_t *mpi_reply,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) struct Mpi2ManufacturingPage11_t *config_page)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) Mpi2ConfigRequest_t mpi_request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) int r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) mpi_request.Function = MPI2_FUNCTION_CONFIG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_HEADER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) mpi_request.Header.PageType = MPI2_CONFIG_PAGETYPE_MANUFACTURING;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) mpi_request.Header.PageNumber = 11;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) mpi_request.Header.PageVersion = MPI2_MANUFACTURING0_PAGEVERSION;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) ioc->build_zero_len_sge_mpi(ioc, &mpi_request.PageBufferSGE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) r = _config_request(ioc, &mpi_request, mpi_reply,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) MPT3_CONFIG_PAGE_DEFAULT_TIMEOUT, NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) if (r)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_READ_CURRENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) r = _config_request(ioc, &mpi_request, mpi_reply,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) MPT3_CONFIG_PAGE_DEFAULT_TIMEOUT, config_page,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) sizeof(*config_page));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) return r;
^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) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) * mpt3sas_config_set_manufacturing_pg11 - set manufacturing page 11
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) * @ioc: per adapter object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) * @mpi_reply: reply mf payload returned from firmware
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) * @config_page: contents of the config page
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) * Context: sleep.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) * Return: 0 for success, non-zero for failure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) mpt3sas_config_set_manufacturing_pg11(struct MPT3SAS_ADAPTER *ioc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) Mpi2ConfigReply_t *mpi_reply,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) struct Mpi2ManufacturingPage11_t *config_page)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) Mpi2ConfigRequest_t mpi_request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) int r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) mpi_request.Function = MPI2_FUNCTION_CONFIG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_HEADER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) mpi_request.Header.PageType = MPI2_CONFIG_PAGETYPE_MANUFACTURING;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) mpi_request.Header.PageNumber = 11;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) mpi_request.Header.PageVersion = MPI2_MANUFACTURING0_PAGEVERSION;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) ioc->build_zero_len_sge_mpi(ioc, &mpi_request.PageBufferSGE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) r = _config_request(ioc, &mpi_request, mpi_reply,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) MPT3_CONFIG_PAGE_DEFAULT_TIMEOUT, NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) if (r)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_WRITE_CURRENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) r = _config_request(ioc, &mpi_request, mpi_reply,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) MPT3_CONFIG_PAGE_DEFAULT_TIMEOUT, config_page,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) sizeof(*config_page));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) return r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) * mpt3sas_config_get_bios_pg2 - obtain bios page 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) * @ioc: per adapter object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) * @mpi_reply: reply mf payload returned from firmware
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) * @config_page: contents of the config page
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) * Context: sleep.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) * Return: 0 for success, non-zero for failure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) mpt3sas_config_get_bios_pg2(struct MPT3SAS_ADAPTER *ioc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) Mpi2ConfigReply_t *mpi_reply, Mpi2BiosPage2_t *config_page)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) Mpi2ConfigRequest_t mpi_request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) int r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) mpi_request.Function = MPI2_FUNCTION_CONFIG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_HEADER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) mpi_request.Header.PageType = MPI2_CONFIG_PAGETYPE_BIOS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) mpi_request.Header.PageNumber = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) mpi_request.Header.PageVersion = MPI2_BIOSPAGE2_PAGEVERSION;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) ioc->build_zero_len_sge_mpi(ioc, &mpi_request.PageBufferSGE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) r = _config_request(ioc, &mpi_request, mpi_reply,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) MPT3_CONFIG_PAGE_DEFAULT_TIMEOUT, NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) if (r)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_READ_CURRENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) r = _config_request(ioc, &mpi_request, mpi_reply,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) MPT3_CONFIG_PAGE_DEFAULT_TIMEOUT, config_page,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) sizeof(*config_page));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) return r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) * mpt3sas_config_get_bios_pg3 - obtain bios page 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) * @ioc: per adapter object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) * @mpi_reply: reply mf payload returned from firmware
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) * @config_page: contents of the config page
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) * Context: sleep.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) * Return: 0 for success, non-zero for failure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) mpt3sas_config_get_bios_pg3(struct MPT3SAS_ADAPTER *ioc, Mpi2ConfigReply_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) *mpi_reply, Mpi2BiosPage3_t *config_page)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) Mpi2ConfigRequest_t mpi_request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) int r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) mpi_request.Function = MPI2_FUNCTION_CONFIG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_HEADER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) mpi_request.Header.PageType = MPI2_CONFIG_PAGETYPE_BIOS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) mpi_request.Header.PageNumber = 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) mpi_request.Header.PageVersion = MPI2_BIOSPAGE3_PAGEVERSION;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) ioc->build_zero_len_sge_mpi(ioc, &mpi_request.PageBufferSGE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) r = _config_request(ioc, &mpi_request, mpi_reply,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) MPT3_CONFIG_PAGE_DEFAULT_TIMEOUT, NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) if (r)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743) mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_READ_CURRENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744) r = _config_request(ioc, &mpi_request, mpi_reply,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) MPT3_CONFIG_PAGE_DEFAULT_TIMEOUT, config_page,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) sizeof(*config_page));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) return r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752) * mpt3sas_config_get_iounit_pg0 - obtain iounit page 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) * @ioc: per adapter object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754) * @mpi_reply: reply mf payload returned from firmware
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) * @config_page: contents of the config page
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) * Context: sleep.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) * Return: 0 for success, non-zero for failure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) mpt3sas_config_get_iounit_pg0(struct MPT3SAS_ADAPTER *ioc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) Mpi2ConfigReply_t *mpi_reply, Mpi2IOUnitPage0_t *config_page)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764) Mpi2ConfigRequest_t mpi_request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765) int r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768) mpi_request.Function = MPI2_FUNCTION_CONFIG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769) mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_HEADER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770) mpi_request.Header.PageType = MPI2_CONFIG_PAGETYPE_IO_UNIT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) mpi_request.Header.PageNumber = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772) mpi_request.Header.PageVersion = MPI2_IOUNITPAGE0_PAGEVERSION;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) ioc->build_zero_len_sge_mpi(ioc, &mpi_request.PageBufferSGE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) r = _config_request(ioc, &mpi_request, mpi_reply,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775) MPT3_CONFIG_PAGE_DEFAULT_TIMEOUT, NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776) if (r)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779) mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_READ_CURRENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780) r = _config_request(ioc, &mpi_request, mpi_reply,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781) MPT3_CONFIG_PAGE_DEFAULT_TIMEOUT, config_page,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) sizeof(*config_page));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784) return r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) * mpt3sas_config_get_iounit_pg1 - obtain iounit page 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789) * @ioc: per adapter object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) * @mpi_reply: reply mf payload returned from firmware
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791) * @config_page: contents of the config page
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) * Context: sleep.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) * Return: 0 for success, non-zero for failure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796) int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797) mpt3sas_config_get_iounit_pg1(struct MPT3SAS_ADAPTER *ioc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798) Mpi2ConfigReply_t *mpi_reply, Mpi2IOUnitPage1_t *config_page)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) Mpi2ConfigRequest_t mpi_request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801) int r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803) memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804) mpi_request.Function = MPI2_FUNCTION_CONFIG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805) mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_HEADER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) mpi_request.Header.PageType = MPI2_CONFIG_PAGETYPE_IO_UNIT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807) mpi_request.Header.PageNumber = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808) mpi_request.Header.PageVersion = MPI2_IOUNITPAGE1_PAGEVERSION;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809) ioc->build_zero_len_sge_mpi(ioc, &mpi_request.PageBufferSGE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810) r = _config_request(ioc, &mpi_request, mpi_reply,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811) MPT3_CONFIG_PAGE_DEFAULT_TIMEOUT, NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812) if (r)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815) mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_READ_CURRENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816) r = _config_request(ioc, &mpi_request, mpi_reply,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817) MPT3_CONFIG_PAGE_DEFAULT_TIMEOUT, config_page,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818) sizeof(*config_page));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820) return r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824) * mpt3sas_config_set_iounit_pg1 - set iounit page 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825) * @ioc: per adapter object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826) * @mpi_reply: reply mf payload returned from firmware
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827) * @config_page: contents of the config page
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828) * Context: sleep.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830) * Return: 0 for success, non-zero for failure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832) int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833) mpt3sas_config_set_iounit_pg1(struct MPT3SAS_ADAPTER *ioc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834) Mpi2ConfigReply_t *mpi_reply, Mpi2IOUnitPage1_t *config_page)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836) Mpi2ConfigRequest_t mpi_request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837) int r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839) memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840) mpi_request.Function = MPI2_FUNCTION_CONFIG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841) mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_HEADER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842) mpi_request.Header.PageType = MPI2_CONFIG_PAGETYPE_IO_UNIT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843) mpi_request.Header.PageNumber = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844) mpi_request.Header.PageVersion = MPI2_IOUNITPAGE1_PAGEVERSION;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845) ioc->build_zero_len_sge_mpi(ioc, &mpi_request.PageBufferSGE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846) r = _config_request(ioc, &mpi_request, mpi_reply,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847) MPT3_CONFIG_PAGE_DEFAULT_TIMEOUT, NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848) if (r)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851) mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_WRITE_CURRENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852) r = _config_request(ioc, &mpi_request, mpi_reply,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853) MPT3_CONFIG_PAGE_DEFAULT_TIMEOUT, config_page,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854) sizeof(*config_page));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856) return r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860) * mpt3sas_config_get_iounit_pg3 - obtain iounit page 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861) * @ioc: per adapter object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862) * @mpi_reply: reply mf payload returned from firmware
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863) * @config_page: contents of the config page
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864) * @sz: size of buffer passed in config_page
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865) * Context: sleep.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867) * Return: 0 for success, non-zero for failure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869) int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870) mpt3sas_config_get_iounit_pg3(struct MPT3SAS_ADAPTER *ioc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871) Mpi2ConfigReply_t *mpi_reply, Mpi2IOUnitPage3_t *config_page, u16 sz)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873) Mpi2ConfigRequest_t mpi_request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874) int r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876) memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877) mpi_request.Function = MPI2_FUNCTION_CONFIG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878) mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_HEADER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879) mpi_request.Header.PageType = MPI2_CONFIG_PAGETYPE_IO_UNIT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880) mpi_request.Header.PageNumber = 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881) mpi_request.Header.PageVersion = MPI2_IOUNITPAGE3_PAGEVERSION;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882) ioc->build_zero_len_sge_mpi(ioc, &mpi_request.PageBufferSGE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883) r = _config_request(ioc, &mpi_request, mpi_reply,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884) MPT3_CONFIG_PAGE_DEFAULT_TIMEOUT, NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885) if (r)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888) mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_READ_CURRENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889) r = _config_request(ioc, &mpi_request, mpi_reply,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890) MPT3_CONFIG_PAGE_DEFAULT_TIMEOUT, config_page, sz);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892) return r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 894)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 895) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 896) * mpt3sas_config_get_iounit_pg8 - obtain iounit page 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897) * @ioc: per adapter object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898) * @mpi_reply: reply mf payload returned from firmware
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899) * @config_page: contents of the config page
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900) * Context: sleep.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 902) * Return: 0 for success, non-zero for failure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 903) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 904) int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 905) mpt3sas_config_get_iounit_pg8(struct MPT3SAS_ADAPTER *ioc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 906) Mpi2ConfigReply_t *mpi_reply, Mpi2IOUnitPage8_t *config_page)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 907) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 908) Mpi2ConfigRequest_t mpi_request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 909) int r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 910)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 911) memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 912) mpi_request.Function = MPI2_FUNCTION_CONFIG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 913) mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_HEADER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 914) mpi_request.Header.PageType = MPI2_CONFIG_PAGETYPE_IO_UNIT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 915) mpi_request.Header.PageNumber = 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 916) mpi_request.Header.PageVersion = MPI2_IOUNITPAGE8_PAGEVERSION;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 917) ioc->build_zero_len_sge_mpi(ioc, &mpi_request.PageBufferSGE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 918) r = _config_request(ioc, &mpi_request, mpi_reply,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 919) MPT3_CONFIG_PAGE_DEFAULT_TIMEOUT, NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 920) if (r)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 921) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 922)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 923) mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_READ_CURRENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 924) r = _config_request(ioc, &mpi_request, mpi_reply,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 925) MPT3_CONFIG_PAGE_DEFAULT_TIMEOUT, config_page,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 926) sizeof(*config_page));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 927) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 928) return r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 929) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 930)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 931) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 932) * mpt3sas_config_get_ioc_pg8 - obtain ioc page 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 933) * @ioc: per adapter object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 934) * @mpi_reply: reply mf payload returned from firmware
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 935) * @config_page: contents of the config page
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 936) * Context: sleep.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 937) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 938) * Return: 0 for success, non-zero for failure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 939) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 940) int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 941) mpt3sas_config_get_ioc_pg8(struct MPT3SAS_ADAPTER *ioc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 942) Mpi2ConfigReply_t *mpi_reply, Mpi2IOCPage8_t *config_page)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 943) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 944) Mpi2ConfigRequest_t mpi_request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 945) int r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 946)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 947) memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 948) mpi_request.Function = MPI2_FUNCTION_CONFIG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 949) mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_HEADER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 950) mpi_request.Header.PageType = MPI2_CONFIG_PAGETYPE_IOC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 951) mpi_request.Header.PageNumber = 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 952) mpi_request.Header.PageVersion = MPI2_IOCPAGE8_PAGEVERSION;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 953) ioc->build_zero_len_sge_mpi(ioc, &mpi_request.PageBufferSGE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 954) r = _config_request(ioc, &mpi_request, mpi_reply,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 955) MPT3_CONFIG_PAGE_DEFAULT_TIMEOUT, NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 956) if (r)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 957) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 958)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 959) mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_READ_CURRENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 960) r = _config_request(ioc, &mpi_request, mpi_reply,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 961) MPT3_CONFIG_PAGE_DEFAULT_TIMEOUT, config_page,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 962) sizeof(*config_page));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 963) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 964) return r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 965) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 966) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 967) * mpt3sas_config_get_ioc_pg1 - obtain ioc page 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 968) * @ioc: per adapter object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 969) * @mpi_reply: reply mf payload returned from firmware
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 970) * @config_page: contents of the config page
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 971) * Context: sleep.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 972) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 973) * Return: 0 for success, non-zero for failure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 974) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 975) int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 976) mpt3sas_config_get_ioc_pg1(struct MPT3SAS_ADAPTER *ioc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 977) Mpi2ConfigReply_t *mpi_reply, Mpi2IOCPage1_t *config_page)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 978) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 979) Mpi2ConfigRequest_t mpi_request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 980) int r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 981)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 982) memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 983) mpi_request.Function = MPI2_FUNCTION_CONFIG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 984) mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_HEADER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 985) mpi_request.Header.PageType = MPI2_CONFIG_PAGETYPE_IOC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 986) mpi_request.Header.PageNumber = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 987) mpi_request.Header.PageVersion = MPI2_IOCPAGE8_PAGEVERSION;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 988) ioc->build_zero_len_sge_mpi(ioc, &mpi_request.PageBufferSGE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 989) r = _config_request(ioc, &mpi_request, mpi_reply,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 990) MPT3_CONFIG_PAGE_DEFAULT_TIMEOUT, NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 991) if (r)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 992) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 993)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 994) mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_READ_CURRENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 995) r = _config_request(ioc, &mpi_request, mpi_reply,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 996) MPT3_CONFIG_PAGE_DEFAULT_TIMEOUT, config_page,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 997) sizeof(*config_page));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 998) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 999) return r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003) * mpt3sas_config_set_ioc_pg1 - modify ioc page 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004) * @ioc: per adapter object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) * @mpi_reply: reply mf payload returned from firmware
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006) * @config_page: contents of the config page
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007) * Context: sleep.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009) * Return: 0 for success, non-zero for failure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011) int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012) mpt3sas_config_set_ioc_pg1(struct MPT3SAS_ADAPTER *ioc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013) Mpi2ConfigReply_t *mpi_reply, Mpi2IOCPage1_t *config_page)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015) Mpi2ConfigRequest_t mpi_request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016) int r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018) memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019) mpi_request.Function = MPI2_FUNCTION_CONFIG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020) mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_HEADER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) mpi_request.Header.PageType = MPI2_CONFIG_PAGETYPE_IOC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022) mpi_request.Header.PageNumber = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023) mpi_request.Header.PageVersion = MPI2_IOCPAGE8_PAGEVERSION;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024) ioc->build_zero_len_sge_mpi(ioc, &mpi_request.PageBufferSGE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025) r = _config_request(ioc, &mpi_request, mpi_reply,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026) MPT3_CONFIG_PAGE_DEFAULT_TIMEOUT, NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027) if (r)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030) mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_WRITE_CURRENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) r = _config_request(ioc, &mpi_request, mpi_reply,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032) MPT3_CONFIG_PAGE_DEFAULT_TIMEOUT, config_page,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033) sizeof(*config_page));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035) return r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039) * mpt3sas_config_get_sas_device_pg0 - obtain sas device page 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040) * @ioc: per adapter object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041) * @mpi_reply: reply mf payload returned from firmware
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042) * @config_page: contents of the config page
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043) * @form: GET_NEXT_HANDLE or HANDLE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044) * @handle: device handle
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045) * Context: sleep.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047) * Return: 0 for success, non-zero for failure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049) int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050) mpt3sas_config_get_sas_device_pg0(struct MPT3SAS_ADAPTER *ioc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051) Mpi2ConfigReply_t *mpi_reply, Mpi2SasDevicePage0_t *config_page,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052) u32 form, u32 handle)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054) Mpi2ConfigRequest_t mpi_request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055) int r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057) memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058) mpi_request.Function = MPI2_FUNCTION_CONFIG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059) mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_HEADER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060) mpi_request.Header.PageType = MPI2_CONFIG_PAGETYPE_EXTENDED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061) mpi_request.ExtPageType = MPI2_CONFIG_EXTPAGETYPE_SAS_DEVICE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062) mpi_request.Header.PageVersion = MPI2_SASDEVICE0_PAGEVERSION;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063) mpi_request.Header.PageNumber = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064) ioc->build_zero_len_sge_mpi(ioc, &mpi_request.PageBufferSGE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065) r = _config_request(ioc, &mpi_request, mpi_reply,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066) MPT3_CONFIG_PAGE_DEFAULT_TIMEOUT, NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067) if (r)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070) mpi_request.PageAddress = cpu_to_le32(form | handle);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071) mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_READ_CURRENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072) r = _config_request(ioc, &mpi_request, mpi_reply,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073) MPT3_CONFIG_PAGE_DEFAULT_TIMEOUT, config_page,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074) sizeof(*config_page));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076) return r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080) * mpt3sas_config_get_sas_device_pg1 - obtain sas device page 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081) * @ioc: per adapter object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082) * @mpi_reply: reply mf payload returned from firmware
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083) * @config_page: contents of the config page
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084) * @form: GET_NEXT_HANDLE or HANDLE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085) * @handle: device handle
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086) * Context: sleep.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088) * Return: 0 for success, non-zero for failure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090) int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091) mpt3sas_config_get_sas_device_pg1(struct MPT3SAS_ADAPTER *ioc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092) Mpi2ConfigReply_t *mpi_reply, Mpi2SasDevicePage1_t *config_page,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093) u32 form, u32 handle)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095) Mpi2ConfigRequest_t mpi_request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096) int r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098) memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099) mpi_request.Function = MPI2_FUNCTION_CONFIG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100) mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_HEADER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101) mpi_request.Header.PageType = MPI2_CONFIG_PAGETYPE_EXTENDED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102) mpi_request.ExtPageType = MPI2_CONFIG_EXTPAGETYPE_SAS_DEVICE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103) mpi_request.Header.PageVersion = MPI2_SASDEVICE1_PAGEVERSION;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104) mpi_request.Header.PageNumber = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105) ioc->build_zero_len_sge_mpi(ioc, &mpi_request.PageBufferSGE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106) r = _config_request(ioc, &mpi_request, mpi_reply,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107) MPT3_CONFIG_PAGE_DEFAULT_TIMEOUT, NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108) if (r)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111) mpi_request.PageAddress = cpu_to_le32(form | handle);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112) mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_READ_CURRENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113) r = _config_request(ioc, &mpi_request, mpi_reply,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114) MPT3_CONFIG_PAGE_DEFAULT_TIMEOUT, config_page,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115) sizeof(*config_page));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117) return r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121) * mpt3sas_config_get_pcie_device_pg0 - obtain pcie device page 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122) * @ioc: per adapter object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123) * @mpi_reply: reply mf payload returned from firmware
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124) * @config_page: contents of the config page
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125) * @form: GET_NEXT_HANDLE or HANDLE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126) * @handle: device handle
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127) * Context: sleep.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129) * Return: 0 for success, non-zero for failure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131) int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132) mpt3sas_config_get_pcie_device_pg0(struct MPT3SAS_ADAPTER *ioc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133) Mpi2ConfigReply_t *mpi_reply, Mpi26PCIeDevicePage0_t *config_page,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134) u32 form, u32 handle)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136) Mpi2ConfigRequest_t mpi_request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137) int r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1139) memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1140) mpi_request.Function = MPI2_FUNCTION_CONFIG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1141) mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_HEADER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1142) mpi_request.Header.PageType = MPI2_CONFIG_PAGETYPE_EXTENDED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1143) mpi_request.ExtPageType = MPI2_CONFIG_EXTPAGETYPE_PCIE_DEVICE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1144) mpi_request.Header.PageVersion = MPI26_PCIEDEVICE0_PAGEVERSION;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1145) mpi_request.Header.PageNumber = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1146) ioc->build_zero_len_sge_mpi(ioc, &mpi_request.PageBufferSGE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1147) r = _config_request(ioc, &mpi_request, mpi_reply,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1148) MPT3_CONFIG_PAGE_DEFAULT_TIMEOUT, NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1149) if (r)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1150) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1151)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1152) mpi_request.PageAddress = cpu_to_le32(form | handle);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1153) mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_READ_CURRENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1154) r = _config_request(ioc, &mpi_request, mpi_reply,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1155) MPT3_CONFIG_PAGE_DEFAULT_TIMEOUT, config_page,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1156) sizeof(*config_page));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1157) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1158) return r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1159) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1160)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1161) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1162) * mpt3sas_config_get_pcie_device_pg2 - obtain pcie device page 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1163) * @ioc: per adapter object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1164) * @mpi_reply: reply mf payload returned from firmware
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1165) * @config_page: contents of the config page
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1166) * @form: GET_NEXT_HANDLE or HANDLE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1167) * @handle: device handle
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1168) * Context: sleep.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1169) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1170) * Return: 0 for success, non-zero for failure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1171) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1172) int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1173) mpt3sas_config_get_pcie_device_pg2(struct MPT3SAS_ADAPTER *ioc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1174) Mpi2ConfigReply_t *mpi_reply, Mpi26PCIeDevicePage2_t *config_page,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1175) u32 form, u32 handle)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1176) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1177) Mpi2ConfigRequest_t mpi_request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1178) int r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1179)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1180) memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1181) mpi_request.Function = MPI2_FUNCTION_CONFIG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1182) mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_HEADER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1183) mpi_request.Header.PageType = MPI2_CONFIG_PAGETYPE_EXTENDED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1184) mpi_request.ExtPageType = MPI2_CONFIG_EXTPAGETYPE_PCIE_DEVICE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1185) mpi_request.Header.PageVersion = MPI26_PCIEDEVICE2_PAGEVERSION;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1186) mpi_request.Header.PageNumber = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1187) ioc->build_zero_len_sge_mpi(ioc, &mpi_request.PageBufferSGE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1188) r = _config_request(ioc, &mpi_request, mpi_reply,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1189) MPT3_CONFIG_PAGE_DEFAULT_TIMEOUT, NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1190) if (r)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1191) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1192)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1193) mpi_request.PageAddress = cpu_to_le32(form | handle);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1194) mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_READ_CURRENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1195) r = _config_request(ioc, &mpi_request, mpi_reply,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1196) MPT3_CONFIG_PAGE_DEFAULT_TIMEOUT, config_page,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1197) sizeof(*config_page));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1198) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1199) return r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1200) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1201)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1202) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1203) * mpt3sas_config_get_number_hba_phys - obtain number of phys on the host
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1204) * @ioc: per adapter object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1205) * @num_phys: pointer returned with the number of phys
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1206) * Context: sleep.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1207) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1208) * Return: 0 for success, non-zero for failure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1209) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1210) int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1211) mpt3sas_config_get_number_hba_phys(struct MPT3SAS_ADAPTER *ioc, u8 *num_phys)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1212) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1213) Mpi2ConfigRequest_t mpi_request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1214) int r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1215) u16 ioc_status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1216) Mpi2ConfigReply_t mpi_reply;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1217) Mpi2SasIOUnitPage0_t config_page;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1218)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1219) *num_phys = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1220) memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1221) mpi_request.Function = MPI2_FUNCTION_CONFIG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1222) mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_HEADER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1223) mpi_request.Header.PageType = MPI2_CONFIG_PAGETYPE_EXTENDED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1224) mpi_request.ExtPageType = MPI2_CONFIG_EXTPAGETYPE_SAS_IO_UNIT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1225) mpi_request.Header.PageNumber = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1226) mpi_request.Header.PageVersion = MPI2_SASIOUNITPAGE0_PAGEVERSION;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1227) ioc->build_zero_len_sge_mpi(ioc, &mpi_request.PageBufferSGE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1228) r = _config_request(ioc, &mpi_request, &mpi_reply,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1229) MPT3_CONFIG_PAGE_DEFAULT_TIMEOUT, NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1230) if (r)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1231) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1232)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1233) mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_READ_CURRENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1234) r = _config_request(ioc, &mpi_request, &mpi_reply,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1235) MPT3_CONFIG_PAGE_DEFAULT_TIMEOUT, &config_page,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1236) sizeof(Mpi2SasIOUnitPage0_t));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1237) if (!r) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1238) ioc_status = le16_to_cpu(mpi_reply.IOCStatus) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1239) MPI2_IOCSTATUS_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1240) if (ioc_status == MPI2_IOCSTATUS_SUCCESS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1241) *num_phys = config_page.NumPhys;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1242) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1243) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1244) return r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1245) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1246)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1247) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1248) * mpt3sas_config_get_sas_iounit_pg0 - obtain sas iounit page 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1249) * @ioc: per adapter object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1250) * @mpi_reply: reply mf payload returned from firmware
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1251) * @config_page: contents of the config page
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1252) * @sz: size of buffer passed in config_page
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1253) * Context: sleep.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1254) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1255) * Calling function should call config_get_number_hba_phys prior to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1256) * this function, so enough memory is allocated for config_page.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1257) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1258) * Return: 0 for success, non-zero for failure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1259) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1260) int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1261) mpt3sas_config_get_sas_iounit_pg0(struct MPT3SAS_ADAPTER *ioc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1262) Mpi2ConfigReply_t *mpi_reply, Mpi2SasIOUnitPage0_t *config_page,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1263) u16 sz)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1264) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1265) Mpi2ConfigRequest_t mpi_request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1266) int r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1267)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1268) memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1269) mpi_request.Function = MPI2_FUNCTION_CONFIG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1270) mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_HEADER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1271) mpi_request.Header.PageType = MPI2_CONFIG_PAGETYPE_EXTENDED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1272) mpi_request.ExtPageType = MPI2_CONFIG_EXTPAGETYPE_SAS_IO_UNIT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1273) mpi_request.Header.PageNumber = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1274) mpi_request.Header.PageVersion = MPI2_SASIOUNITPAGE0_PAGEVERSION;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1275) ioc->build_zero_len_sge_mpi(ioc, &mpi_request.PageBufferSGE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1276) r = _config_request(ioc, &mpi_request, mpi_reply,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1277) MPT3_CONFIG_PAGE_DEFAULT_TIMEOUT, NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1278) if (r)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1279) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1280)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1281) mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_READ_CURRENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1282) r = _config_request(ioc, &mpi_request, mpi_reply,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1283) MPT3_CONFIG_PAGE_DEFAULT_TIMEOUT, config_page, sz);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1284) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1285) return r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1286) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1287)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1288) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1289) * mpt3sas_config_get_sas_iounit_pg1 - obtain sas iounit page 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1290) * @ioc: per adapter object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1291) * @mpi_reply: reply mf payload returned from firmware
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1292) * @config_page: contents of the config page
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1293) * @sz: size of buffer passed in config_page
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1294) * Context: sleep.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1295) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1296) * Calling function should call config_get_number_hba_phys prior to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1297) * this function, so enough memory is allocated for config_page.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1298) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1299) * Return: 0 for success, non-zero for failure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1300) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1301) int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1302) mpt3sas_config_get_sas_iounit_pg1(struct MPT3SAS_ADAPTER *ioc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1303) Mpi2ConfigReply_t *mpi_reply, Mpi2SasIOUnitPage1_t *config_page,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1304) u16 sz)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1305) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1306) Mpi2ConfigRequest_t mpi_request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1307) int r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1308)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1309) memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1310) mpi_request.Function = MPI2_FUNCTION_CONFIG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1311) mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_HEADER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1312) mpi_request.Header.PageType = MPI2_CONFIG_PAGETYPE_EXTENDED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1313) mpi_request.ExtPageType = MPI2_CONFIG_EXTPAGETYPE_SAS_IO_UNIT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1314) mpi_request.Header.PageNumber = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1315) mpi_request.Header.PageVersion = MPI2_SASIOUNITPAGE1_PAGEVERSION;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1316) ioc->build_zero_len_sge_mpi(ioc, &mpi_request.PageBufferSGE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1317) r = _config_request(ioc, &mpi_request, mpi_reply,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1318) MPT3_CONFIG_PAGE_DEFAULT_TIMEOUT, NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1319) if (r)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1320) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1321)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1322) mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_READ_CURRENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1323) r = _config_request(ioc, &mpi_request, mpi_reply,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1324) MPT3_CONFIG_PAGE_DEFAULT_TIMEOUT, config_page, sz);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1325) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1326) return r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1327) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1328)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1329) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1330) * mpt3sas_config_set_sas_iounit_pg1 - send sas iounit page 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1331) * @ioc: per adapter object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1332) * @mpi_reply: reply mf payload returned from firmware
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1333) * @config_page: contents of the config page
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1334) * @sz: size of buffer passed in config_page
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1335) * Context: sleep.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1336) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1337) * Calling function should call config_get_number_hba_phys prior to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1338) * this function, so enough memory is allocated for config_page.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1339) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1340) * Return: 0 for success, non-zero for failure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1341) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1342) int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1343) mpt3sas_config_set_sas_iounit_pg1(struct MPT3SAS_ADAPTER *ioc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1344) Mpi2ConfigReply_t *mpi_reply, Mpi2SasIOUnitPage1_t *config_page,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1345) u16 sz)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1346) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1347) Mpi2ConfigRequest_t mpi_request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1348) int r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1349)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1350) memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1351) mpi_request.Function = MPI2_FUNCTION_CONFIG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1352) mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_HEADER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1353) mpi_request.Header.PageType = MPI2_CONFIG_PAGETYPE_EXTENDED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1354) mpi_request.ExtPageType = MPI2_CONFIG_EXTPAGETYPE_SAS_IO_UNIT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1355) mpi_request.Header.PageNumber = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1356) mpi_request.Header.PageVersion = MPI2_SASIOUNITPAGE1_PAGEVERSION;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1357) ioc->build_zero_len_sge_mpi(ioc, &mpi_request.PageBufferSGE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1358) r = _config_request(ioc, &mpi_request, mpi_reply,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1359) MPT3_CONFIG_PAGE_DEFAULT_TIMEOUT, NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1360) if (r)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1361) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1362)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1363) mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_WRITE_CURRENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1364) _config_request(ioc, &mpi_request, mpi_reply,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1365) MPT3_CONFIG_PAGE_DEFAULT_TIMEOUT, config_page, sz);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1366) mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_WRITE_NVRAM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1367) r = _config_request(ioc, &mpi_request, mpi_reply,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1368) MPT3_CONFIG_PAGE_DEFAULT_TIMEOUT, config_page, sz);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1369) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1370) return r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1371) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1372)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1373) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1374) * mpt3sas_config_get_expander_pg0 - obtain expander page 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1375) * @ioc: per adapter object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1376) * @mpi_reply: reply mf payload returned from firmware
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1377) * @config_page: contents of the config page
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1378) * @form: GET_NEXT_HANDLE or HANDLE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1379) * @handle: expander handle
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1380) * Context: sleep.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1381) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1382) * Return: 0 for success, non-zero for failure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1383) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1384) int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1385) mpt3sas_config_get_expander_pg0(struct MPT3SAS_ADAPTER *ioc, Mpi2ConfigReply_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1386) *mpi_reply, Mpi2ExpanderPage0_t *config_page, u32 form, u32 handle)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1387) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1388) Mpi2ConfigRequest_t mpi_request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1389) int r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1390)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1391) memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1392) mpi_request.Function = MPI2_FUNCTION_CONFIG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1393) mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_HEADER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1394) mpi_request.Header.PageType = MPI2_CONFIG_PAGETYPE_EXTENDED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1395) mpi_request.ExtPageType = MPI2_CONFIG_EXTPAGETYPE_SAS_EXPANDER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1396) mpi_request.Header.PageNumber = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1397) mpi_request.Header.PageVersion = MPI2_SASEXPANDER0_PAGEVERSION;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1398) ioc->build_zero_len_sge_mpi(ioc, &mpi_request.PageBufferSGE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1399) r = _config_request(ioc, &mpi_request, mpi_reply,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1400) MPT3_CONFIG_PAGE_DEFAULT_TIMEOUT, NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1401) if (r)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1402) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1403)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1404) mpi_request.PageAddress = cpu_to_le32(form | handle);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1405) mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_READ_CURRENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1406) r = _config_request(ioc, &mpi_request, mpi_reply,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1407) MPT3_CONFIG_PAGE_DEFAULT_TIMEOUT, config_page,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1408) sizeof(*config_page));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1409) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1410) return r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1411) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1412)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1413) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1414) * mpt3sas_config_get_expander_pg1 - obtain expander page 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1415) * @ioc: per adapter object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1416) * @mpi_reply: reply mf payload returned from firmware
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1417) * @config_page: contents of the config page
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1418) * @phy_number: phy number
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1419) * @handle: expander handle
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1420) * Context: sleep.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1421) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1422) * Return: 0 for success, non-zero for failure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1423) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1424) int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1425) mpt3sas_config_get_expander_pg1(struct MPT3SAS_ADAPTER *ioc, Mpi2ConfigReply_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1426) *mpi_reply, Mpi2ExpanderPage1_t *config_page, u32 phy_number,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1427) u16 handle)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1428) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1429) Mpi2ConfigRequest_t mpi_request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1430) int r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1431)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1432) memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1433) mpi_request.Function = MPI2_FUNCTION_CONFIG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1434) mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_HEADER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1435) mpi_request.Header.PageType = MPI2_CONFIG_PAGETYPE_EXTENDED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1436) mpi_request.ExtPageType = MPI2_CONFIG_EXTPAGETYPE_SAS_EXPANDER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1437) mpi_request.Header.PageNumber = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1438) mpi_request.Header.PageVersion = MPI2_SASEXPANDER1_PAGEVERSION;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1439) ioc->build_zero_len_sge_mpi(ioc, &mpi_request.PageBufferSGE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1440) r = _config_request(ioc, &mpi_request, mpi_reply,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1441) MPT3_CONFIG_PAGE_DEFAULT_TIMEOUT, NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1442) if (r)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1443) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1444)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1445) mpi_request.PageAddress =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1446) cpu_to_le32(MPI2_SAS_EXPAND_PGAD_FORM_HNDL_PHY_NUM |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1447) (phy_number << MPI2_SAS_EXPAND_PGAD_PHYNUM_SHIFT) | handle);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1448) mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_READ_CURRENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1449) r = _config_request(ioc, &mpi_request, mpi_reply,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1450) MPT3_CONFIG_PAGE_DEFAULT_TIMEOUT, config_page,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1451) sizeof(*config_page));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1452) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1453) return r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1454) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1455)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1456) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1457) * mpt3sas_config_get_enclosure_pg0 - obtain enclosure page 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1458) * @ioc: per adapter object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1459) * @mpi_reply: reply mf payload returned from firmware
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1460) * @config_page: contents of the config page
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1461) * @form: GET_NEXT_HANDLE or HANDLE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1462) * @handle: expander handle
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1463) * Context: sleep.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1464) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1465) * Return: 0 for success, non-zero for failure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1466) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1467) int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1468) mpt3sas_config_get_enclosure_pg0(struct MPT3SAS_ADAPTER *ioc, Mpi2ConfigReply_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1469) *mpi_reply, Mpi2SasEnclosurePage0_t *config_page, u32 form, u32 handle)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1470) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1471) Mpi2ConfigRequest_t mpi_request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1472) int r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1473)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1474) memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1475) mpi_request.Function = MPI2_FUNCTION_CONFIG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1476) mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_HEADER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1477) mpi_request.Header.PageType = MPI2_CONFIG_PAGETYPE_EXTENDED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1478) mpi_request.ExtPageType = MPI2_CONFIG_EXTPAGETYPE_ENCLOSURE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1479) mpi_request.Header.PageNumber = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1480) mpi_request.Header.PageVersion = MPI2_SASENCLOSURE0_PAGEVERSION;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1481) ioc->build_zero_len_sge_mpi(ioc, &mpi_request.PageBufferSGE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1482) r = _config_request(ioc, &mpi_request, mpi_reply,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1483) MPT3_CONFIG_PAGE_DEFAULT_TIMEOUT, NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1484) if (r)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1485) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1486)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1487) mpi_request.PageAddress = cpu_to_le32(form | handle);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1488) mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_READ_CURRENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1489) r = _config_request(ioc, &mpi_request, mpi_reply,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1490) MPT3_CONFIG_PAGE_DEFAULT_TIMEOUT, config_page,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1491) sizeof(*config_page));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1492) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1493) return r;
^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) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1497) * mpt3sas_config_get_phy_pg0 - obtain phy page 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1498) * @ioc: per adapter object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1499) * @mpi_reply: reply mf payload returned from firmware
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1500) * @config_page: contents of the config page
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1501) * @phy_number: phy number
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1502) * Context: sleep.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1503) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1504) * Return: 0 for success, non-zero for failure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1505) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1506) int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1507) mpt3sas_config_get_phy_pg0(struct MPT3SAS_ADAPTER *ioc, Mpi2ConfigReply_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1508) *mpi_reply, Mpi2SasPhyPage0_t *config_page, u32 phy_number)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1509) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1510) Mpi2ConfigRequest_t mpi_request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1511) int r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1512)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1513) memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1514) mpi_request.Function = MPI2_FUNCTION_CONFIG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1515) mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_HEADER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1516) mpi_request.Header.PageType = MPI2_CONFIG_PAGETYPE_EXTENDED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1517) mpi_request.ExtPageType = MPI2_CONFIG_EXTPAGETYPE_SAS_PHY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1518) mpi_request.Header.PageNumber = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1519) mpi_request.Header.PageVersion = MPI2_SASPHY0_PAGEVERSION;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1520) ioc->build_zero_len_sge_mpi(ioc, &mpi_request.PageBufferSGE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1521) r = _config_request(ioc, &mpi_request, mpi_reply,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1522) MPT3_CONFIG_PAGE_DEFAULT_TIMEOUT, NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1523) if (r)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1524) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1525)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1526) mpi_request.PageAddress =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1527) cpu_to_le32(MPI2_SAS_PHY_PGAD_FORM_PHY_NUMBER | phy_number);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1528) mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_READ_CURRENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1529) r = _config_request(ioc, &mpi_request, mpi_reply,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1530) MPT3_CONFIG_PAGE_DEFAULT_TIMEOUT, config_page,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1531) sizeof(*config_page));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1532) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1533) return r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1534) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1535)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1536) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1537) * mpt3sas_config_get_phy_pg1 - obtain phy page 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1538) * @ioc: per adapter object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1539) * @mpi_reply: reply mf payload returned from firmware
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1540) * @config_page: contents of the config page
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1541) * @phy_number: phy number
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1542) * Context: sleep.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1543) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1544) * Return: 0 for success, non-zero for failure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1545) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1546) int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1547) mpt3sas_config_get_phy_pg1(struct MPT3SAS_ADAPTER *ioc, Mpi2ConfigReply_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1548) *mpi_reply, Mpi2SasPhyPage1_t *config_page, u32 phy_number)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1549) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1550) Mpi2ConfigRequest_t mpi_request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1551) int r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1552)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1553) memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1554) mpi_request.Function = MPI2_FUNCTION_CONFIG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1555) mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_HEADER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1556) mpi_request.Header.PageType = MPI2_CONFIG_PAGETYPE_EXTENDED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1557) mpi_request.ExtPageType = MPI2_CONFIG_EXTPAGETYPE_SAS_PHY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1558) mpi_request.Header.PageNumber = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1559) mpi_request.Header.PageVersion = MPI2_SASPHY1_PAGEVERSION;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1560) ioc->build_zero_len_sge_mpi(ioc, &mpi_request.PageBufferSGE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1561) r = _config_request(ioc, &mpi_request, mpi_reply,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1562) MPT3_CONFIG_PAGE_DEFAULT_TIMEOUT, NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1563) if (r)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1564) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1565)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1566) mpi_request.PageAddress =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1567) cpu_to_le32(MPI2_SAS_PHY_PGAD_FORM_PHY_NUMBER | phy_number);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1568) mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_READ_CURRENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1569) r = _config_request(ioc, &mpi_request, mpi_reply,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1570) MPT3_CONFIG_PAGE_DEFAULT_TIMEOUT, config_page,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1571) sizeof(*config_page));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1572) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1573) return r;
^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) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1577) * mpt3sas_config_get_raid_volume_pg1 - obtain raid volume page 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1578) * @ioc: per adapter object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1579) * @mpi_reply: reply mf payload returned from firmware
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1580) * @config_page: contents of the config page
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1581) * @form: GET_NEXT_HANDLE or HANDLE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1582) * @handle: volume handle
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1583) * Context: sleep.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1584) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1585) * Return: 0 for success, non-zero for failure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1586) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1587) int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1588) mpt3sas_config_get_raid_volume_pg1(struct MPT3SAS_ADAPTER *ioc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1589) Mpi2ConfigReply_t *mpi_reply, Mpi2RaidVolPage1_t *config_page, u32 form,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1590) u32 handle)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1591) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1592) Mpi2ConfigRequest_t mpi_request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1593) int r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1594)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1595) memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1596) mpi_request.Function = MPI2_FUNCTION_CONFIG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1597) mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_HEADER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1598) mpi_request.Header.PageType = MPI2_CONFIG_PAGETYPE_RAID_VOLUME;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1599) mpi_request.Header.PageNumber = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1600) mpi_request.Header.PageVersion = MPI2_RAIDVOLPAGE1_PAGEVERSION;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1601) ioc->build_zero_len_sge_mpi(ioc, &mpi_request.PageBufferSGE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1602) r = _config_request(ioc, &mpi_request, mpi_reply,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1603) MPT3_CONFIG_PAGE_DEFAULT_TIMEOUT, NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1604) if (r)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1605) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1606)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1607) mpi_request.PageAddress = cpu_to_le32(form | handle);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1608) mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_READ_CURRENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1609) r = _config_request(ioc, &mpi_request, mpi_reply,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1610) MPT3_CONFIG_PAGE_DEFAULT_TIMEOUT, config_page,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1611) sizeof(*config_page));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1612) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1613) return r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1614) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1615)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1616) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1617) * mpt3sas_config_get_number_pds - obtain number of phys disk assigned to volume
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1618) * @ioc: per adapter object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1619) * @handle: volume handle
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1620) * @num_pds: returns pds count
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1621) * Context: sleep.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1622) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1623) * Return: 0 for success, non-zero for failure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1624) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1625) int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1626) mpt3sas_config_get_number_pds(struct MPT3SAS_ADAPTER *ioc, u16 handle,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1627) u8 *num_pds)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1628) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1629) Mpi2ConfigRequest_t mpi_request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1630) Mpi2RaidVolPage0_t config_page;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1631) Mpi2ConfigReply_t mpi_reply;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1632) int r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1633) u16 ioc_status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1634)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1635) memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1636) *num_pds = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1637) mpi_request.Function = MPI2_FUNCTION_CONFIG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1638) mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_HEADER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1639) mpi_request.Header.PageType = MPI2_CONFIG_PAGETYPE_RAID_VOLUME;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1640) mpi_request.Header.PageNumber = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1641) mpi_request.Header.PageVersion = MPI2_RAIDVOLPAGE0_PAGEVERSION;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1642) ioc->build_zero_len_sge_mpi(ioc, &mpi_request.PageBufferSGE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1643) r = _config_request(ioc, &mpi_request, &mpi_reply,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1644) MPT3_CONFIG_PAGE_DEFAULT_TIMEOUT, NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1645) if (r)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1646) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1647)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1648) mpi_request.PageAddress =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1649) cpu_to_le32(MPI2_RAID_VOLUME_PGAD_FORM_HANDLE | handle);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1650) mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_READ_CURRENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1651) r = _config_request(ioc, &mpi_request, &mpi_reply,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1652) MPT3_CONFIG_PAGE_DEFAULT_TIMEOUT, &config_page,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1653) sizeof(Mpi2RaidVolPage0_t));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1654) if (!r) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1655) ioc_status = le16_to_cpu(mpi_reply.IOCStatus) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1656) MPI2_IOCSTATUS_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1657) if (ioc_status == MPI2_IOCSTATUS_SUCCESS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1658) *num_pds = config_page.NumPhysDisks;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1659) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1660)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1661) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1662) return r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1663) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1664)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1665) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1666) * mpt3sas_config_get_raid_volume_pg0 - obtain raid volume page 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1667) * @ioc: per adapter object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1668) * @mpi_reply: reply mf payload returned from firmware
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1669) * @config_page: contents of the config page
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1670) * @form: GET_NEXT_HANDLE or HANDLE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1671) * @handle: volume handle
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1672) * @sz: size of buffer passed in config_page
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1673) * Context: sleep.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1674) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1675) * Return: 0 for success, non-zero for failure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1676) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1677) int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1678) mpt3sas_config_get_raid_volume_pg0(struct MPT3SAS_ADAPTER *ioc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1679) Mpi2ConfigReply_t *mpi_reply, Mpi2RaidVolPage0_t *config_page, u32 form,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1680) u32 handle, u16 sz)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1681) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1682) Mpi2ConfigRequest_t mpi_request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1683) int r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1684)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1685) memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1686) mpi_request.Function = MPI2_FUNCTION_CONFIG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1687) mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_HEADER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1688) mpi_request.Header.PageType = MPI2_CONFIG_PAGETYPE_RAID_VOLUME;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1689) mpi_request.Header.PageNumber = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1690) mpi_request.Header.PageVersion = MPI2_RAIDVOLPAGE0_PAGEVERSION;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1691) ioc->build_zero_len_sge_mpi(ioc, &mpi_request.PageBufferSGE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1692) r = _config_request(ioc, &mpi_request, mpi_reply,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1693) MPT3_CONFIG_PAGE_DEFAULT_TIMEOUT, NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1694) if (r)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1695) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1696)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1697) mpi_request.PageAddress = cpu_to_le32(form | handle);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1698) mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_READ_CURRENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1699) r = _config_request(ioc, &mpi_request, mpi_reply,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1700) MPT3_CONFIG_PAGE_DEFAULT_TIMEOUT, config_page, sz);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1701) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1702) return r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1703) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1704)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1705) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1706) * mpt3sas_config_get_phys_disk_pg0 - obtain phys disk page 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1707) * @ioc: per adapter object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1708) * @mpi_reply: reply mf payload returned from firmware
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1709) * @config_page: contents of the config page
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1710) * @form: GET_NEXT_PHYSDISKNUM, PHYSDISKNUM, DEVHANDLE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1711) * @form_specific: specific to the form
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1712) * Context: sleep.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1713) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1714) * Return: 0 for success, non-zero for failure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1715) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1716) int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1717) mpt3sas_config_get_phys_disk_pg0(struct MPT3SAS_ADAPTER *ioc, Mpi2ConfigReply_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1718) *mpi_reply, Mpi2RaidPhysDiskPage0_t *config_page, u32 form,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1719) u32 form_specific)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1720) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1721) Mpi2ConfigRequest_t mpi_request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1722) int r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1723)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1724) memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1725) mpi_request.Function = MPI2_FUNCTION_CONFIG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1726) mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_HEADER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1727) mpi_request.Header.PageType = MPI2_CONFIG_PAGETYPE_RAID_PHYSDISK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1728) mpi_request.Header.PageNumber = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1729) mpi_request.Header.PageVersion = MPI2_RAIDPHYSDISKPAGE0_PAGEVERSION;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1730) ioc->build_zero_len_sge_mpi(ioc, &mpi_request.PageBufferSGE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1731) r = _config_request(ioc, &mpi_request, mpi_reply,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1732) MPT3_CONFIG_PAGE_DEFAULT_TIMEOUT, NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1733) if (r)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1734) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1735)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1736) mpi_request.PageAddress = cpu_to_le32(form | form_specific);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1737) mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_READ_CURRENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1738) r = _config_request(ioc, &mpi_request, mpi_reply,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1739) MPT3_CONFIG_PAGE_DEFAULT_TIMEOUT, config_page,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1740) sizeof(*config_page));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1741) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1742) return r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1743) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1744)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1745) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1746) * mpt3sas_config_get_volume_handle - returns volume handle for give hidden
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1747) * raid components
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1748) * @ioc: per adapter object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1749) * @pd_handle: phys disk handle
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1750) * @volume_handle: volume handle
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1751) * Context: sleep.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1752) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1753) * Return: 0 for success, non-zero for failure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1754) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1755) int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1756) mpt3sas_config_get_volume_handle(struct MPT3SAS_ADAPTER *ioc, u16 pd_handle,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1757) u16 *volume_handle)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1758) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1759) Mpi2RaidConfigurationPage0_t *config_page = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1760) Mpi2ConfigRequest_t mpi_request;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1761) Mpi2ConfigReply_t mpi_reply;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1762) int r, i, config_page_sz;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1763) u16 ioc_status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1764) int config_num;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1765) u16 element_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1766) u16 phys_disk_dev_handle;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1767)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1768) *volume_handle = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1769) memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1770) mpi_request.Function = MPI2_FUNCTION_CONFIG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1771) mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_HEADER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1772) mpi_request.Header.PageType = MPI2_CONFIG_PAGETYPE_EXTENDED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1773) mpi_request.ExtPageType = MPI2_CONFIG_EXTPAGETYPE_RAID_CONFIG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1774) mpi_request.Header.PageVersion = MPI2_RAIDCONFIG0_PAGEVERSION;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1775) mpi_request.Header.PageNumber = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1776) ioc->build_zero_len_sge_mpi(ioc, &mpi_request.PageBufferSGE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1777) r = _config_request(ioc, &mpi_request, &mpi_reply,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1778) MPT3_CONFIG_PAGE_DEFAULT_TIMEOUT, NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1779) if (r)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1780) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1781)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1782) mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_READ_CURRENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1783) config_page_sz = (le16_to_cpu(mpi_reply.ExtPageLength) * 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1784) config_page = kmalloc(config_page_sz, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1785) if (!config_page) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1786) r = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1787) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1788) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1789)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1790) config_num = 0xff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1791) while (1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1792) mpi_request.PageAddress = cpu_to_le32(config_num +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1793) MPI2_RAID_PGAD_FORM_GET_NEXT_CONFIGNUM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1794) r = _config_request(ioc, &mpi_request, &mpi_reply,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1795) MPT3_CONFIG_PAGE_DEFAULT_TIMEOUT, config_page,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1796) config_page_sz);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1797) if (r)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1798) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1799) r = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1800) ioc_status = le16_to_cpu(mpi_reply.IOCStatus) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1801) MPI2_IOCSTATUS_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1802) if (ioc_status != MPI2_IOCSTATUS_SUCCESS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1803) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1804) for (i = 0; i < config_page->NumElements; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1805) element_type = le16_to_cpu(config_page->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1806) ConfigElement[i].ElementFlags) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1807) MPI2_RAIDCONFIG0_EFLAGS_MASK_ELEMENT_TYPE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1808) if (element_type ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1809) MPI2_RAIDCONFIG0_EFLAGS_VOL_PHYS_DISK_ELEMENT ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1810) element_type ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1811) MPI2_RAIDCONFIG0_EFLAGS_OCE_ELEMENT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1812) phys_disk_dev_handle =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1813) le16_to_cpu(config_page->ConfigElement[i].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1814) PhysDiskDevHandle);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1815) if (phys_disk_dev_handle == pd_handle) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1816) *volume_handle =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1817) le16_to_cpu(config_page->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1818) ConfigElement[i].VolDevHandle);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1819) r = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1820) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1821) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1822) } else if (element_type ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1823) MPI2_RAIDCONFIG0_EFLAGS_HOT_SPARE_ELEMENT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1824) *volume_handle = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1825) r = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1826) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1827) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1828) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1829) config_num = config_page->ConfigNum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1830) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1831) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1832) kfree(config_page);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1833) return r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1834) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1835)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1836) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1837) * mpt3sas_config_get_volume_wwid - returns wwid given the volume handle
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1838) * @ioc: per adapter object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1839) * @volume_handle: volume handle
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1840) * @wwid: volume wwid
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1841) * Context: sleep.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1842) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1843) * Return: 0 for success, non-zero for failure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1844) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1845) int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1846) mpt3sas_config_get_volume_wwid(struct MPT3SAS_ADAPTER *ioc, u16 volume_handle,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1847) u64 *wwid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1848) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1849) Mpi2ConfigReply_t mpi_reply;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1850) Mpi2RaidVolPage1_t raid_vol_pg1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1851)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1852) *wwid = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1853) if (!(mpt3sas_config_get_raid_volume_pg1(ioc, &mpi_reply,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1854) &raid_vol_pg1, MPI2_RAID_VOLUME_PGAD_FORM_HANDLE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1855) volume_handle))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1856) *wwid = le64_to_cpu(raid_vol_pg1.WWID);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1857) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1858) } else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1859) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1860) }