1d14abf15SRobert Mustacchi
2d14abf15SRobert Mustacchi
3d14abf15SRobert Mustacchi #include "lm5710.h"
4d14abf15SRobert Mustacchi #include "command.h"
5d14abf15SRobert Mustacchi #include "everest_l5cm_constants.h"
6d14abf15SRobert Mustacchi #include "lm_l5if.h"
7d14abf15SRobert Mustacchi
lm_sc_post_init_request(IN struct _lm_device_t * pdev,IN lm_iscsi_state_t * iscsi,IN lm_iscsi_slow_path_request_t * sp_req,OUT u8_t * command,OUT u64_t * data)8d14abf15SRobert Mustacchi static lm_status_t lm_sc_post_init_request(
9d14abf15SRobert Mustacchi IN struct _lm_device_t *pdev,
10d14abf15SRobert Mustacchi IN lm_iscsi_state_t *iscsi,
11d14abf15SRobert Mustacchi IN lm_iscsi_slow_path_request_t *sp_req,
12d14abf15SRobert Mustacchi OUT u8_t *command,
13d14abf15SRobert Mustacchi OUT u64_t *data)
14d14abf15SRobert Mustacchi {
15d14abf15SRobert Mustacchi DbgMessage(pdev, VERBOSEl5sp, "##lm__post_initiate_offload_request\n");
16d14abf15SRobert Mustacchi DbgBreakIf(iscsi->hdr.status != STATE_STATUS_INIT_CONTEXT);
17d14abf15SRobert Mustacchi
18d14abf15SRobert Mustacchi *command = ISCSI_RAMROD_CMD_ID_INIT;
19d14abf15SRobert Mustacchi *data = iscsi->ctx_phys.as_u64;
20d14abf15SRobert Mustacchi
21*48bbca81SDaniel Hoffman return LM_STATUS_PENDING;
22d14abf15SRobert Mustacchi }
23d14abf15SRobert Mustacchi
24d14abf15SRobert Mustacchi
25d14abf15SRobert Mustacchi
lm_sc_post_update_request(IN struct _lm_device_t * pdev,IN lm_iscsi_state_t * iscsi,IN lm_iscsi_slow_path_request_t * sp_req,OUT u8_t * command,OUT u64_t * data)26d14abf15SRobert Mustacchi static lm_status_t lm_sc_post_update_request(
27d14abf15SRobert Mustacchi IN struct _lm_device_t *pdev,
28d14abf15SRobert Mustacchi IN lm_iscsi_state_t *iscsi,
29d14abf15SRobert Mustacchi IN lm_iscsi_slow_path_request_t *sp_req,
30d14abf15SRobert Mustacchi OUT u8_t *command,
31d14abf15SRobert Mustacchi OUT u64_t *data)
32d14abf15SRobert Mustacchi {
33d14abf15SRobert Mustacchi struct protocol_common_spe spe = {0};
34d14abf15SRobert Mustacchi
35d14abf15SRobert Mustacchi DbgMessage(pdev, VERBOSEl5sp, "##lm__post_initiate_offload_request\n");
36d14abf15SRobert Mustacchi DbgBreakIf(iscsi->hdr.status != STATE_STATUS_NORMAL);
37d14abf15SRobert Mustacchi
38d14abf15SRobert Mustacchi *command = ISCSI_RAMROD_CMD_ID_UPDATE_CONN;
39d14abf15SRobert Mustacchi spe.data.phy_address.hi = iscsi->sp_req_data.phys_addr.as_u32.high;
40d14abf15SRobert Mustacchi spe.data.phy_address.lo = iscsi->sp_req_data.phys_addr.as_u32.low;
41d14abf15SRobert Mustacchi *data = *((u64_t*)(&(spe.data.phy_address)));
42d14abf15SRobert Mustacchi
43*48bbca81SDaniel Hoffman return LM_STATUS_PENDING;
44d14abf15SRobert Mustacchi }
45d14abf15SRobert Mustacchi
46d14abf15SRobert Mustacchi
47d14abf15SRobert Mustacchi
48d14abf15SRobert Mustacchi /* Desciption:
49d14abf15SRobert Mustacchi * post slow path request of given type for given iscsi state
50d14abf15SRobert Mustacchi * Assumptions:
51*48bbca81SDaniel Hoffman * - caller initialized request->type according to its specific request
52d14abf15SRobert Mustacchi * - caller allocated space for request->data, according to the specific request type
53d14abf15SRobert Mustacchi * - all previous slow path requests for given tcp state are already completed
54d14abf15SRobert Mustacchi * Returns:
55d14abf15SRobert Mustacchi * PENDING, SUCCESS or any failure */
lm_sc_post_slow_path_request(IN struct _lm_device_t * pdev,IN lm_iscsi_state_t * iscsi,IN lm_iscsi_slow_path_request_t * request)56d14abf15SRobert Mustacchi lm_status_t lm_sc_post_slow_path_request(
57d14abf15SRobert Mustacchi IN struct _lm_device_t *pdev,
58d14abf15SRobert Mustacchi IN lm_iscsi_state_t *iscsi,
59d14abf15SRobert Mustacchi IN lm_iscsi_slow_path_request_t *request)
60d14abf15SRobert Mustacchi {
61d14abf15SRobert Mustacchi lm_status_t lm_status = LM_STATUS_SUCCESS;
62d14abf15SRobert Mustacchi u64_t data = 0;
63d14abf15SRobert Mustacchi u8_t command = 0;
64*48bbca81SDaniel Hoffman
65d14abf15SRobert Mustacchi DbgBreakIf(!(pdev && iscsi && request));
66d14abf15SRobert Mustacchi DbgMessage(pdev, VERBOSEl5sp, "### lm_sc_post_slow_path_request cid=%d, type=%d\n", iscsi->cid, request->type);
67d14abf15SRobert Mustacchi
68d14abf15SRobert Mustacchi switch (request->type)
69d14abf15SRobert Mustacchi {
70d14abf15SRobert Mustacchi /* NirV: called under lock, iscsi_state is being changed */
71d14abf15SRobert Mustacchi case SP_REQUEST_SC_INIT:
72d14abf15SRobert Mustacchi lm_status = lm_sc_post_init_request(pdev, iscsi, request, &command, &data);
73d14abf15SRobert Mustacchi break;
74d14abf15SRobert Mustacchi
75*48bbca81SDaniel Hoffman case SP_REQUEST_SC_UPDATE:
76d14abf15SRobert Mustacchi lm_status = lm_sc_post_update_request(pdev, iscsi, request, &command, &data);
77d14abf15SRobert Mustacchi break;
78d14abf15SRobert Mustacchi
79d14abf15SRobert Mustacchi default:
80d14abf15SRobert Mustacchi lm_status = LM_STATUS_FAILURE;
81d14abf15SRobert Mustacchi DbgBreakMsg("Illegal slow path request type!\n");
82d14abf15SRobert Mustacchi break;
83d14abf15SRobert Mustacchi }
84d14abf15SRobert Mustacchi
85d14abf15SRobert Mustacchi if (lm_status == LM_STATUS_PENDING)
86d14abf15SRobert Mustacchi {
87d14abf15SRobert Mustacchi DbgMessage(pdev, VERBOSEl5sp,
88d14abf15SRobert Mustacchi "calling lm_command_post, cid=%d, command=%d, con_type=%d, data=%lx\n",
89d14abf15SRobert Mustacchi iscsi->cid, command, ISCSI_CONNECTION_TYPE, data);
90*48bbca81SDaniel Hoffman lm_command_post(pdev, iscsi->cid, command, CMD_PRIORITY_NORMAL, ISCSI_CONNECTION_TYPE/*ulp*/, data);
91d14abf15SRobert Mustacchi }
92d14abf15SRobert Mustacchi
93*48bbca81SDaniel Hoffman request->status = lm_status;
94d14abf15SRobert Mustacchi return lm_status;
95d14abf15SRobert Mustacchi }
96d14abf15SRobert Mustacchi
97d14abf15SRobert Mustacchi
98d14abf15SRobert Mustacchi
99d14abf15SRobert Mustacchi /* Desciption:
100d14abf15SRobert Mustacchi * initiate a caller allocated lm iscsi state
101d14abf15SRobert Mustacchi * Assumptions:
102d14abf15SRobert Mustacchi * - caller already zeroed given iscsi state
103d14abf15SRobert Mustacchi * Returns:
104d14abf15SRobert Mustacchi * SUCCESS or any failure */
lm_sc_init_iscsi_state(struct _lm_device_t * pdev,lm_state_block_t * state_blk,lm_iscsi_state_t * iscsi)105d14abf15SRobert Mustacchi lm_status_t lm_sc_init_iscsi_state(
106d14abf15SRobert Mustacchi struct _lm_device_t *pdev,
107d14abf15SRobert Mustacchi lm_state_block_t *state_blk,
108d14abf15SRobert Mustacchi lm_iscsi_state_t *iscsi)
109d14abf15SRobert Mustacchi {
110d14abf15SRobert Mustacchi DbgMessage(pdev, VERBOSEl5sp, "###lm_sc_init_iscsi_state, ptr=%p\n", iscsi);
111d14abf15SRobert Mustacchi DbgBreakIf(!(pdev && state_blk && iscsi));
112d14abf15SRobert Mustacchi
113d14abf15SRobert Mustacchi iscsi->hdr.state_blk = state_blk;
114d14abf15SRobert Mustacchi iscsi->hdr.state_id = STATE_ID_UNKNOWN;
115d14abf15SRobert Mustacchi iscsi->hdr.status = STATE_STATUS_INIT;
116d14abf15SRobert Mustacchi d_list_push_tail(&pdev->iscsi_info.run_time.iscsi_list, &iscsi->hdr.link);
117d14abf15SRobert Mustacchi
118d14abf15SRobert Mustacchi // NirV: sc: future statistics update
119d14abf15SRobert Mustacchi
120*48bbca81SDaniel Hoffman /* the rest of the iscsi state's fields that require initialization value other than 0,
121d14abf15SRobert Mustacchi * will be initialized later (when lm_sc_init_iscsi_context is called) */
122*48bbca81SDaniel Hoffman
123d14abf15SRobert Mustacchi return LM_STATUS_SUCCESS;
124d14abf15SRobert Mustacchi }
125d14abf15SRobert Mustacchi
126d14abf15SRobert Mustacchi
127d14abf15SRobert Mustacchi
128d14abf15SRobert Mustacchi /* Desciption:
129d14abf15SRobert Mustacchi * delete iscsi state from lm _except_ from actual freeing of memory.
130d14abf15SRobert Mustacchi * the task of freeing of memory is done in lm_sc_free_iscsi_state()
131d14abf15SRobert Mustacchi * Assumptions:
132*48bbca81SDaniel Hoffman * global toe lock is taken by the caller
133d14abf15SRobert Mustacchi */
lm_sc_del_iscsi_state(struct _lm_device_t * pdev,lm_iscsi_state_t * iscsi)134d14abf15SRobert Mustacchi void lm_sc_del_iscsi_state(
135d14abf15SRobert Mustacchi struct _lm_device_t *pdev,
136d14abf15SRobert Mustacchi lm_iscsi_state_t *iscsi)
137d14abf15SRobert Mustacchi {
138d14abf15SRobert Mustacchi u8_t notify_fw = 1;
139d14abf15SRobert Mustacchi
140d14abf15SRobert Mustacchi DbgMessage(pdev, VERBOSEl5sp, "###lm_sc_del_iscsi_state\n");
141d14abf15SRobert Mustacchi DbgBreakIf(!(pdev && iscsi));
142*48bbca81SDaniel Hoffman DbgBreakIf(iscsi->hdr.status >= STATE_STATUS_OFFLOAD_PENDING &&
143d14abf15SRobert Mustacchi iscsi->hdr.status < STATE_STATUS_UPLOAD_DONE);
144d14abf15SRobert Mustacchi
145d14abf15SRobert Mustacchi /* just a moment before we delete this connection, lets take it's info... */
146d14abf15SRobert Mustacchi /*lm_tcp_collect_stats(pdev, tcp);*/
147d14abf15SRobert Mustacchi
148d14abf15SRobert Mustacchi d_list_remove_entry(
149d14abf15SRobert Mustacchi &pdev->iscsi_info.run_time.iscsi_list,
150d14abf15SRobert Mustacchi &iscsi->hdr.link);
151d14abf15SRobert Mustacchi /*pdev->iscsi_info.stats.total_upld++;*/
152d14abf15SRobert Mustacchi
153d14abf15SRobert Mustacchi
154*48bbca81SDaniel Hoffman /* tcp->cid could have not been initialized if delete of state
155d14abf15SRobert Mustacchi is a result of a failed initialization */
156*48bbca81SDaniel Hoffman DbgBreakIf(iscsi->hdr.status != STATE_STATUS_UPLOAD_DONE &&
157d14abf15SRobert Mustacchi iscsi->hdr.status != STATE_STATUS_INIT_OFFLOAD_ERR);
158d14abf15SRobert Mustacchi
159d14abf15SRobert Mustacchi if (iscsi->hdr.status == STATE_STATUS_INIT_OFFLOAD_ERR) {
160d14abf15SRobert Mustacchi notify_fw = 0;
161*48bbca81SDaniel Hoffman }
162*48bbca81SDaniel Hoffman
163d14abf15SRobert Mustacchi lm_free_cid_resc(pdev, ISCSI_CONNECTION_TYPE, iscsi->cid, notify_fw);
164d14abf15SRobert Mustacchi
165*48bbca81SDaniel Hoffman iscsi->hdr.state_blk = NULL;
166d14abf15SRobert Mustacchi iscsi->cid = 0;
167d14abf15SRobert Mustacchi iscsi->ctx_virt = NULL;
168d14abf15SRobert Mustacchi iscsi->ctx_phys.as_u64 = 0;
169d14abf15SRobert Mustacchi } /* lm_sc_del_iscsi_state */
170d14abf15SRobert Mustacchi
171d14abf15SRobert Mustacchi
172d14abf15SRobert Mustacchi /* clean up the lm_fcoe_state */
173d14abf15SRobert Mustacchi void
lm_fc_del_fcoe_state(struct _lm_device_t * pdev,lm_fcoe_state_t * fcoe)174d14abf15SRobert Mustacchi lm_fc_del_fcoe_state(
175d14abf15SRobert Mustacchi struct _lm_device_t *pdev,
176d14abf15SRobert Mustacchi lm_fcoe_state_t *fcoe)
177d14abf15SRobert Mustacchi {
178d14abf15SRobert Mustacchi DbgMessage(pdev, VERBOSEl5sp, "###lm_fc_del_fcoe_state\n");
179d14abf15SRobert Mustacchi DbgBreakIf(!(pdev && fcoe));
180d14abf15SRobert Mustacchi /*
181*48bbca81SDaniel Hoffman DbgBreakIf(fcoe->hdr.status >= STATE_STATUS_OFFLOAD_PENDING &&
182d14abf15SRobert Mustacchi fcoe->hdr.status < STATE_STATUS_UPLOAD_DONE);
183d14abf15SRobert Mustacchi */
184d14abf15SRobert Mustacchi
185d14abf15SRobert Mustacchi /* remove the lm_fcoe_state from the state list */
186d14abf15SRobert Mustacchi d_list_remove_entry(&pdev->fcoe_info.run_time.fcoe_list, &fcoe->hdr.link);
187d14abf15SRobert Mustacchi
188*48bbca81SDaniel Hoffman /* tcp->cid could have not been initialized if delete of state
189d14abf15SRobert Mustacchi is a result of a failed initialization */
190d14abf15SRobert Mustacchi
191d14abf15SRobert Mustacchi /*
192*48bbca81SDaniel Hoffman DbgBreakIf(fcoe->hdr.status != STATE_STATUS_UPLOAD_DONE &&
193d14abf15SRobert Mustacchi fcoe->hdr.status != STATE_STATUS_INIT_OFFLOAD_ERR);
194d14abf15SRobert Mustacchi */
195d14abf15SRobert Mustacchi } /* lm_fc_del_fcoe_state */
196d14abf15SRobert Mustacchi
197d14abf15SRobert Mustacchi
198d14abf15SRobert Mustacchi
199d14abf15SRobert Mustacchi lm_status_t
lm_fc_init_fcoe_state(struct _lm_device_t * pdev,lm_state_block_t * state_blk,lm_fcoe_state_t * fcoe)200d14abf15SRobert Mustacchi lm_fc_init_fcoe_state(
201d14abf15SRobert Mustacchi struct _lm_device_t *pdev,
202d14abf15SRobert Mustacchi lm_state_block_t *state_blk,
203d14abf15SRobert Mustacchi lm_fcoe_state_t *fcoe)
204d14abf15SRobert Mustacchi {
205d14abf15SRobert Mustacchi DbgMessage(pdev, VERBOSEl5sp, "###lm_fc_init_fcoe_state, ptr=%p\n", fcoe);
206d14abf15SRobert Mustacchi DbgBreakIf(!(pdev && state_blk && fcoe));
207d14abf15SRobert Mustacchi
208d14abf15SRobert Mustacchi fcoe->hdr.state_blk = state_blk;
209d14abf15SRobert Mustacchi fcoe->hdr.state_id = STATE_ID_UNKNOWN;
210d14abf15SRobert Mustacchi fcoe->hdr.status = STATE_STATUS_INIT;
211d14abf15SRobert Mustacchi d_list_push_tail(&pdev->fcoe_info.run_time.fcoe_list, &fcoe->hdr.link);
212d14abf15SRobert Mustacchi
213*48bbca81SDaniel Hoffman /* the rest of the fcoe state's fields that require initialization value other than 0,
214d14abf15SRobert Mustacchi * will be initialized later (when lm_fc_init_fcoe_context is called) */
215*48bbca81SDaniel Hoffman
216d14abf15SRobert Mustacchi return LM_STATUS_SUCCESS;
217d14abf15SRobert Mustacchi }
218d14abf15SRobert Mustacchi
219d14abf15SRobert Mustacchi
220d14abf15SRobert Mustacchi
lm_sc_init_sp_req_type(struct _lm_device_t * pdev,lm_iscsi_state_t * iscsi,lm_iscsi_slow_path_request_t * lm_req,void * req_input_data)221d14abf15SRobert Mustacchi void lm_sc_init_sp_req_type(
222*48bbca81SDaniel Hoffman struct _lm_device_t * pdev,
223*48bbca81SDaniel Hoffman lm_iscsi_state_t * iscsi,
224*48bbca81SDaniel Hoffman lm_iscsi_slow_path_request_t * lm_req,
225d14abf15SRobert Mustacchi void * req_input_data)
226d14abf15SRobert Mustacchi {
227d14abf15SRobert Mustacchi void *update_kwqe_virt;
228d14abf15SRobert Mustacchi struct protocol_common_spe spe = {0};
229d14abf15SRobert Mustacchi
230*48bbca81SDaniel Hoffman switch(lm_req->type) {
231d14abf15SRobert Mustacchi case SP_REQUEST_SC_INIT:
232d14abf15SRobert Mustacchi break;
233*48bbca81SDaniel Hoffman case SP_REQUEST_SC_UPDATE:
234d14abf15SRobert Mustacchi
235d14abf15SRobert Mustacchi spe.data.phy_address.hi = iscsi->sp_req_data.phys_addr.as_u32.high;
236d14abf15SRobert Mustacchi spe.data.phy_address.lo = iscsi->sp_req_data.phys_addr.as_u32.low;
237d14abf15SRobert Mustacchi
238d14abf15SRobert Mustacchi update_kwqe_virt = &iscsi->sp_req_data.virt_addr->update_ctx.kwqe;
239d14abf15SRobert Mustacchi mm_memcpy(update_kwqe_virt, req_input_data, sizeof(struct iscsi_kwqe_conn_update));
240d14abf15SRobert Mustacchi
241d14abf15SRobert Mustacchi break;
242d14abf15SRobert Mustacchi default:
243d14abf15SRobert Mustacchi DbgBreakMsg("lm_sc_init_sp_req_type: Illegal slow path request type!\n");
244d14abf15SRobert Mustacchi }
245d14abf15SRobert Mustacchi } /* lm_init_sp_req_type */
246