/**************************************************************************** * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License (the "License"). * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE * or http://www.opensolaris.org/os/licensing. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at usr/src/OPENSOLARIS.LICENSE. * If applicable, add the following below this CDDL HEADER, with the * fields enclosed by brackets "[]" replaced with your own identifying * information: Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END * * Copyright 2014 QLogic Corporation * The contents of this file are subject to the terms of the * QLogic End User License (the "License"). * You may not use this file except in compliance with the License. * * You can obtain a copy of the License at * http://www.qlogic.com/Resources/Documents/DriverDownloadHelp/ * QLogic_End_User_Software_License.txt * See the License for the specific language governing permissions * and limitations under the License. * * * Name: mcp_multi_thread.h * * Description: Multi-thread definition and structures * * Created: 10 Oct 2011 yanivr ****************************************************************************/ /**************************************************************************** * Include * ****************************************************************************/ #ifndef MULTI_THREAD_DEF_H #define MULTI_THREAD_DEF_H #define MAX_THREAD_QUEUE 16 #define THREAD_STACK_SIZE 1500 #define STACK_FILL 0xbadbeef typedef enum { MISC_THREAD, LINK_THREAD, NET_THREAD, OCSD_THREAD, NUM_THREADS }thread_name_e; // This enum is just for the complete picture. // The running thread knows it is running so the only interesting state is the SLEEPING one typedef enum { IDLE, RUNNING, SLEEPING }thread_state_e; typedef struct papo_arg_t { u16 path; u16 port; } papo_t; struct eeprom_arg_t { u16 pf_num; u16 is_specific_phy; u32 io_rsp; /* The response to write */ }; struct task_t { u16 op_id; u16 entry_count; union { struct papo_arg_t papo; struct eeprom_arg_t eeprom; }args; }; struct tasks_queue_t { struct task_t task[MAX_THREAD_QUEUE]; /* The request queue. */ u32 front; /* For de-queue */ u32 rear; /* For queuing */ u32 attributes; #define TASK_ALWAYS_QUEUED (1<<0) }; #ifdef MFW typedef u8 (* THREAD_FUNC_PTR) (struct task_t *i_task); #else #define THREAD_FUNC_PTR u32 #endif struct mt_thread_stat { u32 total_cpu_time; u32 times_in_cpu; u32 going_to_sleep_count; u32 waking_up_count; u32 swim_failure_cnt; u32 swim_failure_timeout_cnt; }; struct thread_t { u32 current_SP; /* Current_SP will be initialized as the start of stack */ u32 stack_guard_addr; THREAD_FUNC_PTR main_func; /* Entry point to the thread. */ u32 start_time; /* The time that the thread started to run */ u32 time_slice_ticks; /* Const value initialized once during compilation (only for the Network Manager) */ u32 /* thread_state_e*/ state; u32 sleep_time; /* In ticks */ u32 sleep_length; /* In ticks */ u32 swim_load_fail_time; struct tasks_queue_t queue; struct mt_thread_stat stat; }; struct scheduler_stat_t { u32 times_called; }; struct scheduler_t { u32 cur_thread; struct scheduler_stat_t stat; }; // Main structure struct multi_thread_t { struct thread_t thread[NUM_THREADS]; struct scheduler_t sched; }; #endif // MULTI_THREAD_DEF_H