aboutsummaryrefslogtreecommitdiff
path: root/sys/cam/ata
diff options
context:
space:
mode:
authorWarner Losh <imp@FreeBSD.org>2020-04-27 23:43:04 +0000
committerWarner Losh <imp@FreeBSD.org>2020-04-27 23:43:04 +0000
commitaeab0812e68cdfa48726a4dc36fa223ab20cb823 (patch)
tree0cb6663862cc28cce0c9b62ce6d72244d1fb9499 /sys/cam/ata
parent72f8ed61a70e153e94ebb5f373b6846d36daf54c (diff)
Notes
Diffstat (limited to 'sys/cam/ata')
-rw-r--r--sys/cam/ata/ata_da.c50
1 files changed, 49 insertions, 1 deletions
diff --git a/sys/cam/ata/ata_da.c b/sys/cam/ata/ata_da.c
index b7425730394ac..bea419b6165c4 100644
--- a/sys/cam/ata/ata_da.c
+++ b/sys/cam/ata/ata_da.c
@@ -111,6 +111,31 @@ typedef enum {
ADA_FLAG_CAN_NCQ_TRIM = 0x00400000, /* CAN_TRIM also set */
ADA_FLAG_PIM_ATA_EXT = 0x00800000
} ada_flags;
+#define ADA_FLAG_STRING \
+ "\020" \
+ "\002CAN_48BIT" \
+ "\003CAN_FLUSHCACHE" \
+ "\004CAN_NCQ" \
+ "\005CAN_DMA" \
+ "\006NEED_OTAG" \
+ "\007WAS_OTAG" \
+ "\010CAN_TRIM" \
+ "\011OPEN" \
+ "\012SCTX_INIT" \
+ "\013CAN_CFA" \
+ "\014CAN_POWERMGT" \
+ "\015CAN_DMA48" \
+ "\016CAN_LOG" \
+ "\017CAN_IDLOG" \
+ "\020CAN_SUPCAP" \
+ "\021CAN_ZONE" \
+ "\022CAN_WCACHE" \
+ "\023CAN_RAHEAD" \
+ "\024PROBED" \
+ "\025ANNOUNCED" \
+ "\026DIRTY" \
+ "\027CAN_NCQ_TRIM" \
+ "\030PIM_ATA_EXT"
typedef enum {
ADA_Q_NONE = 0x00,
@@ -806,7 +831,8 @@ static periph_oninv_t adaoninvalidate;
static periph_dtor_t adacleanup;
static void adaasync(void *callback_arg, u_int32_t code,
struct cam_path *path, void *arg);
-static int adazonemodesysctl(SYSCTL_HANDLER_ARGS);
+static int adaflagssysctl(SYSCTL_HANDLER_ARGS);
+static int adazonesupsysctl(SYSCTL_HANDLER_ARGS);
static int adazonesupsysctl(SYSCTL_HANDLER_ARGS);
static void adasysctlinit(void *context, int pending);
static int adagetattr(struct bio *bp);
@@ -1518,6 +1544,10 @@ adasysctlinit(void *context, int pending)
SYSCTL_CHILDREN(softc->sysctl_tree), OID_AUTO,
"max_seq_zones", CTLFLAG_RD, &softc->max_seq_zones,
"Maximum Number of Open Sequential Write Required Zones");
+ SYSCTL_ADD_PROC(&softc->sysctl_ctx, SYSCTL_CHILDREN(softc->sysctl_tree),
+ OID_AUTO, "flags", CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE,
+ softc, 0, adaflagssysctl, "A",
+ "Flags for drive");
#ifdef CAM_TEST_FAILURE
/*
@@ -1626,6 +1656,24 @@ adadeletemethodsysctl(SYSCTL_HANDLER_ARGS)
return (EINVAL);
}
+static int
+adaflagssysctl(SYSCTL_HANDLER_ARGS)
+{
+ struct sbuf sbuf;
+ struct ada_softc *softc = arg1;
+ int error;
+
+ sbuf_new_for_sysctl(&sbuf, NULL, 0, req);
+ if (softc->flags != 0)
+ sbuf_printf(&sbuf, "0x%b", (unsigned)softc->flags, ADA_FLAG_STRING);
+ else
+ sbuf_printf(&sbuf, "0");
+ error = sbuf_finish(&sbuf);
+ sbuf_delete(&sbuf);
+
+ return (error);
+}
+
static void
adasetflags(struct ada_softc *softc, struct ccb_getdev *cgd)
{