#!/bin/bash -eu
# SPDX-License-Identifier: GPL-3.0-or-later

. guess-functions

guess_nvmf_transport()
{
	local controller="$1"
	local transport=

	[ -f "$SYSFS_PATH$controller/transport" ] ||
		return 1

	readline transport "$SYSFS_PATH$controller/transport"
	[ -n "$transport" ] ||
		return 1

	case "$transport" in
		tcp)
			guess_module nvme-fabrics
			guess_module nvme-tcp
			;;
		rdma)
			guess_module nvme-fabrics
			guess_module nvme-rdma
			;;
		fc)
			guess_module nvme-fabrics
			guess_module nvme-fc
			;;
		loop)
			guess_module nvme-fabrics
			guess_module nvme-loop
			return 0
			;;
		*)
			return 1
			;;
	esac

	guess_feature nvmf
	return 0
}

guess_nvmf_links()
{
	local basedir syspath

	basedir="$1"

	for syspath in \
		"$SYSFS_PATH$basedir"/nvme[0-9] \
		"$SYSFS_PATH$basedir"/nvme[0-9][0-9] \
		"$SYSFS_PATH$basedir"/nvme[0-9][0-9][0-9] \
		;
	do
		[ -L "$syspath" ] ||
			continue

		guess_nvmf_transport "${syspath#$SYSFS_PATH}" ||
			guess_device "${syspath#$SYSFS_PATH}"
	done
}

guess_nvmf_transport "$1" && exit 0

if [ -e "$SYSFS_PATH$1"/subsystype ]; then
	subsystype=
	readline subsystype "$SYSFS_PATH$1"/subsystype

	[ "$subsystype" != "nvm" ] ||
		guess_nvmf_links "$1"
	exit 0
fi

basedir="$1"

if [ -f "$SYSFS_PATH$basedir/partition" ]; then
	basedir="${basedir%/*}"
fi

guess_nvmf_transport "$basedir/device" ||
	guess_nvmf_links "$basedir/device"
