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