if (( p_connection->descriptor_format & DBDF_INDIRECT_DATA_BUFFER_DESCRIPTORS ) == DBDF_INDIRECT_DATA_BUFFER_DESCRIPTORS )\r
{\r
p_connection->max_scatter_gather_entries =\r
- ( MAX( SRP_MAX_IU_SIZE, p_connection->init_to_targ_iu_sz ) - offsetof( srp_cmd_t, additional_cdb )- sizeof(srp_memory_table_descriptor_t)) / sizeof( srp_memory_descriptor_t );\r
+ ( MIN( SRP_MAX_IU_SIZE, p_connection->init_to_targ_iu_sz ) - offsetof( srp_cmd_t, additional_cdb )- sizeof(srp_memory_table_descriptor_t)) / sizeof( srp_memory_descriptor_t );\r
}\r
else if (( p_connection->descriptor_format & DBDF_DIRECT_DATA_BUFFER_DESCRIPTOR ) == DBDF_DIRECT_DATA_BUFFER_DESCRIPTOR )\r
{\r
p_scatter_gather_list = StorPortGetScatterGatherList( p_dev_ext, p_srb );\r
CL_ASSERT( p_scatter_gather_list != NULL );\r
scatter_gather_count = (uint8_t)p_scatter_gather_list->NumberOfElements;\r
- CL_ASSERT( scatter_gather_count <= p_srp_conn_info->max_scatter_gather_entries );\r
+ }\r
+\r
+ /* Cap the length of the inline descriptors to the maximum IU size. */\r
+ if( p_srp_conn_info->max_scatter_gather_entries < scatter_gather_count )\r
+ {\r
+ scatter_gather_count =\r
+ (uint8_t)p_srp_conn_info->max_scatter_gather_entries;\r
}\r
\r
if ( scsi_direction == SRB_FLAGS_DATA_IN )\r
/* we don't swap rkey - it is already in network order*/\r
p_table_descriptor->descriptor.virtual_address = cl_hton64( buf_addr );\r
p_table_descriptor->descriptor.memory_handle = p_srp_conn_info->rkey;\r
- p_table_descriptor->descriptor.data_length = cl_hton32( sizeof(srp_memory_descriptor_t) * scatter_gather_count );\r
+\r
+ p_table_descriptor->descriptor.data_length =\r
+ cl_hton32( sizeof(srp_memory_descriptor_t) *\r
+ p_scatter_gather_list->NumberOfElements );\r
\r
for ( i = 0, totalLength = 0, p_sg_element = p_scatter_gather_list->List;\r
- i < scatter_gather_count; i++, p_memory_descriptor++, p_sg_element++ )\r
+ i < p_scatter_gather_list->NumberOfElements;\r
+ i++, p_memory_descriptor++, p_sg_element++ )\r
{\r
buf_addr = p_srp_conn_info->vaddr + p_sg_element->PhysicalAddress.QuadPart;\r
\r
}\r
else if ( format == DBDF_DIRECT_DATA_BUFFER_DESCRIPTOR )\r
{\r
+ CL_ASSERT( scatter_gather_count ==\r
+ p_scatter_gather_list->NumberOfElements );\r
for ( i = 0, p_sg_element = p_scatter_gather_list->List;\r
i < scatter_gather_count; i++, p_memory_descriptor++, p_sg_element++ )\r
{\r
{\r
any_ioc_connected = TRUE;\r
\r
- if ( p_hba->max_sg > p_session->connection.max_scatter_gather_entries )\r
+ if ( (p_hba->max_sg >\r
+ p_session->connection.max_scatter_gather_entries)\r
+ && !(p_session->connection.descriptor_format &\r
+ DBDF_INDIRECT_DATA_BUFFER_DESCRIPTORS) )\r
{\r
p_hba->max_sg = p_session->connection.max_scatter_gather_entries;\r
}\r