|  | @@ -1304,6 +1304,24 @@ static int iscsi_rx_login_response ( struct iscsi_session *iscsi,
 | 
		
	
		
			
			| 1304 | 1304 |   *
 | 
		
	
		
			
			| 1305 | 1305 |   */
 | 
		
	
		
			
			| 1306 | 1306 |  
 | 
		
	
		
			
			|  | 1307 | +/**
 | 
		
	
		
			
			|  | 1308 | + * Pause TX engine
 | 
		
	
		
			
			|  | 1309 | + *
 | 
		
	
		
			
			|  | 1310 | + * @v iscsi		iSCSI session
 | 
		
	
		
			
			|  | 1311 | + */
 | 
		
	
		
			
			|  | 1312 | +static void iscsi_tx_pause ( struct iscsi_session *iscsi ) {
 | 
		
	
		
			
			|  | 1313 | +	process_del ( &iscsi->process );
 | 
		
	
		
			
			|  | 1314 | +}
 | 
		
	
		
			
			|  | 1315 | +
 | 
		
	
		
			
			|  | 1316 | +/**
 | 
		
	
		
			
			|  | 1317 | + * Resume TX engine
 | 
		
	
		
			
			|  | 1318 | + *
 | 
		
	
		
			
			|  | 1319 | + * @v iscsi		iSCSI session
 | 
		
	
		
			
			|  | 1320 | + */
 | 
		
	
		
			
			|  | 1321 | +static void iscsi_tx_resume ( struct iscsi_session *iscsi ) {
 | 
		
	
		
			
			|  | 1322 | +	process_add ( &iscsi->process );
 | 
		
	
		
			
			|  | 1323 | +}
 | 
		
	
		
			
			|  | 1324 | +
 | 
		
	
		
			
			| 1307 | 1325 |  /**
 | 
		
	
		
			
			| 1308 | 1326 |   * Start up a new TX PDU
 | 
		
	
		
			
			| 1309 | 1327 |   *
 | 
		
	
	
		
			
			|  | @@ -1324,7 +1342,7 @@ static void iscsi_start_tx ( struct iscsi_session *iscsi ) {
 | 
		
	
		
			
			| 1324 | 1342 |  	iscsi->tx_state = ISCSI_TX_BHS;
 | 
		
	
		
			
			| 1325 | 1343 |  
 | 
		
	
		
			
			| 1326 | 1344 |  	/* Start transmission process */
 | 
		
	
		
			
			| 1327 |  | -	process_add ( &iscsi->process );
 | 
		
	
		
			
			|  | 1345 | +	iscsi_tx_resume ( iscsi );
 | 
		
	
		
			
			| 1328 | 1346 |  }
 | 
		
	
		
			
			| 1329 | 1347 |  
 | 
		
	
		
			
			| 1330 | 1348 |  /**
 | 
		
	
	
		
			
			|  | @@ -1405,7 +1423,7 @@ static void iscsi_tx_done ( struct iscsi_session *iscsi ) {
 | 
		
	
		
			
			| 1405 | 1423 |  	struct iscsi_bhs_common *common = &iscsi->tx_bhs.common;
 | 
		
	
		
			
			| 1406 | 1424 |  
 | 
		
	
		
			
			| 1407 | 1425 |  	/* Stop transmission process */
 | 
		
	
		
			
			| 1408 |  | -	process_del ( &iscsi->process );
 | 
		
	
		
			
			|  | 1426 | +	iscsi_tx_pause ( iscsi );
 | 
		
	
		
			
			| 1409 | 1427 |  
 | 
		
	
		
			
			| 1410 | 1428 |  	switch ( common->opcode & ISCSI_OPCODE_MASK ) {
 | 
		
	
		
			
			| 1411 | 1429 |  	case ISCSI_OPCODE_DATA_OUT:
 | 
		
	
	
		
			
			|  | @@ -1468,7 +1486,10 @@ static void iscsi_tx_step ( struct iscsi_session *iscsi ) {
 | 
		
	
		
			
			| 1468 | 1486 |  
 | 
		
	
		
			
			| 1469 | 1487 |  		/* Check for window availability, if needed */
 | 
		
	
		
			
			| 1470 | 1488 |  		if ( tx_len && ( xfer_window ( &iscsi->socket ) == 0 ) ) {
 | 
		
	
		
			
			| 1471 |  | -			/* Cannot transmit at this point; stop processing */
 | 
		
	
		
			
			|  | 1489 | +			/* Cannot transmit at this point; pause
 | 
		
	
		
			
			|  | 1490 | +			 * processing and wait for window to reopen
 | 
		
	
		
			
			|  | 1491 | +			 */
 | 
		
	
		
			
			|  | 1492 | +			iscsi_tx_pause ( iscsi );
 | 
		
	
		
			
			| 1472 | 1493 |  			return;
 | 
		
	
		
			
			| 1473 | 1494 |  		}
 | 
		
	
		
			
			| 1474 | 1495 |  
 | 
		
	
	
		
			
			|  | @@ -1696,6 +1717,8 @@ static int iscsi_vredirect ( struct iscsi_session *iscsi, int type,
 | 
		
	
		
			
			| 1696 | 1717 |  /** iSCSI socket interface operations */
 | 
		
	
		
			
			| 1697 | 1718 |  static struct interface_operation iscsi_socket_operations[] = {
 | 
		
	
		
			
			| 1698 | 1719 |  	INTF_OP ( xfer_deliver, struct iscsi_session *, iscsi_socket_deliver ),
 | 
		
	
		
			
			|  | 1720 | +	INTF_OP ( xfer_window_changed, struct iscsi_session *,
 | 
		
	
		
			
			|  | 1721 | +		  iscsi_tx_resume ),
 | 
		
	
		
			
			| 1699 | 1722 |  	INTF_OP ( xfer_vredirect, struct iscsi_session *, iscsi_vredirect ),
 | 
		
	
		
			
			| 1700 | 1723 |  	INTF_OP ( intf_close, struct iscsi_session *, iscsi_close ),
 | 
		
	
		
			
			| 1701 | 1724 |  };
 |