brintos

brintos / linux-shallow public Read only

0
0
Text · 6.6 KiB · 9b5363f Raw
258 lines · c
1// SPDX-License-Identifier: GPL-2.0-or-later2/*3 * libata-trace.c - trace functions for libata4 *5 * Copyright 2015 Hannes Reinecke6 * Copyright 2015 SUSE Linux GmbH7 */8 9#include <linux/kernel.h>10#include <linux/trace_seq.h>11#include <trace/events/libata.h>12 13const char *14libata_trace_parse_status(struct trace_seq *p, unsigned char status)15{16	const char *ret = trace_seq_buffer_ptr(p);17 18	trace_seq_printf(p, "{ ");19	if (status & ATA_BUSY)20		trace_seq_printf(p, "BUSY ");21	if (status & ATA_DRDY)22		trace_seq_printf(p, "DRDY ");23	if (status & ATA_DF)24		trace_seq_printf(p, "DF ");25	if (status & ATA_DSC)26		trace_seq_printf(p, "DSC ");27	if (status & ATA_DRQ)28		trace_seq_printf(p, "DRQ ");29	if (status & ATA_CORR)30		trace_seq_printf(p, "CORR ");31	if (status & ATA_SENSE)32		trace_seq_printf(p, "SENSE ");33	if (status & ATA_ERR)34		trace_seq_printf(p, "ERR ");35	trace_seq_putc(p, '}');36	trace_seq_putc(p, 0);37 38	return ret;39}40 41const char *42libata_trace_parse_host_stat(struct trace_seq *p, unsigned char host_stat)43{44	const char *ret = trace_seq_buffer_ptr(p);45 46	trace_seq_printf(p, "{ ");47	if (host_stat & ATA_DMA_INTR)48		trace_seq_printf(p, "INTR ");49	if (host_stat & ATA_DMA_ERR)50		trace_seq_printf(p, "ERR ");51	if (host_stat & ATA_DMA_ACTIVE)52		trace_seq_printf(p, "ACTIVE ");53	trace_seq_putc(p, '}');54	trace_seq_putc(p, 0);55 56	return ret;57}58 59const char *60libata_trace_parse_eh_action(struct trace_seq *p, unsigned int eh_action)61{62	const char *ret = trace_seq_buffer_ptr(p);63 64	trace_seq_printf(p, "%x", eh_action);65	if (eh_action) {66		trace_seq_printf(p, "{ ");67		if (eh_action & ATA_EH_REVALIDATE)68			trace_seq_printf(p, "REVALIDATE ");69		if (eh_action & (ATA_EH_SOFTRESET | ATA_EH_HARDRESET))70			trace_seq_printf(p, "RESET ");71		else if (eh_action & ATA_EH_SOFTRESET)72			trace_seq_printf(p, "SOFTRESET ");73		else if (eh_action & ATA_EH_HARDRESET)74			trace_seq_printf(p, "HARDRESET ");75		if (eh_action & ATA_EH_ENABLE_LINK)76			trace_seq_printf(p, "ENABLE_LINK ");77		if (eh_action & ATA_EH_PARK)78			trace_seq_printf(p, "PARK ");79		trace_seq_putc(p, '}');80	}81	trace_seq_putc(p, 0);82 83	return ret;84}85 86const char *87libata_trace_parse_eh_err_mask(struct trace_seq *p, unsigned int eh_err_mask)88{89	const char *ret = trace_seq_buffer_ptr(p);90 91	trace_seq_printf(p, "%x", eh_err_mask);92	if (eh_err_mask) {93		trace_seq_printf(p, "{ ");94		if (eh_err_mask & AC_ERR_DEV)95			trace_seq_printf(p, "DEV ");96		if (eh_err_mask & AC_ERR_HSM)97			trace_seq_printf(p, "HSM ");98		if (eh_err_mask & AC_ERR_TIMEOUT)99			trace_seq_printf(p, "TIMEOUT ");100		if (eh_err_mask & AC_ERR_MEDIA)101			trace_seq_printf(p, "MEDIA ");102		if (eh_err_mask & AC_ERR_ATA_BUS)103			trace_seq_printf(p, "ATA_BUS ");104		if (eh_err_mask & AC_ERR_HOST_BUS)105			trace_seq_printf(p, "HOST_BUS ");106		if (eh_err_mask & AC_ERR_SYSTEM)107			trace_seq_printf(p, "SYSTEM ");108		if (eh_err_mask & AC_ERR_INVALID)109			trace_seq_printf(p, "INVALID ");110		if (eh_err_mask & AC_ERR_OTHER)111			trace_seq_printf(p, "OTHER ");112		if (eh_err_mask & AC_ERR_NODEV_HINT)113			trace_seq_printf(p, "NODEV_HINT ");114		if (eh_err_mask & AC_ERR_NCQ)115			trace_seq_printf(p, "NCQ ");116		trace_seq_putc(p, '}');117	}118	trace_seq_putc(p, 0);119 120	return ret;121}122 123const char *124libata_trace_parse_qc_flags(struct trace_seq *p, unsigned int qc_flags)125{126	const char *ret = trace_seq_buffer_ptr(p);127 128	trace_seq_printf(p, "%x", qc_flags);129	if (qc_flags) {130		trace_seq_printf(p, "{ ");131		if (qc_flags & ATA_QCFLAG_ACTIVE)132			trace_seq_printf(p, "ACTIVE ");133		if (qc_flags & ATA_QCFLAG_DMAMAP)134			trace_seq_printf(p, "DMAMAP ");135		if (qc_flags & ATA_QCFLAG_IO)136			trace_seq_printf(p, "IO ");137		if (qc_flags & ATA_QCFLAG_RESULT_TF)138			trace_seq_printf(p, "RESULT_TF ");139		if (qc_flags & ATA_QCFLAG_CLEAR_EXCL)140			trace_seq_printf(p, "CLEAR_EXCL ");141		if (qc_flags & ATA_QCFLAG_QUIET)142			trace_seq_printf(p, "QUIET ");143		if (qc_flags & ATA_QCFLAG_RETRY)144			trace_seq_printf(p, "RETRY ");145		if (qc_flags & ATA_QCFLAG_EH)146			trace_seq_printf(p, "FAILED ");147		if (qc_flags & ATA_QCFLAG_SENSE_VALID)148			trace_seq_printf(p, "SENSE_VALID ");149		if (qc_flags & ATA_QCFLAG_EH_SCHEDULED)150			trace_seq_printf(p, "EH_SCHEDULED ");151		trace_seq_putc(p, '}');152	}153	trace_seq_putc(p, 0);154 155	return ret;156}157 158const char *159libata_trace_parse_tf_flags(struct trace_seq *p, unsigned int tf_flags)160{161	const char *ret = trace_seq_buffer_ptr(p);162 163	trace_seq_printf(p, "%x", tf_flags);164	if (tf_flags) {165		trace_seq_printf(p, "{ ");166		if (tf_flags & ATA_TFLAG_LBA48)167			trace_seq_printf(p, "LBA48 ");168		if (tf_flags & ATA_TFLAG_ISADDR)169			trace_seq_printf(p, "ISADDR ");170		if (tf_flags & ATA_TFLAG_DEVICE)171			trace_seq_printf(p, "DEV ");172		if (tf_flags & ATA_TFLAG_WRITE)173			trace_seq_printf(p, "WRITE ");174		if (tf_flags & ATA_TFLAG_LBA)175			trace_seq_printf(p, "LBA ");176		if (tf_flags & ATA_TFLAG_FUA)177			trace_seq_printf(p, "FUA ");178		if (tf_flags & ATA_TFLAG_POLLING)179			trace_seq_printf(p, "POLL ");180		trace_seq_putc(p, '}');181	}182	trace_seq_putc(p, 0);183 184	return ret;185}186 187const char *188libata_trace_parse_subcmd(struct trace_seq *p, unsigned char cmd,189			  unsigned char feature, unsigned char hob_nsect)190{191	const char *ret = trace_seq_buffer_ptr(p);192 193	switch (cmd) {194	case ATA_CMD_FPDMA_RECV:195		switch (hob_nsect & 0x5f) {196		case ATA_SUBCMD_FPDMA_RECV_RD_LOG_DMA_EXT:197			trace_seq_printf(p, " READ_LOG_DMA_EXT");198			break;199		case ATA_SUBCMD_FPDMA_RECV_ZAC_MGMT_IN:200			trace_seq_printf(p, " ZAC_MGMT_IN");201			break;202		}203		break;204	case ATA_CMD_FPDMA_SEND:205		switch (hob_nsect & 0x5f) {206		case ATA_SUBCMD_FPDMA_SEND_WR_LOG_DMA_EXT:207			trace_seq_printf(p, " WRITE_LOG_DMA_EXT");208			break;209		case ATA_SUBCMD_FPDMA_SEND_DSM:210			trace_seq_printf(p, " DATASET_MANAGEMENT");211			break;212		}213		break;214	case ATA_CMD_NCQ_NON_DATA:215		switch (feature) {216		case ATA_SUBCMD_NCQ_NON_DATA_ABORT_QUEUE:217			trace_seq_printf(p, " ABORT_QUEUE");218			break;219		case ATA_SUBCMD_NCQ_NON_DATA_SET_FEATURES:220			trace_seq_printf(p, " SET_FEATURES");221			break;222		case ATA_SUBCMD_NCQ_NON_DATA_ZERO_EXT:223			trace_seq_printf(p, " ZERO_EXT");224			break;225		case ATA_SUBCMD_NCQ_NON_DATA_ZAC_MGMT_OUT:226			trace_seq_printf(p, " ZAC_MGMT_OUT");227			break;228		}229		break;230	case ATA_CMD_ZAC_MGMT_IN:231		switch (feature) {232		case ATA_SUBCMD_ZAC_MGMT_IN_REPORT_ZONES:233			trace_seq_printf(p, " REPORT_ZONES");234			break;235		}236		break;237	case ATA_CMD_ZAC_MGMT_OUT:238		switch (feature) {239		case ATA_SUBCMD_ZAC_MGMT_OUT_CLOSE_ZONE:240			trace_seq_printf(p, " CLOSE_ZONE");241			break;242		case ATA_SUBCMD_ZAC_MGMT_OUT_FINISH_ZONE:243			trace_seq_printf(p, " FINISH_ZONE");244			break;245		case ATA_SUBCMD_ZAC_MGMT_OUT_OPEN_ZONE:246			trace_seq_printf(p, " OPEN_ZONE");247			break;248		case ATA_SUBCMD_ZAC_MGMT_OUT_RESET_WRITE_POINTER:249			trace_seq_printf(p, " RESET_WRITE_POINTER");250			break;251		}252		break;253	}254	trace_seq_putc(p, 0);255 256	return ret;257}258