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