Report DIF protection type the disk is formatted with.

Some disks formatted with protection report errors if written without
protection used.  This should help to diagnose the problem.

MFC after:	2 weeks
This commit is contained in:
Alexander Motin 2019-04-22 01:08:14 +00:00
parent a6f77c9a6e
commit 5a9170aa4c
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=346511
2 changed files with 27 additions and 4 deletions

View File

@ -2931,6 +2931,7 @@ struct scsi_read_capacity_data_long
uint8_t length[4];
#define SRC16_PROT_EN 0x01
#define SRC16_P_TYPE 0x0e
#define SRC16_P_TYPE_SHIFT 1
#define SRC16_PTYPE_1 0x00
#define SRC16_PTYPE_2 0x02
#define SRC16_PTYPE_3 0x04

View File

@ -344,6 +344,7 @@ struct da_softc {
da_delete_func_t *delete_func;
int unmappedio;
int rotating;
int p_type;
struct disk_params params;
struct disk *disk;
union ccb saved_ccb;
@ -2292,7 +2293,7 @@ dasysctlinit(void *context, int pending)
CTLFLAG_RD,
&softc->unmappedio,
0,
"Unmapped I/O leaf");
"Unmapped I/O support");
SYSCTL_ADD_INT(&softc->sysctl_ctx,
SYSCTL_CHILDREN(softc->sysctl_tree),
@ -2303,6 +2304,15 @@ dasysctlinit(void *context, int pending)
0,
"Rotating media");
SYSCTL_ADD_INT(&softc->sysctl_ctx,
SYSCTL_CHILDREN(softc->sysctl_tree),
OID_AUTO,
"p_type",
CTLFLAG_RD,
&softc->p_type,
0,
"DIF protection type");
#ifdef CAM_TEST_FAILURE
SYSCTL_ADD_PROC(&softc->sysctl_ctx, SYSCTL_CHILDREN(softc->sysctl_tree),
OID_AUTO, "invalidate", CTLTYPE_U64 | CTLFLAG_RW | CTLFLAG_MPSAFE,
@ -4649,7 +4659,7 @@ dadone_proberc(struct cam_periph *periph, union ccb *done_ccb)
da_ccb_state state;
char *announce_buf;
u_int32_t priority;
int lbp;
int lbp, n;
CAM_DEBUG(periph->path, CAM_DEBUG_TRACE, ("dadone_proberc\n"));
@ -4731,11 +4741,17 @@ dadone_proberc(struct cam_periph *periph, union ccb *done_ccb)
rcaplong, sizeof(*rcaplong));
lbp = (lalba & SRC16_LBPME_A);
dp = &softc->params;
snprintf(announce_buf, DA_ANNOUNCETMP_SZ,
"%juMB (%ju %u byte sectors)",
n = snprintf(announce_buf, DA_ANNOUNCETMP_SZ,
"%juMB (%ju %u byte sectors",
((uintmax_t)dp->secsize * dp->sectors) /
(1024 * 1024),
(uintmax_t)dp->sectors, dp->secsize);
if (softc->p_type != 0) {
n += snprintf(announce_buf + n,
DA_ANNOUNCETMP_SZ - n,
", DIF type %d", softc->p_type);
}
snprintf(announce_buf + n, DA_ANNOUNCETMP_SZ - n, ")");
}
} else {
int error;
@ -5983,9 +5999,15 @@ dasetgeom(struct cam_periph *periph, uint32_t block_len, uint64_t maxsector,
lbppbe = rcaplong->prot_lbppbe & SRC16_LBPPBE;
lalba = scsi_2btoul(rcaplong->lalba_lbp);
lalba &= SRC16_LALBA_A;
if (rcaplong->prot & SRC16_PROT_EN)
softc->p_type = ((rcaplong->prot & SRC16_P_TYPE) >>
SRC16_P_TYPE_SHIFT) + 1;
else
softc->p_type = 0;
} else {
lbppbe = 0;
lalba = 0;
softc->p_type = 0;
}
if (lbppbe > 0) {