Module Name: src Committed By: bouyer Date: Sat Nov 24 18:10:29 UTC 2018
Modified Files: src/sys/dev/ic: mfi.c mfireg.h Log Message: Add some definitions from OpenBSD, needed by the upcoming mfii driver. No functionnal change. To generate a diff of this commit: cvs rdiff -u -r1.59 -r1.60 src/sys/dev/ic/mfi.c cvs rdiff -u -r1.8 -r1.9 src/sys/dev/ic/mfireg.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/ic/mfi.c diff -u src/sys/dev/ic/mfi.c:1.59 src/sys/dev/ic/mfi.c:1.60 --- src/sys/dev/ic/mfi.c:1.59 Mon Sep 3 16:29:31 2018 +++ src/sys/dev/ic/mfi.c Sat Nov 24 18:10:29 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: mfi.c,v 1.59 2018/09/03 16:29:31 riastradh Exp $ */ +/* $NetBSD: mfi.c,v 1.60 2018/11/24 18:10:29 bouyer Exp $ */ /* $OpenBSD: mfi.c,v 1.66 2006/11/28 23:59:45 dlg Exp $ */ /* @@ -73,7 +73,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: mfi.c,v 1.59 2018/09/03 16:29:31 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: mfi.c,v 1.60 2018/11/24 18:10:29 bouyer Exp $"); #include "bio.h" @@ -1879,7 +1879,7 @@ mfi_mgmt(struct mfi_ccb *ccb, struct scs DNPRINTF(MFI_D_MISC, "%s: mfi_mgmt %#x\n", DEVNAME(ccb->ccb_sc), opc); dcmd = &ccb->ccb_frame->mfr_dcmd; - memset(dcmd->mdf_mbox, 0, MFI_MBOX_SIZE); + memset(dcmd->mdf_mbox.b, 0, MFI_MBOX_SIZE); dcmd->mdf_header.mfh_cmd = MFI_CMD_DCMD; dcmd->mdf_header.mfh_timeout = 0; @@ -1893,7 +1893,7 @@ mfi_mgmt(struct mfi_ccb *ccb, struct scs /* handle special opcodes */ if (mbox) - memcpy(dcmd->mdf_mbox, mbox, MFI_MBOX_SIZE); + memcpy(dcmd->mdf_mbox.b, mbox, MFI_MBOX_SIZE); if (dir != MFI_DATA_NONE) { dcmd->mdf_header.mfh_data_len = len; @@ -2017,7 +2017,7 @@ mfi_ioctl_inq(struct mfi_softc *sc, stru /* get figures */ cfg = malloc(sizeof *cfg, M_DEVBUF, M_WAITOK); - if (mfi_mgmt_internal(sc, MD_DCMD_CONF_GET, MFI_DATA_IN, + if (mfi_mgmt_internal(sc, MR_DCMD_CONF_GET, MFI_DATA_IN, sizeof *cfg, cfg, NULL, false)) goto freeme; @@ -2141,7 +2141,7 @@ mfi_ioctl_disk(struct mfi_softc *sc, str /* send single element command to retrieve size for full structure */ cfg = malloc(sizeof *cfg, M_DEVBUF, M_WAITOK); - if (mfi_mgmt_internal(sc, MD_DCMD_CONF_GET, MFI_DATA_IN, + if (mfi_mgmt_internal(sc, MR_DCMD_CONF_GET, MFI_DATA_IN, sizeof *cfg, cfg, NULL, false)) goto freeme; @@ -2150,7 +2150,7 @@ mfi_ioctl_disk(struct mfi_softc *sc, str /* memory for read config */ cfg = malloc(size, M_DEVBUF, M_WAITOK|M_ZERO); - if (mfi_mgmt_internal(sc, MD_DCMD_CONF_GET, MFI_DATA_IN, + if (mfi_mgmt_internal(sc, MR_DCMD_CONF_GET, MFI_DATA_IN, size, cfg, NULL, false)) goto freeme; @@ -2400,7 +2400,7 @@ mfi_ioctl_setstate(struct mfi_softc *sc, } - if (mfi_mgmt_internal(sc, MD_DCMD_PD_SET_STATE, MFI_DATA_NONE, + if (mfi_mgmt_internal(sc, MR_DCMD_PD_SET_STATE, MFI_DATA_NONE, 0, NULL, mbox, false)) goto done; @@ -2433,7 +2433,7 @@ mfi_bio_hs(struct mfi_softc *sc, int vol /* send single element command to retrieve size for full structure */ cfg = malloc(sizeof *cfg, M_DEVBUF, M_WAITOK); - if (mfi_mgmt_internal(sc, MD_DCMD_CONF_GET, MFI_DATA_IN, + if (mfi_mgmt_internal(sc, MR_DCMD_CONF_GET, MFI_DATA_IN, sizeof *cfg, cfg, NULL, false)) goto freeme; @@ -2442,7 +2442,7 @@ mfi_bio_hs(struct mfi_softc *sc, int vol /* memory for read config */ cfg = malloc(size, M_DEVBUF, M_WAITOK|M_ZERO); - if (mfi_mgmt_internal(sc, MD_DCMD_CONF_GET, MFI_DATA_IN, + if (mfi_mgmt_internal(sc, MR_DCMD_CONF_GET, MFI_DATA_IN, size, cfg, NULL, false)) goto freeme; Index: src/sys/dev/ic/mfireg.h diff -u src/sys/dev/ic/mfireg.h:1.8 src/sys/dev/ic/mfireg.h:1.9 --- src/sys/dev/ic/mfireg.h:1.8 Wed Sep 19 21:24:29 2012 +++ src/sys/dev/ic/mfireg.h Sat Nov 24 18:10:29 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: mfireg.h,v 1.8 2012/09/19 21:24:29 bouyer Exp $ */ +/* $NetBSD: mfireg.h,v 1.9 2018/11/24 18:10:29 bouyer Exp $ */ /* $OpenBSD: mfireg.h,v 1.24 2006/06/19 19:05:45 marco Exp $ */ /* * Copyright (c) 2006 Marco Peereboom <ma...@peereboom.us> @@ -182,12 +182,12 @@ ((MEGASAS_THUNDERBOLT_NEW_MSG_SIZE - \ (sizeof(struct mfi_mpi2_request_raid_scsi_io) - sizeof(mpi2_sge_io_union))\ ) / sizeof(mpi2_sge_io_union)) - -/* + +/* * (Command frame size allocaed in SRB ext - Raid SCSI IO message size) - * / size of SGL ; + * / size of SGL ; * (1280 - 256) / 16 = 64 - */ + */ #define MEGASAS_THUNDERBOLT_MAX_SGE_IN_CHAINMSG \ ((MR_COMMAND_SIZE - MEGASAS_THUNDERBOLT_NEW_MSG_SIZE) / \ sizeof(mpi2_sge_io_union)) @@ -234,8 +234,8 @@ #define MR_DCMD_PD_GET_LIST 0x02010000 #define MR_DCMD_PD_LIST_QUERY 0x02010100 #define MR_DCMD_PD_GET_INFO 0x02020000 -#define MD_DCMD_PD_SET_STATE 0x02030100 -#define MD_DCMD_PD_REBUILD 0x02040100 +#define MR_DCMD_PD_SET_STATE 0x02030100 +#define MR_DCMD_PD_REBUILD 0x02040100 #define MR_DCMD_PD_BLINK 0x02070100 #define MR_DCMD_PD_UNBLINK 0x02070200 #define MR_DCMD_LD_MAP_GET_INFO 0x0300e101 @@ -243,7 +243,12 @@ #define MR_DCMD_LD_GET_LIST 0x03010000 #define MR_DCMD_LD_GET_INFO 0x03020000 #define MR_DCMD_LD_GET_PROPERTIES 0x03030000 -#define MD_DCMD_CONF_GET 0x04010000 +#define MR_DCMD_CONF_GET 0x04010000 +#define MR_DCMD_CFG_ADD 0x04020000 +#define MR_DCMD_CFG_CLEAR 0x04030000 +#define MR_DCMD_CFG_MAKE_SPARE 0x04040000 +#define MR_DCMD_CFG_FOREIGN_SCAN 0x04060100 +#define MR_DCMD_CFG_FOREIGN_CLEAR 0x04060500 #define MR_DCMD_BBU_GET_STATUS 0x05010000 #define MR_DCMD_BBU_GET_CAPACITY_INFO 0x05020000 #define MR_DCMD_BBU_GET_DESIGN_INFO 0x05030000 @@ -260,6 +265,12 @@ /* mailbox bytes in direct command */ #define MFI_MBOX_SIZE 12 +union mfi_mbox { + uint8_t b[MFI_MBOX_SIZE]; + uint16_t s[6]; + uint32_t w[3]; +} __packed __aligned(4); + /* mfi completion codes */ typedef enum { MFI_STAT_OK = 0x00, @@ -370,9 +381,17 @@ typedef enum { /* XXX should be in mfi_evt_args ? */ #define MR_EVT_CTRL_HOST_BUS_SCAN_REQUESTED 0x0152 -#define MR_EVT_PD_REMOVED 0x0070 +#define MR_EVT_ARGS_PD_ADDRESS 0x1d #define MR_EVT_PD_INSERTED 0x005b +#define MR_EVT_PD_REMOVED 0x0070 +#define MR_EVT_PD_STATE_CHANGE 0x0072 #define MR_EVT_LD_CHANGE 0x0051 +#define MR_EVT_LD_CREATED 0x008a +#define MR_EVT_LD_DELETED 0x008b +#define MR_EVT_PD_REMOVED_EXT 0x00f8 +#define MR_EVT_PD_INSERTED_EXT 0x00f7 + + typedef enum { MR_PD_QUERY_TYPE_ALL = 0, @@ -493,7 +512,7 @@ struct mfi_pass_frame { struct mfi_dcmd_frame { struct mfi_frame_header mdf_header; uint32_t mdf_opcode; - uint8_t mdf_mbox[MFI_MBOX_SIZE]; + union mfi_mbox mdf_mbox; union mfi_sgl mdf_sgl; } __packed; #define MFI_DCMD_MBOX_PEND_FLAG 0x1 @@ -573,6 +592,37 @@ struct mfi_evtarg_pd { uint8_t mep_slot_number; } __packed; +struct mfi_evtarg_pd_state { + struct mfi_evtarg_pd pd; + uint32_t prev_state; + uint32_t new_state; +} __packed; + +struct mfi_evtarg_pd_address { + uint16_t device_id; + uint16_t encl_id; + + union { + struct { + uint8_t encl_index; + uint8_t slot_number; + } __packed pd_address; + struct { + uint8_t encl_position; + uint8_t encl_connector_index; + } __packed encl_address; + } __packed address; + + uint8_t scsi_dev_type; + + union { + uint8_t port_bitmap; + uint8_t port_numbers; + } __packed connected; + + uint64_t sas_addr[2]; +} __packed __aligned(8); + struct mfi_evt_detail { uint32_t med_seq_num; uint32_t med_time_stamp; @@ -655,11 +705,7 @@ struct mfi_evt_detail { struct mfi_progress prog; } __packed pd_prog; - struct { - struct mfi_evtarg_pd pd; - uint32_t prev_state; - uint32_t new_state; - } __packed pd_state; + struct mfi_evtarg_pd_state pd_state; struct { uint16_t vendor_id; @@ -682,6 +728,8 @@ struct mfi_evt_detail { char str[64]; } __packed ecc; + struct mfi_evtarg_pd_address pd_address; + uint8_t b[96]; uint16_t s[48]; uint32_t w[24]; @@ -1028,13 +1076,13 @@ struct mfi_pd_address { u_quad_t mpa_sas_address[2]; } __packed; -#define MAX_SYS_PDS 240 +#define MFI_MAX_PD 256 struct mfi_pd_list { uint32_t mpl_size; uint32_t mpl_no_pd; - struct mfi_pd_address mpl_address[MAX_SYS_PDS]; + struct mfi_pd_address mpl_address[MFI_MAX_PD]; } __packed; -#define MFI_PD_LIST_SIZE (256 * sizeof(struct mfi_pd_address) + 8) +#define MFI_PD_LIST_SIZE (sizeof(struct mfi_pd_list)) struct mfi_pd { uint16_t mfp_id; @@ -1175,7 +1223,7 @@ struct mfi_bbu_state { } __packed; union mfi_bbu_status_detail { - struct mfi_ibbu_state ibbu; + struct mfi_ibbu_state ibbu; struct mfi_bbu_state bbu; }; @@ -1200,6 +1248,21 @@ struct mfi_bbu_status { #define MFI_BBU_STATE_LEARN_CYC_FAIL (1 << 7) #define MFI_BBU_STATE_LEARN_CYC_TIMEOUT (1 << 8) #define MFI_BBU_STATE_I2C_ERR_DETECT (1 << 9) +#define MFI_BBU_STATE_REPLACE_PACK (1 << 10) +#define MFI_BBU_STATE_CAPACITY_LOW (1 << 11) +#define MFI_BBU_STATE_LEARN_REQUIRED (1 << 12) +#define MFI_BBU_STATE_BAD_IBBU ( \ + MFI_BBU_STATE_PACK_MISSING | \ + MFI_BBU_STATE_VOLTAGE_LOW | \ + MFI_BBU_STATE_DISCHARGE_ACTIVE | \ + MFI_BBU_STATE_LEARN_CYC_REQ | \ + MFI_BBU_STATE_LEARN_CYC_ACTIVE | \ + MFI_BBU_STATE_REPLACE_PACK | \ + MFI_BBU_STATE_CAPACITY_LOW) +#define MFI_BBU_STATE_BAD_BBU ( \ + MFI_BBU_STATE_PACK_MISSING | \ + MFI_BBU_STATE_REPLACE_PACK | \ + MFI_BBU_STATE_CAPACITY_LOW) uint8_t pad[20]; union mfi_bbu_status_detail detail; } __packed; @@ -1603,7 +1666,7 @@ union mfi_mpi2_request_descriptor { uint64_t words; }; -/* +/* * Request descriptor types */ #define MFI_REQ_DESCRIPT_FLAGS_LD_IO 0x7 @@ -1689,9 +1752,9 @@ struct io_request_info { uint8_t fpOkForIo; }; -/* - * Define MFI Address Context union. - */ +/* + * Define MFI Address Context union. + */ #ifdef MFI_ADDRESS_IS_uint64_t typedef uint64_t mfi_address; #else