diff options
Diffstat (limited to 'drivers/scsi/mpt2sas/mpt2sas_config.c')
-rw-r--r-- | drivers/scsi/mpt2sas/mpt2sas_config.c | 52 |
1 files changed, 49 insertions, 3 deletions
diff --git a/drivers/scsi/mpt2sas/mpt2sas_config.c b/drivers/scsi/mpt2sas/mpt2sas_config.c index 594a389c6526..cf44b355bc97 100644 --- a/drivers/scsi/mpt2sas/mpt2sas_config.c +++ b/drivers/scsi/mpt2sas/mpt2sas_config.c | |||
@@ -51,6 +51,7 @@ | |||
51 | #include <linux/workqueue.h> | 51 | #include <linux/workqueue.h> |
52 | #include <linux/delay.h> | 52 | #include <linux/delay.h> |
53 | #include <linux/pci.h> | 53 | #include <linux/pci.h> |
54 | #include <linux/slab.h> | ||
54 | 55 | ||
55 | #include "mpt2sas_base.h" | 56 | #include "mpt2sas_base.h" |
56 | 57 | ||
@@ -324,7 +325,9 @@ _config_request(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigRequest_t | |||
324 | if (r != 0) | 325 | if (r != 0) |
325 | goto out; | 326 | goto out; |
326 | if (mpi_request->Action == | 327 | if (mpi_request->Action == |
327 | MPI2_CONFIG_ACTION_PAGE_WRITE_CURRENT) { | 328 | MPI2_CONFIG_ACTION_PAGE_WRITE_CURRENT || |
329 | mpi_request->Action == | ||
330 | MPI2_CONFIG_ACTION_PAGE_WRITE_NVRAM) { | ||
328 | ioc->base_add_sg_single(&mpi_request->PageBufferSGE, | 331 | ioc->base_add_sg_single(&mpi_request->PageBufferSGE, |
329 | MPT2_CONFIG_COMMON_WRITE_SGLFLAGS | mem.sz, | 332 | MPT2_CONFIG_COMMON_WRITE_SGLFLAGS | mem.sz, |
330 | mem.page_dma); | 333 | mem.page_dma); |
@@ -882,7 +885,7 @@ mpt2sas_config_get_sas_iounit_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t | |||
882 | } | 885 | } |
883 | 886 | ||
884 | /** | 887 | /** |
885 | * mpt2sas_config_get_sas_iounit_pg1 - obtain sas iounit page 0 | 888 | * mpt2sas_config_get_sas_iounit_pg1 - obtain sas iounit page 1 |
886 | * @ioc: per adapter object | 889 | * @ioc: per adapter object |
887 | * @mpi_reply: reply mf payload returned from firmware | 890 | * @mpi_reply: reply mf payload returned from firmware |
888 | * @config_page: contents of the config page | 891 | * @config_page: contents of the config page |
@@ -907,7 +910,7 @@ mpt2sas_config_get_sas_iounit_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t | |||
907 | mpi_request.Header.PageType = MPI2_CONFIG_PAGETYPE_EXTENDED; | 910 | mpi_request.Header.PageType = MPI2_CONFIG_PAGETYPE_EXTENDED; |
908 | mpi_request.ExtPageType = MPI2_CONFIG_EXTPAGETYPE_SAS_IO_UNIT; | 911 | mpi_request.ExtPageType = MPI2_CONFIG_EXTPAGETYPE_SAS_IO_UNIT; |
909 | mpi_request.Header.PageNumber = 1; | 912 | mpi_request.Header.PageNumber = 1; |
910 | mpi_request.Header.PageVersion = MPI2_SASIOUNITPAGE0_PAGEVERSION; | 913 | mpi_request.Header.PageVersion = MPI2_SASIOUNITPAGE1_PAGEVERSION; |
911 | mpt2sas_base_build_zero_len_sge(ioc, &mpi_request.PageBufferSGE); | 914 | mpt2sas_base_build_zero_len_sge(ioc, &mpi_request.PageBufferSGE); |
912 | r = _config_request(ioc, &mpi_request, mpi_reply, | 915 | r = _config_request(ioc, &mpi_request, mpi_reply, |
913 | MPT2_CONFIG_PAGE_DEFAULT_TIMEOUT, NULL, 0); | 916 | MPT2_CONFIG_PAGE_DEFAULT_TIMEOUT, NULL, 0); |
@@ -922,6 +925,49 @@ mpt2sas_config_get_sas_iounit_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t | |||
922 | } | 925 | } |
923 | 926 | ||
924 | /** | 927 | /** |
928 | * mpt2sas_config_set_sas_iounit_pg1 - send sas iounit page 1 | ||
929 | * @ioc: per adapter object | ||
930 | * @mpi_reply: reply mf payload returned from firmware | ||
931 | * @config_page: contents of the config page | ||
932 | * @sz: size of buffer passed in config_page | ||
933 | * Context: sleep. | ||
934 | * | ||
935 | * Calling function should call config_get_number_hba_phys prior to | ||
936 | * this function, so enough memory is allocated for config_page. | ||
937 | * | ||
938 | * Returns 0 for success, non-zero for failure. | ||
939 | */ | ||
940 | int | ||
941 | mpt2sas_config_set_sas_iounit_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t | ||
942 | *mpi_reply, Mpi2SasIOUnitPage1_t *config_page, u16 sz) | ||
943 | { | ||
944 | Mpi2ConfigRequest_t mpi_request; | ||
945 | int r; | ||
946 | |||
947 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); | ||
948 | mpi_request.Function = MPI2_FUNCTION_CONFIG; | ||
949 | mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_HEADER; | ||
950 | mpi_request.Header.PageType = MPI2_CONFIG_PAGETYPE_EXTENDED; | ||
951 | mpi_request.ExtPageType = MPI2_CONFIG_EXTPAGETYPE_SAS_IO_UNIT; | ||
952 | mpi_request.Header.PageNumber = 1; | ||
953 | mpi_request.Header.PageVersion = MPI2_SASIOUNITPAGE1_PAGEVERSION; | ||
954 | mpt2sas_base_build_zero_len_sge(ioc, &mpi_request.PageBufferSGE); | ||
955 | r = _config_request(ioc, &mpi_request, mpi_reply, | ||
956 | MPT2_CONFIG_PAGE_DEFAULT_TIMEOUT, NULL, 0); | ||
957 | if (r) | ||
958 | goto out; | ||
959 | |||
960 | mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_WRITE_CURRENT; | ||
961 | _config_request(ioc, &mpi_request, mpi_reply, | ||
962 | MPT2_CONFIG_PAGE_DEFAULT_TIMEOUT, config_page, sz); | ||
963 | mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_WRITE_NVRAM; | ||
964 | r = _config_request(ioc, &mpi_request, mpi_reply, | ||
965 | MPT2_CONFIG_PAGE_DEFAULT_TIMEOUT, config_page, sz); | ||
966 | out: | ||
967 | return r; | ||
968 | } | ||
969 | |||
970 | /** | ||
925 | * mpt2sas_config_get_expander_pg0 - obtain expander page 0 | 971 | * mpt2sas_config_get_expander_pg0 - obtain expander page 0 |
926 | * @ioc: per adapter object | 972 | * @ioc: per adapter object |
927 | * @mpi_reply: reply mf payload returned from firmware | 973 | * @mpi_reply: reply mf payload returned from firmware |