2 * cxgb3i_pdu.c: Chelsio S3xx iSCSI driver.
4 * Copyright (c) 2008 Chelsio Communications, Inc.
5 * Copyright (c) 2008 Mike Christie
6 * Copyright (c) 2008 Red Hat, Inc. All rights reserved.
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation.
12 * Written by: Karen Xie (kxie@chelsio.com)
15 #include <linux/skbuff.h>
16 #include <linux/crypto.h>
17 #include <scsi/scsi_cmnd.h>
18 #include <scsi/scsi_host.h>
21 #include "cxgb3i_pdu.h"
23 #ifdef __DEBUG_CXGB3I_RX__
24 #define cxgb3i_rx_debug cxgb3i_log_debug
26 #define cxgb3i_rx_debug(fmt...)
29 #ifdef __DEBUG_CXGB3I_TX__
30 #define cxgb3i_tx_debug cxgb3i_log_debug
32 #define cxgb3i_tx_debug(fmt...)
35 /* always allocate rooms for AHS */
36 #define SKB_TX_PDU_HEADER_LEN \
37 (sizeof(struct iscsi_hdr) + ISCSI_MAX_AHS_SIZE)
38 static unsigned int skb_extra_headroom;
39 static struct page *pad_page;
42 * pdu receive, interact with libiscsi_tcp
44 static inline int read_pdu_skb(struct iscsi_conn *conn, struct sk_buff *skb,
45 unsigned int offset, int offloaded)
50 bytes_read = iscsi_tcp_recv_skb(conn, skb, offset, offloaded, &status);
52 case ISCSI_TCP_CONN_ERR:
54 case ISCSI_TCP_SUSPENDED:
55 /* no transfer - just have caller flush queue */
57 case ISCSI_TCP_SKB_DONE:
59 * pdus should always fit in the skb and we should get
60 * segment done notifcation.
62 iscsi_conn_printk(KERN_ERR, conn, "Invalid pdu or skb.");
64 case ISCSI_TCP_SEGMENT_DONE:
67 iscsi_conn_printk(KERN_ERR, conn, "Invalid iscsi_tcp_recv_skb "
68 "status %d\n", status);
73 static int cxgb3i_conn_read_pdu_skb(struct iscsi_conn *conn,
76 struct iscsi_tcp_conn *tcp_conn = conn->dd_data;
81 cxgb3i_rx_debug("conn 0x%p, skb 0x%p, len %u, flag 0x%x.\n",
82 conn, skb, skb->len, skb_ulp_mode(skb));
84 if (!iscsi_tcp_recv_segment_is_hdr(tcp_conn)) {
85 iscsi_conn_failure(conn, ISCSI_ERR_PROTO);
89 if (conn->hdrdgst_en && (skb_ulp_mode(skb) & ULP2_FLAG_HCRC_ERROR)) {
90 iscsi_conn_failure(conn, ISCSI_ERR_HDR_DGST);
94 if (conn->datadgst_en && (skb_ulp_mode(skb) & ULP2_FLAG_DCRC_ERROR)) {
95 iscsi_conn_failure(conn, ISCSI_ERR_DATA_DGST);
100 rc = read_pdu_skb(conn, skb, 0, 0);
104 if (iscsi_tcp_recv_segment_is_hdr(tcp_conn))
108 if (conn->hdrdgst_en)
109 offset += ISCSI_DIGEST_SIZE;
112 if (skb_ulp_mode(skb) & ULP2_FLAG_DATA_DDPED) {
113 cxgb3i_rx_debug("skb 0x%p, opcode 0x%x, data %u, ddp'ed, "
116 tcp_conn->in.hdr->opcode & ISCSI_OPCODE_MASK,
117 tcp_conn->in.datalen,
118 ntohl(tcp_conn->in.hdr->itt));
121 cxgb3i_rx_debug("skb 0x%p, opcode 0x%x, data %u, NOT ddp'ed, "
124 tcp_conn->in.hdr->opcode & ISCSI_OPCODE_MASK,
125 tcp_conn->in.datalen,
126 ntohl(tcp_conn->in.hdr->itt));
127 offset += sizeof(struct cpl_iscsi_hdr_norss);
130 rc = read_pdu_skb(conn, skb, offset, offloaded);
138 * pdu transmit, interact with libiscsi_tcp
140 static inline void tx_skb_setmode(struct sk_buff *skb, int hcrc, int dcrc)
148 skb_ulp_mode(skb) = (ULP_MODE_ISCSI << 4) | submode;
151 void cxgb3i_conn_cleanup_task(struct iscsi_task *task)
153 struct cxgb3i_task_data *tdata = task->dd_data +
154 sizeof(struct iscsi_tcp_task);
156 /* never reached the xmit task callout */
158 __kfree_skb(tdata->skb);
159 memset(tdata, 0, sizeof(struct cxgb3i_task_data));
161 /* MNC - Do we need a check in case this is called but
162 * cxgb3i_conn_alloc_pdu has never been called on the task */
163 cxgb3i_release_itt(task, task->hdr_itt);
164 iscsi_tcp_cleanup_task(task);
167 static int sgl_seek_offset(struct scatterlist *sgl, unsigned int sgcnt,
168 unsigned int offset, unsigned int *off,
169 struct scatterlist **sgp)
172 struct scatterlist *sg;
174 for_each_sg(sgl, sg, sgcnt, i) {
175 if (offset < sg->length) {
180 offset -= sg->length;
185 static int sgl_read_to_frags(struct scatterlist *sg, unsigned int sgoffset,
186 unsigned int dlen, skb_frag_t *frags,
189 unsigned int datalen = dlen;
190 unsigned int sglen = sg->length - sgoffset;
191 struct page *page = sg_page(sg);
201 cxgb3i_log_error("%s, sg NULL, len %u/%u.\n",
202 __func__, datalen, dlen);
210 copy = min(datalen, sglen);
211 if (i && page == frags[i - 1].page &&
212 sgoffset + sg->offset ==
213 frags[i - 1].page_offset + frags[i - 1].size) {
214 frags[i - 1].size += copy;
217 cxgb3i_log_error("%s, too many pages %u, "
218 "dlen %u.\n", __func__,
223 frags[i].page = page;
224 frags[i].page_offset = sg->offset + sgoffset;
225 frags[i].size = copy;
236 int cxgb3i_conn_alloc_pdu(struct iscsi_task *task, u8 opcode)
238 struct iscsi_conn *conn = task->conn;
239 struct iscsi_tcp_task *tcp_task = task->dd_data;
240 struct cxgb3i_task_data *tdata = task->dd_data + sizeof(*tcp_task);
241 struct scsi_cmnd *sc = task->sc;
242 int headroom = SKB_TX_PDU_HEADER_LEN;
244 tcp_task->dd_data = tdata;
247 /* write command, need to send data pdus */
248 if (skb_extra_headroom && (opcode == ISCSI_OP_SCSI_DATA_OUT ||
249 (opcode == ISCSI_OP_SCSI_CMD &&
250 (scsi_bidi_cmnd(sc) || sc->sc_data_direction == DMA_TO_DEVICE))))
251 headroom += min(skb_extra_headroom, conn->max_xmit_dlength);
253 tdata->skb = alloc_skb(TX_HEADER_LEN + headroom, GFP_ATOMIC);
256 skb_reserve(tdata->skb, TX_HEADER_LEN);
258 cxgb3i_tx_debug("task 0x%p, opcode 0x%x, skb 0x%p.\n",
259 task, opcode, tdata->skb);
261 task->hdr = (struct iscsi_hdr *)tdata->skb->data;
262 task->hdr_max = SKB_TX_PDU_HEADER_LEN;
264 /* data_out uses scsi_cmd's itt */
265 if (opcode != ISCSI_OP_SCSI_DATA_OUT)
266 cxgb3i_reserve_itt(task, &task->hdr->itt);
271 int cxgb3i_conn_init_pdu(struct iscsi_task *task, unsigned int offset,
274 struct iscsi_conn *conn = task->conn;
275 struct iscsi_tcp_task *tcp_task = task->dd_data;
276 struct cxgb3i_task_data *tdata = tcp_task->dd_data;
277 struct sk_buff *skb = tdata->skb;
278 unsigned int datalen = count;
279 int i, padlen = iscsi_padding(count);
282 cxgb3i_tx_debug("task 0x%p,0x%p, offset %u, count %u, skb 0x%p.\n",
283 task, task->sc, offset, count, skb);
285 skb_put(skb, task->hdr_len);
286 tx_skb_setmode(skb, conn->hdrdgst_en, datalen ? conn->datadgst_en : 0);
291 struct scsi_data_buffer *sdb = scsi_out(task->sc);
292 struct scatterlist *sg = NULL;
295 tdata->offset = offset;
296 tdata->count = count;
297 err = sgl_seek_offset(sdb->table.sgl, sdb->table.nents,
298 tdata->offset, &tdata->sgoffset, &sg);
300 cxgb3i_log_warn("tpdu, sgl %u, bad offset %u/%u.\n",
301 sdb->table.nents, tdata->offset,
305 err = sgl_read_to_frags(sg, tdata->sgoffset, tdata->count,
306 tdata->frags, MAX_PDU_FRAGS);
308 cxgb3i_log_warn("tpdu, sgl %u, bad offset %u + %u.\n",
309 sdb->table.nents, tdata->offset,
313 tdata->nr_frags = err;
315 if (tdata->nr_frags > MAX_SKB_FRAGS ||
316 (padlen && tdata->nr_frags == MAX_SKB_FRAGS)) {
317 char *dst = skb->data + task->hdr_len;
318 skb_frag_t *frag = tdata->frags;
320 /* data fits in the skb's headroom */
321 for (i = 0; i < tdata->nr_frags; i++, frag++) {
322 char *src = kmap_atomic(frag->page,
325 memcpy(dst, src+frag->page_offset, frag->size);
327 kunmap_atomic(src, KM_SOFTIRQ0);
330 memset(dst, 0, padlen);
333 skb_put(skb, count + padlen);
335 /* data fit into frag_list */
336 for (i = 0; i < tdata->nr_frags; i++)
337 get_page(tdata->frags[i].page);
339 memcpy(skb_shinfo(skb)->frags, tdata->frags,
340 sizeof(skb_frag_t) * tdata->nr_frags);
341 skb_shinfo(skb)->nr_frags = tdata->nr_frags;
343 skb->data_len += count;
344 skb->truesize += count;
348 pg = virt_to_page(task->data);
351 skb_fill_page_desc(skb, 0, pg, offset_in_page(task->data),
354 skb->data_len += count;
355 skb->truesize += count;
359 i = skb_shinfo(skb)->nr_frags;
361 skb_fill_page_desc(skb, skb_shinfo(skb)->nr_frags, pad_page, 0,
364 skb->data_len += padlen;
365 skb->truesize += padlen;
372 int cxgb3i_conn_xmit_pdu(struct iscsi_task *task)
374 struct iscsi_tcp_conn *tcp_conn = task->conn->dd_data;
375 struct cxgb3i_conn *cconn = tcp_conn->dd_data;
376 struct iscsi_tcp_task *tcp_task = task->dd_data;
377 struct cxgb3i_task_data *tdata = tcp_task->dd_data;
378 struct sk_buff *skb = tdata->skb;
379 unsigned int datalen;
385 datalen = skb->data_len;
387 err = cxgb3i_c3cn_send_pdus(cconn->cep->c3cn, skb);
391 cxgb3i_tx_debug("task 0x%p, skb 0x%p, len %u/%u, rv %d.\n",
392 task, skb, skb->len, skb->data_len, err);
394 if (task->conn->hdrdgst_en)
395 pdulen += ISCSI_DIGEST_SIZE;
396 if (datalen && task->conn->datadgst_en)
397 pdulen += ISCSI_DIGEST_SIZE;
399 task->conn->txdata_octets += pdulen;
403 if (err == -EAGAIN || err == -ENOBUFS) {
404 /* reset skb to send when we are called again */
410 cxgb3i_tx_debug("itt 0x%x, skb 0x%p, len %u/%u, xmit err %d.\n",
411 task->itt, skb, skb->len, skb->data_len, err);
412 iscsi_conn_printk(KERN_ERR, task->conn, "xmit err %d.\n", err);
413 iscsi_conn_failure(task->conn, ISCSI_ERR_XMIT_FAILED);
417 int cxgb3i_pdu_init(void)
419 if (SKB_TX_HEADROOM > (512 * MAX_SKB_FRAGS))
420 skb_extra_headroom = SKB_TX_HEADROOM;
421 pad_page = alloc_page(GFP_KERNEL);
424 memset(page_address(pad_page), 0, PAGE_SIZE);
428 void cxgb3i_pdu_cleanup(void)
431 __free_page(pad_page);
436 void cxgb3i_conn_pdu_ready(struct s3_conn *c3cn)
439 unsigned int read = 0;
440 struct iscsi_conn *conn = c3cn->user_data;
443 cxgb3i_rx_debug("cn 0x%p.\n", c3cn);
445 read_lock(&c3cn->callback_lock);
446 if (unlikely(!conn || conn->suspend_rx)) {
447 cxgb3i_rx_debug("conn 0x%p, id %d, suspend_rx %lu!\n",
448 conn, conn ? conn->id : 0xFF,
449 conn ? conn->suspend_rx : 0xFF);
450 read_unlock(&c3cn->callback_lock);
453 skb = skb_peek(&c3cn->receive_queue);
454 while (!err && skb) {
455 __skb_unlink(skb, &c3cn->receive_queue);
456 read += skb_rx_pdulen(skb);
457 cxgb3i_rx_debug("conn 0x%p, cn 0x%p, rx skb 0x%p, pdulen %u.\n",
458 conn, c3cn, skb, skb_rx_pdulen(skb));
459 err = cxgb3i_conn_read_pdu_skb(conn, skb);
461 skb = skb_peek(&c3cn->receive_queue);
463 read_unlock(&c3cn->callback_lock);
465 c3cn->copied_seq += read;
466 cxgb3i_c3cn_rx_credits(c3cn, read);
468 conn->rxdata_octets += read;
471 cxgb3i_log_info("conn 0x%p rx failed err %d.\n", conn, err);
472 iscsi_conn_failure(conn, ISCSI_ERR_CONN_FAILED);
476 void cxgb3i_conn_tx_open(struct s3_conn *c3cn)
478 struct iscsi_conn *conn = c3cn->user_data;
480 cxgb3i_tx_debug("cn 0x%p.\n", c3cn);
482 cxgb3i_tx_debug("cn 0x%p, cid %d.\n", c3cn, conn->id);
483 iscsi_conn_queue_work(conn);
487 void cxgb3i_conn_closing(struct s3_conn *c3cn)
489 struct iscsi_conn *conn;
491 read_lock(&c3cn->callback_lock);
492 conn = c3cn->user_data;
493 if (conn && c3cn->state != C3CN_STATE_ESTABLISHED)
494 iscsi_conn_failure(conn, ISCSI_ERR_CONN_FAILED);
495 read_unlock(&c3cn->callback_lock);