drivers/net/ethernet/engleder/tsnep_selftests.c

Source file repositories/reference/linux-study-clean/drivers/net/ethernet/engleder/tsnep_selftests.c

File Facts

System
Linux kernel
Corpus path
drivers/net/ethernet/engleder/tsnep_selftests.c
Extension
.c
Size
21754 bytes
Lines
812
Domain
Driver Families
Bucket
drivers/net
Inferred role
Driver Families: implementation source
Status
source implementation candidate

Why This File Exists

Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.

Dependency Surface

Detected Declarations

Annotated Snippet

// SPDX-License-Identifier: GPL-2.0
/* Copyright (C) 2021 Gerhard Engleder <gerhard@engleder-embedded.com> */

#include "tsnep.h"

#include <net/pkt_sched.h>

enum tsnep_test {
	TSNEP_TEST_ENABLE = 0,
	TSNEP_TEST_TAPRIO,
	TSNEP_TEST_TAPRIO_CHANGE,
	TSNEP_TEST_TAPRIO_EXTENSION,
};

static const char tsnep_test_strings[][ETH_GSTRING_LEN] = {
	"Enable timeout        (offline)",
	"TAPRIO                (offline)",
	"TAPRIO change         (offline)",
	"TAPRIO extension      (offline)",
};

#define TSNEP_TEST_COUNT (sizeof(tsnep_test_strings) / ETH_GSTRING_LEN)

static bool enable_gc_timeout(struct tsnep_adapter *adapter)
{
	iowrite8(TSNEP_GC_ENABLE_TIMEOUT, adapter->addr + TSNEP_GC);
	if (!(ioread32(adapter->addr + TSNEP_GC) & TSNEP_GC_TIMEOUT_ACTIVE))
		return false;

	return true;
}

static bool gc_timeout_signaled(struct tsnep_adapter *adapter)
{
	if (ioread32(adapter->addr + TSNEP_GC) & TSNEP_GC_TIMEOUT_SIGNAL)
		return true;

	return false;
}

static bool ack_gc_timeout(struct tsnep_adapter *adapter)
{
	iowrite8(TSNEP_GC_ENABLE_TIMEOUT, adapter->addr + TSNEP_GC);
	if (ioread32(adapter->addr + TSNEP_GC) &
	    (TSNEP_GC_TIMEOUT_ACTIVE | TSNEP_GC_TIMEOUT_SIGNAL))
		return false;
	return true;
}

static bool enable_gc(struct tsnep_adapter *adapter, bool a)
{
	u8 enable;
	u8 active;

	if (a) {
		enable = TSNEP_GC_ENABLE_A;
		active = TSNEP_GC_ACTIVE_A;
	} else {
		enable = TSNEP_GC_ENABLE_B;
		active = TSNEP_GC_ACTIVE_B;
	}

	iowrite8(enable, adapter->addr + TSNEP_GC);
	if (!(ioread32(adapter->addr + TSNEP_GC) & active))
		return false;

	return true;
}

static bool disable_gc(struct tsnep_adapter *adapter)
{
	iowrite8(TSNEP_GC_DISABLE, adapter->addr + TSNEP_GC);
	if (ioread32(adapter->addr + TSNEP_GC) &
	    (TSNEP_GC_ACTIVE_A | TSNEP_GC_ACTIVE_B))
		return false;

	return true;
}

static bool gc_delayed_enable(struct tsnep_adapter *adapter, bool a, int delay)
{
	u64 before, after;
	u32 time;
	bool enabled;

	if (!disable_gc(adapter))
		return false;

	before = ktime_get_ns();

Annotation

Implementation Notes