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