| Chelsio S3 iSCSI Driver for Linux | 
 |  | 
 | Introduction | 
 | ============ | 
 |  | 
 | The Chelsio T3 ASIC based Adapters (S310, S320, S302, S304, Mezz cards, etc. | 
 | series of products) support iSCSI acceleration and iSCSI Direct Data Placement | 
 | (DDP) where the hardware handles the expensive byte touching operations, such | 
 | as CRC computation and verification, and direct DMA to the final host memory | 
 | destination: | 
 |  | 
 | 	- iSCSI PDU digest generation and verification | 
 |  | 
 | 	  On transmitting, Chelsio S3 h/w computes and inserts the Header and | 
 | 	  Data digest into the PDUs. | 
 | 	  On receiving, Chelsio S3 h/w computes and verifies the Header and | 
 | 	  Data digest of the PDUs. | 
 |  | 
 | 	- Direct Data Placement (DDP) | 
 |  | 
 | 	  S3 h/w can directly place the iSCSI Data-In or Data-Out PDU's | 
 | 	  payload into pre-posted final destination host-memory buffers based | 
 | 	  on the Initiator Task Tag (ITT) in Data-In or Target Task Tag (TTT) | 
 | 	  in Data-Out PDUs. | 
 |  | 
 | 	- PDU Transmit and Recovery | 
 |  | 
 | 	  On transmitting, S3 h/w accepts the complete PDU (header + data) | 
 | 	  from the host driver, computes and inserts the digests, decomposes | 
 | 	  the PDU into multiple TCP segments if necessary, and transmit all | 
 | 	  the TCP segments onto the wire. It handles TCP retransmission if | 
 | 	  needed. | 
 |  | 
 | 	  On receiving, S3 h/w recovers the iSCSI PDU by reassembling TCP | 
 | 	  segments, separating the header and data, calculating and verifying | 
 | 	  the digests, then forwarding the header to the host. The payload data, | 
 | 	  if possible, will be directly placed into the pre-posted host DDP | 
 | 	  buffer. Otherwise, the payload data will be sent to the host too. | 
 |  | 
 | The cxgb3i driver interfaces with open-iscsi initiator and provides the iSCSI | 
 | acceleration through Chelsio hardware wherever applicable. | 
 |  | 
 | Using the cxgb3i Driver | 
 | ======================= | 
 |  | 
 | The following steps need to be taken to accelerates the open-iscsi initiator: | 
 |  | 
 | 1. Load the cxgb3i driver: "modprobe cxgb3i" | 
 |  | 
 |    The cxgb3i module registers a new transport class "cxgb3i" with open-iscsi. | 
 |  | 
 |    * in the case of recompiling the kernel, the cxgb3i selection is located at | 
 | 	Device Drivers | 
 | 		SCSI device support ---> | 
 | 			[*] SCSI low-level drivers  ---> | 
 | 				<M>   Chelsio S3xx iSCSI support | 
 |  | 
 | 2. Create an interface file located under /etc/iscsi/ifaces/ for the new | 
 |    transport class "cxgb3i". | 
 |  | 
 |    The content of the file should be in the following format: | 
 | 	iface.transport_name = cxgb3i | 
 | 	iface.net_ifacename = <ethX> | 
 | 	iface.ipaddress = <iscsi ip address> | 
 |  | 
 |    * if iface.ipaddress is specified, <iscsi ip address> needs to be either the | 
 | 	same as the ethX's ip address or an address on the same subnet. Make | 
 | 	sure the ip address is unique in the network. | 
 |  | 
 | 3. edit /etc/iscsi/iscsid.conf | 
 |    The default setting for MaxRecvDataSegmentLength (131072) is too big; | 
 |    replace with a value no bigger than 15360 (for example 8192): | 
 |  | 
 | 	node.conn[0].iscsi.MaxRecvDataSegmentLength = 8192 | 
 |  | 
 |    * The login would fail for a normal session if MaxRecvDataSegmentLength is | 
 | 	too big.  A error message in the format of | 
 | 	"cxgb3i: ERR! MaxRecvSegmentLength <X> too big. Need to be <= <Y>." | 
 | 	would be logged to dmesg. | 
 |  | 
 | 4. To direct open-iscsi traffic to go through cxgb3i's accelerated path, | 
 |    "-I <iface file name>" option needs to be specified with most of the | 
 |    iscsiadm command. <iface file name> is the transport interface file created | 
 |    in step 2. |