block/scsi: Provide a limit on the number of integrity segments
Some controllers have a hardware limit on the number of protection information scatter-gather list segments they can handle. Introduce a max_integrity_segments limit in the block layer and provide a new scsi_host_template setting that allows HBA drivers to provide a value suitable for the hardware. Add support for honoring the integrity segment limit when merging both bios and requests. Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com> Signed-off-by: Jens Axboe <axboe@carl.home.kernel.dk>
This commit is contained in:
committed by
Jens Axboe
parent
c8bf133682
commit
13f05c8d8e
@@ -31,6 +31,12 @@ struct scsi_cmnd;
|
||||
#define SCSI_MAX_SG_CHAIN_SEGMENTS SCSI_MAX_SG_SEGMENTS
|
||||
#endif
|
||||
|
||||
/*
|
||||
* DIX-capable adapters effectively support infinite chaining for the
|
||||
* protection information scatterlist
|
||||
*/
|
||||
#define SCSI_MAX_PROT_SG_SEGMENTS 0xFFFF
|
||||
|
||||
/*
|
||||
* Special value for scanning to specify scanning or rescanning of all
|
||||
* possible channels, (target) ids, or luns on a given shost.
|
||||
|
||||
@@ -388,6 +388,7 @@ struct scsi_host_template {
|
||||
* of scatter-gather.
|
||||
*/
|
||||
unsigned short sg_tablesize;
|
||||
unsigned short sg_prot_tablesize;
|
||||
|
||||
/*
|
||||
* Set this if the host adapter has limitations beside segment count.
|
||||
@@ -599,6 +600,7 @@ struct Scsi_Host {
|
||||
int can_queue;
|
||||
short cmd_per_lun;
|
||||
short unsigned int sg_tablesize;
|
||||
short unsigned int sg_prot_tablesize;
|
||||
short unsigned int max_sectors;
|
||||
unsigned long dma_boundary;
|
||||
/*
|
||||
@@ -823,6 +825,11 @@ static inline unsigned int scsi_host_get_prot(struct Scsi_Host *shost)
|
||||
return shost->prot_capabilities;
|
||||
}
|
||||
|
||||
static inline int scsi_host_prot_dma(struct Scsi_Host *shost)
|
||||
{
|
||||
return shost->prot_capabilities >= SHOST_DIX_TYPE0_PROTECTION;
|
||||
}
|
||||
|
||||
static inline unsigned int scsi_host_dif_capable(struct Scsi_Host *shost, unsigned int target_type)
|
||||
{
|
||||
static unsigned char cap[] = { 0,
|
||||
|
||||
Reference in New Issue
Block a user