1 /**************************************************************************** 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 * 21 * Copyright 2014 QLogic Corporation 22 * The contents of this file are subject to the terms of the 23 * QLogic End User License (the "License"). 24 * You may not use this file except in compliance with the License. 25 * 26 * You can obtain a copy of the License at 27 * http://www.qlogic.com/Resources/Documents/DriverDownloadHelp/ 28 * QLogic_End_User_Software_License.txt 29 * See the License for the specific language governing permissions 30 * and limitations under the License. 31 * 32 * 33 * Name: mcp_multi_thread.h 34 * 35 * Description: Multi-thread definition and structures 36 * 37 * Created: 10 Oct 2011 yanivr 38 ****************************************************************************/ 39 40 /**************************************************************************** 41 * Include * 42 ****************************************************************************/ 43 #ifndef MULTI_THREAD_DEF_H 44 #define MULTI_THREAD_DEF_H 45 46 #define MAX_THREAD_QUEUE 16 47 #define THREAD_STACK_SIZE 1500 48 #define STACK_FILL 0xbadbeef 49 50 typedef enum { 51 MISC_THREAD, 52 LINK_THREAD, 53 NET_THREAD, 54 OCSD_THREAD, 55 NUM_THREADS 56 }thread_name_e; 57 58 // This enum is just for the complete picture. 59 // The running thread knows it is running so the only interesting state is the SLEEPING one 60 61 typedef enum { 62 IDLE, 63 RUNNING, 64 SLEEPING 65 }thread_state_e; 66 67 typedef struct papo_arg_t { 68 u16 path; 69 u16 port; 70 } papo_t; 71 72 struct eeprom_arg_t { 73 u16 pf_num; 74 u16 is_specific_phy; 75 u32 io_rsp; /* The response to write */ 76 }; 77 78 struct task_t { 79 u16 op_id; 80 u16 entry_count; 81 union { 82 struct papo_arg_t papo; 83 struct eeprom_arg_t eeprom; 84 }args; 85 }; 86 87 struct tasks_queue_t { 88 struct task_t task[MAX_THREAD_QUEUE]; /* The request queue. */ 89 u32 front; /* For de-queue */ 90 u32 rear; /* For queuing */ 91 u32 attributes; 92 #define TASK_ALWAYS_QUEUED (1<<0) 93 }; 94 95 #ifdef MFW 96 typedef u8 (* THREAD_FUNC_PTR) (struct task_t *i_task); 97 #else 98 #define THREAD_FUNC_PTR u32 99 #endif 100 101 struct mt_thread_stat { 102 u32 total_cpu_time; 103 u32 times_in_cpu; 104 u32 going_to_sleep_count; 105 u32 waking_up_count; 106 u32 swim_failure_cnt; 107 u32 swim_failure_timeout_cnt; 108 }; 109 110 struct thread_t { 111 u32 current_SP; /* Current_SP will be initialized as the start of stack */ 112 u32 stack_guard_addr; 113 THREAD_FUNC_PTR main_func; /* Entry point to the thread. */ 114 u32 start_time; /* The time that the thread started to run */ 115 u32 time_slice_ticks; /* Const value initialized once during compilation (only for the Network Manager) */ 116 u32 /* thread_state_e*/ state; 117 u32 sleep_time; /* In ticks */ 118 u32 sleep_length; /* In ticks */ 119 u32 swim_load_fail_time; 120 struct tasks_queue_t queue; 121 struct mt_thread_stat stat; 122 }; 123 124 struct scheduler_stat_t { 125 u32 times_called; 126 }; 127 128 struct scheduler_t { 129 u32 cur_thread; 130 struct scheduler_stat_t stat; 131 }; 132 133 // Main structure 134 struct multi_thread_t { 135 struct thread_t thread[NUM_THREADS]; 136 struct scheduler_t sched; 137 }; 138 139 #endif // MULTI_THREAD_DEF_H 140