47
47
#include "mpi/mpi30_ioc.h"
48
48
#include "mpi/mpi30_sas.h"
49
49
#include "mpi/mpi30_pci.h"
50
+ #include "mpi/mpi30_tool.h"
50
51
#include "mpi3mr_debug.h"
51
52
52
53
/* Global list and lock for storing multiple adapters managed by the driver */
@@ -55,8 +56,8 @@ extern struct list_head mrioc_list;
55
56
extern int prot_mask ;
56
57
extern atomic64_t event_counter ;
57
58
58
- #define MPI3MR_DRIVER_VERSION "8.8 .1.0.50"
59
- #define MPI3MR_DRIVER_RELDATE "5-March -2024"
59
+ #define MPI3MR_DRIVER_VERSION "8.9 .1.0.50"
60
+ #define MPI3MR_DRIVER_RELDATE "14-May -2024"
60
61
61
62
#define MPI3MR_DRIVER_NAME "mpi3mr"
62
63
#define MPI3MR_DRIVER_LICENSE "GPL"
@@ -187,6 +188,30 @@ extern atomic64_t event_counter;
187
188
#define MPI3MR_HARD_SECURE_DEVICE 0x08
188
189
#define MPI3MR_TAMPERED_DEVICE 0x0C
189
190
191
+ #define MPI3MR_DEFAULT_HDB_MAX_SZ (4 * 1024 * 1024)
192
+ #define MPI3MR_DEFAULT_HDB_DEC_SZ (1 * 1024 * 1024)
193
+ #define MPI3MR_DEFAULT_HDB_MIN_SZ (2 * 1024 * 1024)
194
+ #define MPI3MR_MAX_NUM_HDB 2
195
+
196
+ #define MPI3MR_HDB_TRIGGER_TYPE_UNKNOWN 0
197
+ #define MPI3MR_HDB_TRIGGER_TYPE_FAULT 1
198
+ #define MPI3MR_HDB_TRIGGER_TYPE_ELEMENT 2
199
+ #define MPI3MR_HDB_TRIGGER_TYPE_GLOBAL 3
200
+ #define MPI3MR_HDB_TRIGGER_TYPE_SOFT_RESET 4
201
+ #define MPI3MR_HDB_TRIGGER_TYPE_FW_RELEASED 5
202
+
203
+ #define MPI3MR_HDB_REFRESH_TYPE_RESERVED 0
204
+ #define MPI3MR_HDB_REFRESH_TYPE_CURRENT 1
205
+ #define MPI3MR_HDB_REFRESH_TYPE_DEFAULT 2
206
+ #define MPI3MR_HDB_HDB_REFRESH_TYPE_PERSISTENT 3
207
+
208
+ #define MPI3MR_DEFAULT_HDB_SZ (4 * 1024 * 1024)
209
+ #define MPI3MR_MAX_NUM_HDB 2
210
+
211
+ #define MPI3MR_HDB_QUERY_ELEMENT_TRIGGER_FORMAT_INDEX 0
212
+ #define MPI3MR_HDB_QUERY_ELEMENT_TRIGGER_FORMAT_DATA 1
213
+
214
+
190
215
/* SGE Flag definition */
191
216
#define MPI3MR_SGEFLAGS_SYSTEM_SIMPLE_END_OF_LIST \
192
217
(MPI3_SGE_FLAGS_ELEMENT_TYPE_SIMPLE | MPI3_SGE_FLAGS_DLAS_SYSTEM | \
@@ -210,6 +235,8 @@ extern atomic64_t event_counter;
210
235
#define MPI3MR_WRITE_SAME_MAX_LEN_256_BLKS 256
211
236
#define MPI3MR_WRITE_SAME_MAX_LEN_2048_BLKS 2048
212
237
238
+ #define MPI3MR_DRIVER_EVENT_PROCESS_TRIGGER (0xFFFD)
239
+
213
240
/**
214
241
* struct mpi3mr_nvme_pt_sge - Structure to store SGEs for NVMe
215
242
* Encapsulated commands.
@@ -289,9 +316,12 @@ enum mpi3mr_reset_reason {
289
316
MPI3MR_RESET_FROM_PELABORT_TIMEOUT = 22 ,
290
317
MPI3MR_RESET_FROM_SYSFS = 23 ,
291
318
MPI3MR_RESET_FROM_SYSFS_TIMEOUT = 24 ,
319
+ MPI3MR_RESET_FROM_DIAG_BUFFER_POST_TIMEOUT = 25 ,
320
+ MPI3MR_RESET_FROM_DIAG_BUFFER_RELEASE_TIMEOUT = 26 ,
292
321
MPI3MR_RESET_FROM_FIRMWARE = 27 ,
293
322
MPI3MR_RESET_FROM_CFG_REQ_TIMEOUT = 29 ,
294
323
MPI3MR_RESET_FROM_SAS_TRANSPORT_TIMEOUT = 30 ,
324
+ MPI3MR_RESET_FROM_TRIGGER = 31 ,
295
325
};
296
326
297
327
#define MPI3MR_RESET_REASON_OSTYPE_LINUX 1
@@ -327,6 +357,9 @@ struct mpi3mr_ioc_facts {
327
357
u32 ioc_capabilities ;
328
358
struct mpi3mr_compimg_ver fw_ver ;
329
359
u32 mpi_version ;
360
+ u32 diag_trace_sz ;
361
+ u32 diag_fw_sz ;
362
+ u32 diag_drvr_sz ;
330
363
u16 max_reqs ;
331
364
u16 product_id ;
332
365
u16 op_req_sz ;
@@ -852,6 +885,59 @@ struct mpi3mr_drv_cmd {
852
885
struct mpi3mr_drv_cmd * drv_cmd );
853
886
};
854
887
888
+ /**
889
+ * union mpi3mr_trigger_data - Trigger data information
890
+ * @fault: Fault code
891
+ * @global: Global trigger data
892
+ * @element: element trigger data
893
+ */
894
+ union mpi3mr_trigger_data {
895
+ u16 fault ;
896
+ u64 global ;
897
+ union mpi3_driver2_trigger_element element ;
898
+ };
899
+
900
+ /**
901
+ * struct trigger_event_data - store trigger related
902
+ * information.
903
+ *
904
+ * @trace_hdb: Trace diag buffer descriptor reference
905
+ * @fw_hdb: FW diag buffer descriptor reference
906
+ * @trigger_type: Trigger type
907
+ * @trigger_specific_data: Trigger specific data
908
+ * @snapdump: Snapdump enable or disable flag
909
+ */
910
+ struct trigger_event_data {
911
+ struct diag_buffer_desc * trace_hdb ;
912
+ struct diag_buffer_desc * fw_hdb ;
913
+ u8 trigger_type ;
914
+ union mpi3mr_trigger_data trigger_specific_data ;
915
+ bool snapdump ;
916
+ };
917
+
918
+ /**
919
+ * struct diag_buffer_desc - memory descriptor structure to
920
+ * store virtual, dma addresses, size, buffer status for host
921
+ * diagnostic buffers.
922
+ *
923
+ * @type: Buffer type
924
+ * @trigger_data: Trigger data
925
+ * @trigger_type: Trigger type
926
+ * @status: Buffer status
927
+ * @size: Buffer size
928
+ * @addr: Virtual address
929
+ * @dma_addr: Buffer DMA address
930
+ */
931
+ struct diag_buffer_desc {
932
+ u8 type ;
933
+ union mpi3mr_trigger_data trigger_data ;
934
+ u8 trigger_type ;
935
+ u8 status ;
936
+ u32 size ;
937
+ void * addr ;
938
+ dma_addr_t dma_addr ;
939
+ };
940
+
855
941
/**
856
942
* struct dma_memory_desc - memory descriptor structure to store
857
943
* virtual address, dma address and size for any generic dma
@@ -1054,11 +1140,19 @@ struct scmd_priv {
1054
1140
* @sas_node_lock: Lock to protect SAS node list
1055
1141
* @hba_port_table_list: List of HBA Ports
1056
1142
* @enclosure_list: List of Enclosure objects
1143
+ * @diag_buffers: Host diagnostic buffers
1144
+ * @driver_pg2: Driver page 2 pointer
1145
+ * @reply_trigger_present: Reply trigger present flag
1146
+ * @event_trigger_present: Event trigger present flag
1147
+ * @scsisense_trigger_present: Scsi sense trigger present flag
1057
1148
* @ioctl_dma_pool: DMA pool for IOCTL data buffers
1058
1149
* @ioctl_sge: DMA buffer descriptors for IOCTL data
1059
1150
* @ioctl_chain_sge: DMA buffer descriptor for IOCTL chain
1060
1151
* @ioctl_resp_sge: DMA buffer descriptor for Mgmt cmd response
1061
1152
* @ioctl_sges_allocated: Flag for IOCTL SGEs allocated or not
1153
+ * @trace_release_trigger_active: Trace trigger active flag
1154
+ * @fw_release_trigger_active: Fw release trigger active flag
1155
+ * @snapdump_trigger_active: Snapdump trigger active flag
1062
1156
*/
1063
1157
struct mpi3mr_ioc {
1064
1158
struct list_head list ;
@@ -1250,6 +1344,15 @@ struct mpi3mr_ioc {
1250
1344
struct dma_memory_desc ioctl_chain_sge ;
1251
1345
struct dma_memory_desc ioctl_resp_sge ;
1252
1346
bool ioctl_sges_allocated ;
1347
+ bool reply_trigger_present ;
1348
+ bool event_trigger_present ;
1349
+ bool scsisense_trigger_present ;
1350
+ struct diag_buffer_desc diag_buffers [MPI3MR_MAX_NUM_HDB ];
1351
+ struct mpi3_driver_page2 * driver_pg2 ;
1352
+ spinlock_t trigger_lock ;
1353
+ bool snapdump_trigger_active ;
1354
+ bool trace_release_trigger_active ;
1355
+ bool fw_release_trigger_active ;
1253
1356
};
1254
1357
1255
1358
/**
@@ -1406,6 +1509,8 @@ int mpi3mr_cfg_set_sas_io_unit_pg1(struct mpi3mr_ioc *mrioc,
1406
1509
struct mpi3_sas_io_unit_page1 * sas_io_unit_pg1 , u16 pg_sz );
1407
1510
int mpi3mr_cfg_get_driver_pg1 (struct mpi3mr_ioc * mrioc ,
1408
1511
struct mpi3_driver_page1 * driver_pg1 , u16 pg_sz );
1512
+ int mpi3mr_cfg_get_driver_pg2 (struct mpi3mr_ioc * mrioc ,
1513
+ struct mpi3_driver_page2 * driver_pg2 , u16 pg_sz , u8 page_type );
1409
1514
1410
1515
u8 mpi3mr_is_expander_device (u16 device_info );
1411
1516
int mpi3mr_expander_add (struct mpi3mr_ioc * mrioc , u16 handle );
@@ -1439,4 +1544,28 @@ void mpi3mr_free_enclosure_list(struct mpi3mr_ioc *mrioc);
1439
1544
int mpi3mr_process_admin_reply_q (struct mpi3mr_ioc * mrioc );
1440
1545
void mpi3mr_expander_node_remove (struct mpi3mr_ioc * mrioc ,
1441
1546
struct mpi3mr_sas_node * sas_expander );
1547
+ void mpi3mr_alloc_diag_bufs (struct mpi3mr_ioc * mrioc );
1548
+ int mpi3mr_post_diag_bufs (struct mpi3mr_ioc * mrioc );
1549
+ int mpi3mr_issue_diag_buf_release (struct mpi3mr_ioc * mrioc ,
1550
+ struct diag_buffer_desc * diag_buffer );
1551
+ void mpi3mr_release_diag_bufs (struct mpi3mr_ioc * mrioc , u8 skip_rel_action );
1552
+ void mpi3mr_set_trigger_data_in_hdb (struct diag_buffer_desc * hdb ,
1553
+ u8 type , union mpi3mr_trigger_data * trigger_data , bool force );
1554
+ int mpi3mr_refresh_trigger (struct mpi3mr_ioc * mrioc , u8 page_type );
1555
+ struct diag_buffer_desc * mpi3mr_diag_buffer_for_type (struct mpi3mr_ioc * mrioc ,
1556
+ u8 buf_type );
1557
+ int mpi3mr_issue_diag_buf_post (struct mpi3mr_ioc * mrioc ,
1558
+ struct diag_buffer_desc * diag_buffer );
1559
+ void mpi3mr_set_trigger_data_in_all_hdb (struct mpi3mr_ioc * mrioc ,
1560
+ u8 type , union mpi3mr_trigger_data * trigger_data , bool force );
1561
+ void mpi3mr_reply_trigger (struct mpi3mr_ioc * mrioc , u16 iocstatus ,
1562
+ u32 iocloginfo );
1563
+ void mpi3mr_hdb_trigger_data_event (struct mpi3mr_ioc * mrioc ,
1564
+ struct trigger_event_data * event_data );
1565
+ void mpi3mr_scsisense_trigger (struct mpi3mr_ioc * mrioc , u8 senseky , u8 asc ,
1566
+ u8 ascq );
1567
+ void mpi3mr_event_trigger (struct mpi3mr_ioc * mrioc , u8 event );
1568
+ void mpi3mr_global_trigger (struct mpi3mr_ioc * mrioc , u64 trigger_data );
1569
+ void mpi3mr_hdbstatuschg_evt_th (struct mpi3mr_ioc * mrioc ,
1570
+ struct mpi3_event_notification_reply * event_reply );
1442
1571
#endif /*MPI3MR_H_INCLUDED*/
0 commit comments