Lines Matching +full:no +full:- +full:big +full:- +full:frame +full:- +full:no

1 // SPDX-License-Identifier: GPL-2.0-only
11 * Copyright (c) 2009 Linux-iSCSI.org
12 * Copyright (c) 2009 Nicholas A. Bellinger <nab@linux-iscsi.org>
65 if (cmd->aborted) in ft_queue_data_in()
68 if (se_cmd->scsi_status == SAM_STAT_TASK_SET_FULL) in ft_queue_data_in()
71 ep = fc_seq_exch(cmd->seq); in ft_queue_data_in()
72 lport = ep->lp; in ft_queue_data_in()
73 cmd->seq = fc_seq_start_next(cmd->seq); in ft_queue_data_in()
75 remaining = se_cmd->data_length; in ft_queue_data_in()
78 * Setup to use first mem list entry, unless no data. in ft_queue_data_in()
80 BUG_ON(remaining && !se_cmd->t_data_sg); in ft_queue_data_in()
82 sg = se_cmd->t_data_sg; in ft_queue_data_in()
83 mem_len = sg->length; in ft_queue_data_in()
84 mem_off = sg->offset; in ft_queue_data_in()
88 /* no scatter/gather in skb for odd word length due to fc_seq_send() */ in ft_queue_data_in()
92 struct fc_seq *seq = cmd->seq; in ft_queue_data_in()
96 __func__, ep->xid); in ft_queue_data_in()
101 mem_len = min((size_t)sg->length, remaining); in ft_queue_data_in()
102 mem_off = sg->offset; in ft_queue_data_in()
108 * , then allow 'frame_len' to be as big as 'lso_max' in ft_queue_data_in()
109 * if indicated transfer length is >= lport->lso_max in ft_queue_data_in()
111 frame_len = (lport->seq_offload) ? lport->lso_max : in ft_queue_data_in()
112 cmd->sess->max_frame; in ft_queue_data_in()
116 return -ENOMEM; in ft_queue_data_in()
121 * Setup the frame's max payload which is used by base in ft_queue_data_in()
122 * driver to indicate HW about max frame size, so that in ft_queue_data_in()
126 fr_max_payload(fp) = cmd->sess->max_frame; in ft_queue_data_in()
135 skb_shinfo(fp_skb(fp))->nr_frags, in ft_queue_data_in()
138 fp_skb(fp)->data_len += tlen; in ft_queue_data_in()
139 fp_skb(fp)->truesize += page_size(page); in ft_queue_data_in()
145 tlen = min(tlen, (size_t)(PAGE_SIZE - in ft_queue_data_in()
153 mem_len -= tlen; in ft_queue_data_in()
154 frame_len -= tlen; in ft_queue_data_in()
155 remaining -= tlen; in ft_queue_data_in()
158 (skb_shinfo(fp_skb(fp))->nr_frags < FC_FRAME_SG_LEN)) in ft_queue_data_in()
162 fc_fill_fc_hdr(fp, FC_RCTL_DD_SOL_DATA, ep->did, ep->sid, in ft_queue_data_in()
166 pr_info_ratelimited("%s: Failed to send frame %p, " in ft_queue_data_in()
169 __func__, fp, ep->xid, in ft_queue_data_in()
170 remaining, lport->lso_max); in ft_queue_data_in()
178 se_cmd->scsi_status = SAM_STAT_TASK_SET_FULL; in ft_queue_data_in()
190 target_execute_cmd(&cmd->se_cmd); in ft_execute_work()
194 * Receive write data frame.
198 struct se_cmd *se_cmd = &cmd->se_cmd; in ft_recv_write_data()
199 struct fc_seq *seq = cmd->seq; in ft_recv_write_data()
217 if (!(ntoh24(fh->fh_f_ctl) & FC_FC_REL_OFF)) in ft_recv_write_data()
220 f_ctl = ntoh24(fh->fh_f_ctl); in ft_recv_write_data()
222 lport = ep->lp; in ft_recv_write_data()
223 if (cmd->was_ddp_setup) { in ft_recv_write_data()
231 pr_err("%s: xid 0x%x, f_ctl 0x%x, cmd->sg %p, " in ft_recv_write_data()
232 "cmd->sg_cnt 0x%x. DDP was setup" in ft_recv_write_data()
233 " hence not expected to receive frame with " in ft_recv_write_data()
234 "payload, Frame will be dropped if" in ft_recv_write_data()
236 "not set\n", __func__, ep->xid, f_ctl, in ft_recv_write_data()
237 se_cmd->t_data_sg, se_cmd->t_data_nents); in ft_recv_write_data()
247 * write data frame is received successfully where payload is in ft_recv_write_data()
248 * posted directly to user buffer and only the last frame's in ft_recv_write_data()
261 rel_off = ntohl(fh->fh_parm_offset); in ft_recv_write_data()
265 frame_len -= sizeof(*fh); in ft_recv_write_data()
267 if (rel_off >= se_cmd->data_length) in ft_recv_write_data()
269 if (frame_len + rel_off > se_cmd->data_length) in ft_recv_write_data()
270 frame_len = se_cmd->data_length - rel_off; in ft_recv_write_data()
273 * Setup to use first mem list entry, unless no data. in ft_recv_write_data()
275 BUG_ON(frame_len && !se_cmd->t_data_sg); in ft_recv_write_data()
277 sg = se_cmd->t_data_sg; in ft_recv_write_data()
278 mem_len = sg->length; in ft_recv_write_data()
279 mem_off = sg->offset; in ft_recv_write_data()
286 mem_len = sg->length; in ft_recv_write_data()
287 mem_off = sg->offset; in ft_recv_write_data()
291 rel_off -= mem_len; in ft_recv_write_data()
296 mem_len -= rel_off; in ft_recv_write_data()
304 tlen = min(tlen, (size_t)(PAGE_SIZE - in ft_recv_write_data()
310 frame_len -= tlen; in ft_recv_write_data()
312 mem_len -= tlen; in ft_recv_write_data()
313 cmd->write_data_len += tlen; in ft_recv_write_data()
316 if (cmd->write_data_len == se_cmd->data_length) { in ft_recv_write_data()
317 INIT_WORK(&cmd->work, ft_execute_work); in ft_recv_write_data()
318 queue_work(cmd->sess->tport->tpg->workqueue, &cmd->work); in ft_recv_write_data()
335 seq = cmd->seq; in ft_invl_hw_context()
338 if (cmd->was_ddp_setup && seq) { in ft_invl_hw_context()
341 lport = ep->lp; in ft_invl_hw_context()
342 if (lport && (ep->xid <= lport->lro_xid)) { in ft_invl_hw_context()
347 cmd->write_data_len = lport->tt.ddp_done(lport, in ft_invl_hw_context()
348 ep->xid); in ft_invl_hw_context()
354 * identified using ep->xid) in ft_invl_hw_context()
356 cmd->was_ddp_setup = 0; in ft_invl_hw_context()