52 return (uint32_t)pci_bus << 8 | (uint32_t)pci_dev;
66 ocs_lock(&ocs_ras_subsystem_g.
lock);
70 ocs_unlock(&ocs_ras_subsystem_g.
lock);
74 ocs_unlock(&ocs_ras_subsystem_g.
lock);
81 uint32_t *ptr = (uint32_t *)adapter_desc->
lwpd_buffer.virt;
87 loffset = ocs_be32toh(ptr[0]);
88 wrap_seq = ocs_be32toh(ptr[1]);
91 *active_idx = loffset / buf_sz;
92 *offset = loffset % buf_sz;
109 int32_t start_offset;
110 uint32_t valid_log_sz;
122 if (!active_idx && !offset && !logs_wrapped) {
132 start_idx = active_idx;
135 tbl_size = active_idx;
136 valid_log_sz = active_idx * adapter_desc->
buf_unit_size + offset;
147 for (i = 0; i < tbl_size; i++) {
149 buf_desc_tbl[i].
offset = start_offset;
158 valid_log_sz -= buf_desc_tbl[i].
length;
165 ocs_log_err(ocs,
"[RAS] BUG: residual log size %d\n", valid_log_sz);
167 *buf_count = tbl_size;
174 ocs_t *ocs = (ocs_t *)ocs_os;
179 return (uintptr_t)NULL;
190 ocs_t *ocs = (ocs_t *)ocs_os;
202 addr_tbl = ocs_vmalloc(ocs, tbl_size * 8, OCS_M_ZERO);
206 for (i = 0; i < tbl_size; i++) {
210 *buf_count = tbl_size;
220 int32_t bytes_copied = 0;
221 char *ptr = (
char *)log_buf;
223 for (i = 0; i < buf_count; i++) {
224 if (bytes_copied + (int32_t)buf_desc_tbl[i].
length > user_buf_len) {
225 bytes_copied = -EINVAL;
228 ocs_memcpy(ptr + bytes_copied, buf_desc_tbl[i].addr + buf_desc_tbl[i].offset, buf_desc_tbl[i].length);
229 bytes_copied += buf_desc_tbl[i].
length;
244 if (!buf_desc_tbl || !buf_count || !user_buf)
261 rc = ocs_dma_alloc(ocs, &adapter_desc->
lwpd_buffer, 64, 8);
268 for (i = 0; i < buf_count; i++) {
289 ocs_dma_free_unbound(&adapter_desc->
buffers[i]);
297 ocs_lock(&ocs_ras_subsystem_g.
lock);
299 ocs_unlock(&ocs_ras_subsystem_g.
lock);
302 ocs_free(NULL, adapter_desc,
sizeof(*adapter_desc));
317 ocs_t *ocs = (ocs_t *)ocs_os;
322 ocs_log_debug(ocs,
"[RAS] FW logging subsystem is not initialized.\n");
328 ocs_log_debug(ocs,
"[RAS] no resources to free.\n");
332 if (ocs_ref_read_count(&adapter_desc->
refcnt) == 1) {
336 ocs_ref_put(&adapter_desc->
refcnt);
345 ocs_t *ocs = (ocs_t *)ocs_os;
350 ocs_log_err(ocs,
"[RAS] FW logging is disabled\n");
356 ocs_ref_get(&adapter_desc->
refcnt);
360 adapter_desc = ocs_malloc(ocs,
sizeof(*adapter_desc), OCS_M_ZERO | OCS_M_NOWAIT);
377 ocs_log_err(ocs,
"[RAS] unable to allocate resources\n");
381 ocs_lock(&ocs_ras_subsystem_g.
lock);
383 ocs_unlock(&ocs_ras_subsystem_g.
lock);
398 ocs_log_debug(NULL,
"[RAS] subsystem already initialized.\n");
405 ocs_lock_init(NULL, &ocs_ras_subsystem_g.
lock,
"ras diag logging lock");
static int32_t ocs_ras_alloc_dma_buffers(ocs_t *ocs, ocs_ras_adapter_desc_t *adapter_desc)
#define OCS_RAS_MOD_INIT_DONE
int ocs_ras_copy_logs(ocs_t *ocs, void *user_buf, int32_t user_buf_len)
static void ocs_ras_free_adapter_descriptor(ocs_ras_adapter_desc_t *adapter_desc)
uintptr_t ocs_ras_get_lwpd_dma_addr(ocs_os_handle_t *ocs_os)
static ocs_ras_adapter_desc_t * ocs_ras_lookup_adapter(ocs_t *ocs)
static bool ocs_ras_get_virt_buf_info(ocs_t *ocs, ocs_ras_adapter_desc_t *adapter_desc, int32_t *active_idx, int32_t *offset)
static void ocs_ras_free_dma_buffers(ocs_ras_adapter_desc_t *adapter_desc)
static ocs_diag_log_buf_t * ocs_ras_get_virtual_buf(ocs_t *ocs, int32_t *buf_count)
static void * ocs_list_remove(ocs_list_t *list, void *item)
Remove an item from the list.
#define ocs_list_init(head, type, link)
#define OCS_RAS_BUFFER_COUNT_MAX
static void ocs_ras_put_adapter_descriptor(void *cb_arg)
uint32_t * ocs_ras_get_dma_addr_list(ocs_os_handle_t *ocs_os, int32_t *buf_count)
int ocs_hal_stop_fw_diagnostic_logging(ocs_hal_t *hal)
#define OCS_RAS_BUFFER_UNIT_MAX
#define OCS_RAS_BUFFER_UNIT_MIN
void ocs_ras_init(uint32_t fw_log_level, uint32_t log_buf_size)
int ocs_ras_free_resc(ocs_os_handle_t *ocs_os)
static void ocs_list_add_tail(ocs_list_t *list, void *item)
Add an item to the tail of the list.
#define OCS_RAS_DMA_ADDR_LOW_MASK
static uint32_t ocs_ras_get_sli_dev_pci_info(ocs_t *ocs)
int32_t ocs_get_bus_dev_func(ocs_t *ocs, uint8_t *bus, uint8_t *dev, uint8_t *func)
static int ocs_ras_gather_logs(void *log_buf, int32_t user_buf_len, ocs_diag_log_buf_t *buf_desc_tbl, int32_t buf_count)
ocs_dma_t buffers[OCS_RAS_BUFFER_COUNT_MAX]
#define ocs_list_foreach(list, item)
Iterate a linked list.
static ocs_ras_subsystem_t ocs_ras_subsystem_g
int32_t ocs_ras_allocate_resc(ocs_os_handle_t *ocs_os)
#define OCS_RAS_DMA_ADDR_HI_SHIFT