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 */
@@ -187,6 +188,13 @@ 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_GLOBAL 3
197
+
190
198
/* SGE Flag definition */
191
199
#define MPI3MR_SGEFLAGS_SYSTEM_SIMPLE_END_OF_LIST \
192
200
(MPI3_SGE_FLAGS_ELEMENT_TYPE_SIMPLE | MPI3_SGE_FLAGS_DLAS_SYSTEM | \
@@ -210,6 +218,7 @@ extern atomic64_t event_counter;
210
218
#define MPI3MR_WRITE_SAME_MAX_LEN_256_BLKS 256
211
219
#define MPI3MR_WRITE_SAME_MAX_LEN_2048_BLKS 2048
212
220
221
+
213
222
/**
214
223
* struct mpi3mr_nvme_pt_sge - Structure to store SGEs for NVMe
215
224
* Encapsulated commands.
@@ -289,6 +298,8 @@ enum mpi3mr_reset_reason {
289
298
MPI3MR_RESET_FROM_PELABORT_TIMEOUT = 22 ,
290
299
MPI3MR_RESET_FROM_SYSFS = 23 ,
291
300
MPI3MR_RESET_FROM_SYSFS_TIMEOUT = 24 ,
301
+ MPI3MR_RESET_FROM_DIAG_BUFFER_POST_TIMEOUT = 25 ,
302
+ MPI3MR_RESET_FROM_DIAG_BUFFER_RELEASE_TIMEOUT = 26 ,
292
303
MPI3MR_RESET_FROM_FIRMWARE = 27 ,
293
304
MPI3MR_RESET_FROM_CFG_REQ_TIMEOUT = 29 ,
294
305
MPI3MR_RESET_FROM_SAS_TRANSPORT_TIMEOUT = 30 ,
@@ -327,6 +338,9 @@ struct mpi3mr_ioc_facts {
327
338
u32 ioc_capabilities ;
328
339
struct mpi3mr_compimg_ver fw_ver ;
329
340
u32 mpi_version ;
341
+ u32 diag_trace_sz ;
342
+ u32 diag_fw_sz ;
343
+ u32 diag_drvr_sz ;
330
344
u16 max_reqs ;
331
345
u16 product_id ;
332
346
u16 op_req_sz ;
@@ -852,6 +866,41 @@ struct mpi3mr_drv_cmd {
852
866
struct mpi3mr_drv_cmd * drv_cmd );
853
867
};
854
868
869
+ /**
870
+ * union mpi3mr_trigger_data - Trigger data information
871
+ * @fault: Fault code
872
+ * @global: Global trigger data
873
+ * @element: element trigger data
874
+ */
875
+ union mpi3mr_trigger_data {
876
+ u16 fault ;
877
+ u64 global ;
878
+ union mpi3_driver2_trigger_element element ;
879
+ };
880
+
881
+ /**
882
+ * struct diag_buffer_desc - memory descriptor structure to
883
+ * store virtual, dma addresses, size, buffer status for host
884
+ * diagnostic buffers.
885
+ *
886
+ * @type: Buffer type
887
+ * @trigger_data: Trigger data
888
+ * @trigger_type: Trigger type
889
+ * @status: Buffer status
890
+ * @size: Buffer size
891
+ * @addr: Virtual address
892
+ * @dma_addr: Buffer DMA address
893
+ */
894
+ struct diag_buffer_desc {
895
+ u8 type ;
896
+ union mpi3mr_trigger_data trigger_data ;
897
+ u8 trigger_type ;
898
+ u8 status ;
899
+ u32 size ;
900
+ void * addr ;
901
+ dma_addr_t dma_addr ;
902
+ };
903
+
855
904
/**
856
905
* struct dma_memory_desc - memory descriptor structure to store
857
906
* virtual address, dma address and size for any generic dma
@@ -1054,6 +1103,11 @@ struct scmd_priv {
1054
1103
* @sas_node_lock: Lock to protect SAS node list
1055
1104
* @hba_port_table_list: List of HBA Ports
1056
1105
* @enclosure_list: List of Enclosure objects
1106
+ * @diag_buffers: Host diagnostic buffers
1107
+ * @driver_pg2: Driver page 2 pointer
1108
+ * @reply_trigger_present: Reply trigger present flag
1109
+ * @event_trigger_present: Event trigger present flag
1110
+ * @scsisense_trigger_present: Scsi sense trigger present flag
1057
1111
* @ioctl_dma_pool: DMA pool for IOCTL data buffers
1058
1112
* @ioctl_sge: DMA buffer descriptors for IOCTL data
1059
1113
* @ioctl_chain_sge: DMA buffer descriptor for IOCTL chain
@@ -1250,6 +1304,12 @@ struct mpi3mr_ioc {
1250
1304
struct dma_memory_desc ioctl_chain_sge ;
1251
1305
struct dma_memory_desc ioctl_resp_sge ;
1252
1306
bool ioctl_sges_allocated ;
1307
+ bool reply_trigger_present ;
1308
+ bool event_trigger_present ;
1309
+ bool scsisense_trigger_present ;
1310
+ struct diag_buffer_desc diag_buffers [MPI3MR_MAX_NUM_HDB ];
1311
+ struct mpi3_driver_page2 * driver_pg2 ;
1312
+ spinlock_t trigger_lock ;
1253
1313
};
1254
1314
1255
1315
/**
@@ -1406,6 +1466,8 @@ int mpi3mr_cfg_set_sas_io_unit_pg1(struct mpi3mr_ioc *mrioc,
1406
1466
struct mpi3_sas_io_unit_page1 * sas_io_unit_pg1 , u16 pg_sz );
1407
1467
int mpi3mr_cfg_get_driver_pg1 (struct mpi3mr_ioc * mrioc ,
1408
1468
struct mpi3_driver_page1 * driver_pg1 , u16 pg_sz );
1469
+ int mpi3mr_cfg_get_driver_pg2 (struct mpi3mr_ioc * mrioc ,
1470
+ struct mpi3_driver_page2 * driver_pg2 , u16 pg_sz , u8 page_type );
1409
1471
1410
1472
u8 mpi3mr_is_expander_device (u16 device_info );
1411
1473
int mpi3mr_expander_add (struct mpi3mr_ioc * mrioc , u16 handle );
@@ -1439,4 +1501,16 @@ void mpi3mr_free_enclosure_list(struct mpi3mr_ioc *mrioc);
1439
1501
int mpi3mr_process_admin_reply_q (struct mpi3mr_ioc * mrioc );
1440
1502
void mpi3mr_expander_node_remove (struct mpi3mr_ioc * mrioc ,
1441
1503
struct mpi3mr_sas_node * sas_expander );
1504
+ void mpi3mr_alloc_diag_bufs (struct mpi3mr_ioc * mrioc );
1505
+ int mpi3mr_post_diag_bufs (struct mpi3mr_ioc * mrioc );
1506
+ int mpi3mr_issue_diag_buf_release (struct mpi3mr_ioc * mrioc ,
1507
+ struct diag_buffer_desc * diag_buffer );
1508
+ void mpi3mr_release_diag_bufs (struct mpi3mr_ioc * mrioc , u8 skip_rel_action );
1509
+ void mpi3mr_set_trigger_data_in_hdb (struct diag_buffer_desc * hdb ,
1510
+ u8 type , union mpi3mr_trigger_data * trigger_data , bool force );
1511
+ int mpi3mr_refresh_trigger (struct mpi3mr_ioc * mrioc , u8 page_type );
1512
+ struct diag_buffer_desc * mpi3mr_diag_buffer_for_type (struct mpi3mr_ioc * mrioc ,
1513
+ u8 buf_type );
1514
+ int mpi3mr_issue_diag_buf_post (struct mpi3mr_ioc * mrioc ,
1515
+ struct diag_buffer_desc * diag_buffer );
1442
1516
#endif /*MPI3MR_H_INCLUDED*/
0 commit comments