Path: blob/master/drivers/firewire/packet-serdes-test.c
26378 views
// SPDX-License-Identifier: GPL-2.0-or-later1//2// packet-serdes-test.c - An application of Kunit to check serialization/deserialization of packets3// defined by IEEE 1394.4//5// Copyright (c) 2024 Takashi Sakamoto67#include <kunit/test.h>89#include <linux/firewire-constants.h>1011#include "packet-header-definitions.h"12#include "phy-packet-definitions.h"1314static void serialize_async_header_common(u32 header[ASYNC_HEADER_QUADLET_COUNT],15unsigned int dst_id, unsigned int tlabel,16unsigned int retry, unsigned int tcode,17unsigned int priority, unsigned int src_id)18{19async_header_set_destination(header, dst_id);20async_header_set_tlabel(header, tlabel);21async_header_set_retry(header, retry);22async_header_set_tcode(header, tcode);23async_header_set_priority(header, priority);24async_header_set_source(header, src_id);25}2627static void serialize_async_header_request(u32 header[ASYNC_HEADER_QUADLET_COUNT],28unsigned int dst_id, unsigned int tlabel,29unsigned int retry, unsigned int tcode,30unsigned int priority, unsigned int src_id, u64 offset)31{32serialize_async_header_common(header, dst_id, tlabel, retry, tcode, priority, src_id);33async_header_set_offset(header, offset);34}3536static void serialize_async_header_quadlet_request(u32 header[ASYNC_HEADER_QUADLET_COUNT],37unsigned int dst_id, unsigned int tlabel,38unsigned int retry, unsigned int tcode,39unsigned int priority, unsigned int src_id,40u64 offset)41{42serialize_async_header_request(header, dst_id, tlabel, retry, tcode, priority, src_id,43offset);44}4546static void serialize_async_header_block_request(u32 header[ASYNC_HEADER_QUADLET_COUNT],47unsigned int dst_id, unsigned int tlabel,48unsigned int retry, unsigned int tcode,49unsigned int priority, unsigned int src_id,50u64 offset, unsigned int data_length,51unsigned int extended_tcode)52{53serialize_async_header_request(header, dst_id, tlabel, retry, tcode, priority, src_id,54offset);55async_header_set_data_length(header, data_length);56async_header_set_extended_tcode(header, extended_tcode);57}5859static void serialize_async_header_response(u32 header[ASYNC_HEADER_QUADLET_COUNT],60unsigned int dst_id, unsigned int tlabel,61unsigned int retry, unsigned int tcode,62unsigned int priority, unsigned int src_id,63unsigned int rcode)64{65serialize_async_header_common(header, dst_id, tlabel, retry, tcode, priority, src_id);66async_header_set_rcode(header, rcode);67}6869static void serialize_async_header_quadlet_response(u32 header[ASYNC_HEADER_QUADLET_COUNT],70unsigned int dst_id, unsigned int tlabel,71unsigned int retry, unsigned int tcode,72unsigned int priority, unsigned int src_id,73unsigned int rcode)74{75serialize_async_header_response(header, dst_id, tlabel, retry, tcode, priority, src_id,76rcode);77}7879static void serialize_async_header_block_response(u32 header[ASYNC_HEADER_QUADLET_COUNT],80unsigned int dst_id, unsigned int tlabel,81unsigned int retry, unsigned int tcode,82unsigned int priority, unsigned int src_id,83unsigned int rcode, unsigned int data_length,84unsigned int extended_tcode)85{86serialize_async_header_response(header, dst_id, tlabel, retry, tcode, priority, src_id,87rcode);88async_header_set_data_length(header, data_length);89async_header_set_extended_tcode(header, extended_tcode);90}9192static void deserialize_async_header_common(const u32 header[ASYNC_HEADER_QUADLET_COUNT],93unsigned int *dst_id, unsigned int *tlabel,94unsigned int *retry, unsigned int *tcode,95unsigned int *priority, unsigned int *src_id)96{97*dst_id = async_header_get_destination(header);98*tlabel = async_header_get_tlabel(header);99*retry = async_header_get_retry(header);100*tcode = async_header_get_tcode(header);101*priority = async_header_get_priority(header);102*src_id = async_header_get_source(header);103}104105static void deserialize_async_header_request(const u32 header[ASYNC_HEADER_QUADLET_COUNT],106unsigned int *dst_id, unsigned int *tlabel,107unsigned int *retry, unsigned int *tcode,108unsigned int *priority, unsigned int *src_id,109u64 *offset)110{111deserialize_async_header_common(header, dst_id, tlabel, retry, tcode, priority, src_id);112*offset = async_header_get_offset(header);113}114115static void deserialize_async_header_quadlet_request(const u32 header[ASYNC_HEADER_QUADLET_COUNT],116unsigned int *dst_id, unsigned int *tlabel,117unsigned int *retry, unsigned int *tcode,118unsigned int *priority, unsigned int *src_id,119u64 *offset)120{121deserialize_async_header_request(header, dst_id, tlabel, retry, tcode, priority, src_id,122offset);123}124125static void deserialize_async_header_block_request(const u32 header[ASYNC_HEADER_QUADLET_COUNT],126unsigned int *dst_id, unsigned int *tlabel,127unsigned int *retry, unsigned int *tcode,128unsigned int *priority, unsigned int *src_id,129u64 *offset,130unsigned int *data_length,131unsigned int *extended_tcode)132{133deserialize_async_header_request(header, dst_id, tlabel, retry, tcode, priority, src_id,134offset);135*data_length = async_header_get_data_length(header);136*extended_tcode = async_header_get_extended_tcode(header);137}138139static void deserialize_async_header_response(const u32 header[ASYNC_HEADER_QUADLET_COUNT],140unsigned int *dst_id, unsigned int *tlabel,141unsigned int *retry, unsigned int *tcode,142unsigned int *priority, unsigned int *src_id,143unsigned int *rcode)144{145deserialize_async_header_common(header, dst_id, tlabel, retry, tcode, priority, src_id);146*rcode = async_header_get_rcode(header);147}148149static void deserialize_async_header_quadlet_response(const u32 header[ASYNC_HEADER_QUADLET_COUNT],150unsigned int *dst_id, unsigned int *tlabel,151unsigned int *retry, unsigned int *tcode,152unsigned int *priority, unsigned int *src_id,153unsigned int *rcode)154{155deserialize_async_header_response(header, dst_id, tlabel, retry, tcode, priority, src_id, rcode);156}157158static void deserialize_async_header_block_response(const u32 header[ASYNC_HEADER_QUADLET_COUNT],159unsigned int *dst_id, unsigned int *tlabel,160unsigned int *retry, unsigned int *tcode,161unsigned int *priority, unsigned int *src_id,162unsigned int *rcode, unsigned int *data_length,163unsigned int *extended_tcode)164{165deserialize_async_header_response(header, dst_id, tlabel, retry, tcode, priority, src_id, rcode);166*data_length = async_header_get_data_length(header);167*extended_tcode = async_header_get_extended_tcode(header);168}169170static void serialize_isoc_header(u32 *header, unsigned int data_length, unsigned int tag,171unsigned int channel, unsigned int tcode, unsigned int sy)172{173isoc_header_set_data_length(header, data_length);174isoc_header_set_tag(header, tag);175isoc_header_set_channel(header, channel);176isoc_header_set_tcode(header, tcode);177isoc_header_set_sy(header, sy);178}179180static void deserialize_isoc_header(u32 header, unsigned int *data_length, unsigned int *tag,181unsigned int *channel, unsigned int *tcode, unsigned int *sy)182{183*data_length = isoc_header_get_data_length(header);184*tag = isoc_header_get_tag(header);185*channel = isoc_header_get_channel(header);186*tcode = isoc_header_get_tcode(header);187*sy = isoc_header_get_sy(header);188}189190static void serialize_phy_packet_self_id_zero(u32 *quadlet, unsigned int packet_identifier,191unsigned int phy_id, bool extended,192bool link_is_active, unsigned int gap_count,193unsigned int scode, bool is_contender,194unsigned int power_class, bool is_initiated_reset,195bool has_more_packets)196{197phy_packet_set_packet_identifier(quadlet, packet_identifier);198phy_packet_self_id_set_phy_id(quadlet, phy_id);199phy_packet_self_id_set_extended(quadlet, extended);200phy_packet_self_id_zero_set_link_active(quadlet, link_is_active);201phy_packet_self_id_zero_set_gap_count(quadlet, gap_count);202phy_packet_self_id_zero_set_scode(quadlet, scode);203phy_packet_self_id_zero_set_contender(quadlet, is_contender);204phy_packet_self_id_zero_set_power_class(quadlet, power_class);205phy_packet_self_id_zero_set_initiated_reset(quadlet, is_initiated_reset);206phy_packet_self_id_set_more_packets(quadlet, has_more_packets);207}208209static void deserialize_phy_packet_self_id_zero(u32 quadlet, unsigned int *packet_identifier,210unsigned int *phy_id, bool *extended,211bool *link_is_active, unsigned int *gap_count,212unsigned int *scode, bool *is_contender,213unsigned int *power_class,214bool *is_initiated_reset, bool *has_more_packets)215{216*packet_identifier = phy_packet_get_packet_identifier(quadlet);217*phy_id = phy_packet_self_id_get_phy_id(quadlet);218*extended = phy_packet_self_id_get_extended(quadlet);219*link_is_active = phy_packet_self_id_zero_get_link_active(quadlet);220*gap_count = phy_packet_self_id_zero_get_gap_count(quadlet);221*scode = phy_packet_self_id_zero_get_scode(quadlet);222*is_contender = phy_packet_self_id_zero_get_contender(quadlet);223*power_class = phy_packet_self_id_zero_get_power_class(quadlet);224*is_initiated_reset = phy_packet_self_id_zero_get_initiated_reset(quadlet);225*has_more_packets = phy_packet_self_id_get_more_packets(quadlet);226}227228static void serialize_phy_packet_self_id_extended(u32 *quadlet, unsigned int packet_identifier,229unsigned int phy_id, bool extended,230unsigned int sequence, bool has_more_packets)231{232phy_packet_set_packet_identifier(quadlet, packet_identifier);233phy_packet_self_id_set_phy_id(quadlet, phy_id);234phy_packet_self_id_set_extended(quadlet, extended);235phy_packet_self_id_extended_set_sequence(quadlet, sequence);236phy_packet_self_id_set_more_packets(quadlet, has_more_packets);237}238239static void deserialize_phy_packet_self_id_extended(u32 quadlet, unsigned int *packet_identifier,240unsigned int *phy_id, bool *extended,241unsigned int *sequence, bool *has_more_packets)242{243*packet_identifier = phy_packet_get_packet_identifier(quadlet);244*phy_id = phy_packet_self_id_get_phy_id(quadlet);245*extended = phy_packet_self_id_get_extended(quadlet);246*sequence = phy_packet_self_id_extended_get_sequence(quadlet);247*has_more_packets = phy_packet_self_id_get_more_packets(quadlet);248}249250static void serialize_phy_packet_phy_config(u32 *quadlet, unsigned int packet_identifier,251unsigned int root_id, bool has_force_root_node,252bool has_gap_count_optimization, unsigned int gap_count)253{254phy_packet_set_packet_identifier(quadlet, packet_identifier);255phy_packet_phy_config_set_root_id(quadlet, root_id);256phy_packet_phy_config_set_force_root_node(quadlet, has_force_root_node);257phy_packet_phy_config_set_gap_count_optimization(quadlet, has_gap_count_optimization);258phy_packet_phy_config_set_gap_count(quadlet, gap_count);259}260261static void deserialize_phy_packet_phy_config(u32 quadlet, unsigned int *packet_identifier,262unsigned int *root_id, bool *has_force_root_node,263bool *has_gap_count_optimization,264unsigned int *gap_count)265{266*packet_identifier = phy_packet_get_packet_identifier(quadlet);267*root_id = phy_packet_phy_config_get_root_id(quadlet);268*has_force_root_node = phy_packet_phy_config_get_force_root_node(quadlet);269*has_gap_count_optimization = phy_packet_phy_config_get_gap_count_optimization(quadlet);270*gap_count = phy_packet_phy_config_get_gap_count(quadlet);271}272273static void test_async_header_write_quadlet_request(struct kunit *test)274{275static const u32 expected[ASYNC_HEADER_QUADLET_COUNT] = {2760xffc05100,2770xffc1ffff,2780xf0000234,2790x1f0000c0,280};281u32 header[ASYNC_HEADER_QUADLET_COUNT] = {0, 0, 0, 0};282283unsigned int dst_id;284unsigned int tlabel;285unsigned int retry;286unsigned int tcode;287unsigned int priority;288unsigned int src_id;289u64 offset;290u32 quadlet_data;291292deserialize_async_header_quadlet_request(expected, &dst_id, &tlabel, &retry, &tcode,293&priority, &src_id, &offset);294quadlet_data = async_header_get_quadlet_data(expected);295296KUNIT_EXPECT_EQ(test, 0xffc0, dst_id);297KUNIT_EXPECT_EQ(test, 0x14, tlabel);298KUNIT_EXPECT_EQ(test, 0x01, retry);299KUNIT_EXPECT_EQ(test, TCODE_WRITE_QUADLET_REQUEST, tcode);300KUNIT_EXPECT_EQ(test, 0x00, priority);301KUNIT_EXPECT_EQ(test, 0xffc1, src_id);302KUNIT_EXPECT_EQ(test, 0xfffff0000234, offset);303KUNIT_EXPECT_EQ(test, 0x1f0000c0, quadlet_data);304305serialize_async_header_quadlet_request(header, dst_id, tlabel, retry, tcode, priority,306src_id, offset);307async_header_set_quadlet_data(header, quadlet_data);308309KUNIT_EXPECT_MEMEQ(test, header, expected, sizeof(expected));310}311312static void test_async_header_write_block_request(struct kunit *test)313{314static const u32 expected[ASYNC_HEADER_QUADLET_COUNT] = {3150xffc06510,3160xffc1ecc0,3170x00000000,3180x00180000,319};320u32 header[ASYNC_HEADER_QUADLET_COUNT] = {0, 0, 0, 0};321322unsigned int dst_id;323unsigned int tlabel;324unsigned int retry;325unsigned int tcode;326unsigned int priority;327unsigned int src_id;328u64 offset;329unsigned int data_length;330unsigned int extended_tcode;331332deserialize_async_header_block_request(expected, &dst_id, &tlabel, &retry, &tcode,333&priority, &src_id, &offset, &data_length,334&extended_tcode);335336KUNIT_EXPECT_EQ(test, 0xffc0, dst_id);337KUNIT_EXPECT_EQ(test, 0x19, tlabel);338KUNIT_EXPECT_EQ(test, 0x01, retry);339KUNIT_EXPECT_EQ(test, TCODE_WRITE_BLOCK_REQUEST, tcode);340KUNIT_EXPECT_EQ(test, 0x00, priority);341KUNIT_EXPECT_EQ(test, 0xffc1, src_id);342KUNIT_EXPECT_EQ(test, 0xecc000000000, offset);343KUNIT_EXPECT_EQ(test, 0x0018, data_length);344KUNIT_EXPECT_EQ(test, 0x0000, extended_tcode);345346serialize_async_header_block_request(header, dst_id, tlabel, retry, tcode, priority, src_id,347offset, data_length, extended_tcode);348349KUNIT_EXPECT_MEMEQ(test, header, expected, sizeof(expected));350}351352static void test_async_header_write_response(struct kunit *test)353{354static const u32 expected[ASYNC_HEADER_QUADLET_COUNT] = {3550xffc15120,3560xffc00000,3570x00000000,3580x00000000,359};360u32 header[ASYNC_HEADER_QUADLET_COUNT] = {0, 0, 0, 0};361362unsigned int dst_id;363unsigned int tlabel;364unsigned int retry;365unsigned int tcode;366unsigned int priority;367unsigned int src_id;368unsigned int rcode;369370deserialize_async_header_quadlet_response(expected, &dst_id, &tlabel, &retry, &tcode,371&priority, &src_id, &rcode);372373KUNIT_EXPECT_EQ(test, 0xffc1, dst_id);374KUNIT_EXPECT_EQ(test, 0x14, tlabel);375KUNIT_EXPECT_EQ(test, 0x01, retry);376KUNIT_EXPECT_EQ(test, TCODE_WRITE_RESPONSE, tcode);377KUNIT_EXPECT_EQ(test, 0x00, priority);378KUNIT_EXPECT_EQ(test, 0xffc0, src_id);379KUNIT_EXPECT_EQ(test, RCODE_COMPLETE, rcode);380381serialize_async_header_quadlet_response(header, dst_id, tlabel, retry, tcode, priority,382src_id, rcode);383384KUNIT_EXPECT_MEMEQ(test, header, expected, sizeof(expected) - sizeof(expected[0]));385}386387static void test_async_header_read_quadlet_request(struct kunit *test)388{389static const u32 expected[ASYNC_HEADER_QUADLET_COUNT] = {3900xffc0f140,3910xffc1ffff,3920xf0000984,3930x00000000,394};395u32 header[ASYNC_HEADER_QUADLET_COUNT] = {0, 0, 0, 0};396397unsigned int dst_id;398unsigned int tlabel;399unsigned int retry;400unsigned int tcode;401unsigned int priority;402unsigned int src_id;403u64 offset;404405deserialize_async_header_quadlet_request(expected, &dst_id, &tlabel, &retry, &tcode,406&priority, &src_id, &offset);407408KUNIT_EXPECT_EQ(test, 0xffc0, dst_id);409KUNIT_EXPECT_EQ(test, 0x3c, tlabel);410KUNIT_EXPECT_EQ(test, 0x01, retry);411KUNIT_EXPECT_EQ(test, TCODE_READ_QUADLET_REQUEST, tcode);412KUNIT_EXPECT_EQ(test, 0x00, priority);413KUNIT_EXPECT_EQ(test, 0xffc1, src_id);414KUNIT_EXPECT_EQ(test, 0xfffff0000984, offset);415416serialize_async_header_quadlet_request(header, dst_id, tlabel, retry, tcode, priority,417src_id, offset);418419KUNIT_EXPECT_MEMEQ(test, header, expected, sizeof(expected));420}421422static void test_async_header_read_quadlet_response(struct kunit *test)423{424static const u32 expected[ASYNC_HEADER_QUADLET_COUNT] = {4250xffc1f160,4260xffc00000,4270x00000000,4280x00000180,429};430u32 header[ASYNC_HEADER_QUADLET_COUNT] = {0, 0, 0, 0};431432unsigned int dst_id;433unsigned int tlabel;434unsigned int retry;435unsigned int tcode;436unsigned int priority;437unsigned int src_id;438unsigned int rcode;439u32 quadlet_data;440441deserialize_async_header_quadlet_response(expected, &dst_id, &tlabel, &retry, &tcode,442&priority, &src_id, &rcode);443quadlet_data = async_header_get_quadlet_data(expected);444445KUNIT_EXPECT_EQ(test, 0xffc1, dst_id);446KUNIT_EXPECT_EQ(test, 0x3c, tlabel);447KUNIT_EXPECT_EQ(test, 0x01, retry);448KUNIT_EXPECT_EQ(test, TCODE_READ_QUADLET_RESPONSE, tcode);449KUNIT_EXPECT_EQ(test, 0x00, priority);450KUNIT_EXPECT_EQ(test, 0xffc0, src_id);451KUNIT_EXPECT_EQ(test, RCODE_COMPLETE, rcode);452KUNIT_EXPECT_EQ(test, 0x00000180, quadlet_data);453454serialize_async_header_quadlet_response(header, dst_id, tlabel, retry, tcode, priority,455src_id, rcode);456async_header_set_quadlet_data(header, quadlet_data);457458KUNIT_EXPECT_MEMEQ(test, header, expected, sizeof(expected));459}460461static void test_async_header_read_block_request(struct kunit *test)462{463static const u32 expected[ASYNC_HEADER_QUADLET_COUNT] = {4640xffc0e150,4650xffc1ffff,4660xf0000400,4670x00200000,468};469u32 header[ASYNC_HEADER_QUADLET_COUNT] = {0, 0, 0, 0};470471unsigned int dst_id;472unsigned int tlabel;473unsigned int retry;474unsigned int tcode;475unsigned int priority;476unsigned int src_id;477u64 offset;478unsigned int data_length;479unsigned int extended_tcode;480481deserialize_async_header_block_request(expected, &dst_id, &tlabel, &retry, &tcode,482&priority, &src_id, &offset, &data_length,483&extended_tcode);484485KUNIT_EXPECT_EQ(test, 0xffc0, dst_id);486KUNIT_EXPECT_EQ(test, 0x38, tlabel);487KUNIT_EXPECT_EQ(test, 0x01, retry);488KUNIT_EXPECT_EQ(test, TCODE_READ_BLOCK_REQUEST, tcode);489KUNIT_EXPECT_EQ(test, 0x00, priority);490KUNIT_EXPECT_EQ(test, 0xffc1, src_id);491KUNIT_EXPECT_EQ(test, 0xfffff0000400, offset);492KUNIT_EXPECT_EQ(test, 0x0020, data_length);493KUNIT_EXPECT_EQ(test, 0x0000, extended_tcode);494495serialize_async_header_block_request(header, dst_id, tlabel, retry, tcode, priority, src_id,496offset, data_length, extended_tcode);497498KUNIT_EXPECT_MEMEQ(test, header, expected, sizeof(expected));499}500501static void test_async_header_read_block_response(struct kunit *test)502{503static const u32 expected[ASYNC_HEADER_QUADLET_COUNT] = {5040xffc1e170,5050xffc00000,5060x00000000,5070x00200000,508};509u32 header[ASYNC_HEADER_QUADLET_COUNT] = {0, 0, 0, 0};510511unsigned int dst_id;512unsigned int tlabel;513unsigned int retry;514unsigned int tcode;515unsigned int priority;516unsigned int src_id;517unsigned int rcode;518unsigned int data_length;519unsigned int extended_tcode;520521deserialize_async_header_block_response(expected, &dst_id, &tlabel, &retry, &tcode,522&priority, &src_id, &rcode, &data_length,523&extended_tcode);524525KUNIT_EXPECT_EQ(test, 0xffc1, dst_id);526KUNIT_EXPECT_EQ(test, 0x38, tlabel);527KUNIT_EXPECT_EQ(test, 0x01, retry);528KUNIT_EXPECT_EQ(test, TCODE_READ_BLOCK_RESPONSE, tcode);529KUNIT_EXPECT_EQ(test, 0x00, priority);530KUNIT_EXPECT_EQ(test, 0xffc0, src_id);531KUNIT_EXPECT_EQ(test, RCODE_COMPLETE, rcode);532KUNIT_EXPECT_EQ(test, 0x0020, data_length);533KUNIT_EXPECT_EQ(test, 0x0000, extended_tcode);534535serialize_async_header_block_response(header, dst_id, tlabel, retry, tcode, priority,536src_id, rcode, data_length, extended_tcode);537538KUNIT_EXPECT_MEMEQ(test, header, expected, sizeof(expected));539}540541static void test_async_header_lock_request(struct kunit *test)542{543static const u32 expected[ASYNC_HEADER_QUADLET_COUNT] = {5440xffc02d90,5450xffc1ffff,5460xf0000984,5470x00080002,548};549u32 header[ASYNC_HEADER_QUADLET_COUNT] = {0, 0, 0, 0};550551unsigned int dst_id;552unsigned int tlabel;553unsigned int retry;554unsigned int tcode;555unsigned int priority;556unsigned int src_id;557u64 offset;558unsigned int data_length;559unsigned int extended_tcode;560561deserialize_async_header_block_request(expected, &dst_id, &tlabel, &retry, &tcode,562&priority, &src_id, &offset, &data_length,563&extended_tcode);564565KUNIT_EXPECT_EQ(test, 0xffc0, dst_id);566KUNIT_EXPECT_EQ(test, 0x0b, tlabel);567KUNIT_EXPECT_EQ(test, 0x01, retry);568KUNIT_EXPECT_EQ(test, TCODE_LOCK_REQUEST, tcode);569KUNIT_EXPECT_EQ(test, 0x00, priority);570KUNIT_EXPECT_EQ(test, 0xffc1, src_id);571KUNIT_EXPECT_EQ(test, 0xfffff0000984, offset);572KUNIT_EXPECT_EQ(test, 0x0008, data_length);573KUNIT_EXPECT_EQ(test, EXTCODE_COMPARE_SWAP, extended_tcode);574575serialize_async_header_block_request(header, dst_id, tlabel, retry, tcode, priority, src_id,576offset, data_length, extended_tcode);577578KUNIT_EXPECT_MEMEQ(test, header, expected, sizeof(expected));579}580581static void test_async_header_lock_response(struct kunit *test)582{583static const u32 expected[ASYNC_HEADER_QUADLET_COUNT] = {5840xffc12db0,5850xffc00000,5860x00000000,5870x00040002,588};589u32 header[ASYNC_HEADER_QUADLET_COUNT] = {0, 0, 0, 0};590591unsigned int dst_id;592unsigned int tlabel;593unsigned int retry;594unsigned int tcode;595unsigned int priority;596unsigned int src_id;597unsigned int rcode;598unsigned int data_length;599unsigned int extended_tcode;600601deserialize_async_header_block_response(expected, &dst_id, &tlabel, &retry, &tcode,602&priority, &src_id, &rcode, &data_length,603&extended_tcode);604605KUNIT_EXPECT_EQ(test, 0xffc1, dst_id);606KUNIT_EXPECT_EQ(test, 0x0b, tlabel);607KUNIT_EXPECT_EQ(test, 0x01, retry);608KUNIT_EXPECT_EQ(test, TCODE_LOCK_RESPONSE, tcode);609KUNIT_EXPECT_EQ(test, 0x00, priority);610KUNIT_EXPECT_EQ(test, 0xffc0, src_id);611KUNIT_EXPECT_EQ(test, RCODE_COMPLETE, rcode);612KUNIT_EXPECT_EQ(test, 0x0004, data_length);613KUNIT_EXPECT_EQ(test, EXTCODE_COMPARE_SWAP, extended_tcode);614615serialize_async_header_block_response(header, dst_id, tlabel, retry, tcode, priority,616src_id, rcode, data_length, extended_tcode);617618KUNIT_EXPECT_MEMEQ(test, header, expected, sizeof(expected));619}620621static void test_isoc_header(struct kunit *test)622{623const u32 expected = 0x00d08dec;624u32 header = 0;625626unsigned int data_length;627unsigned int tag;628unsigned int channel;629unsigned int tcode;630unsigned int sy;631632deserialize_isoc_header(expected, &data_length, &tag, &channel, &tcode, &sy);633634KUNIT_EXPECT_EQ(test, 0xd0, data_length);635KUNIT_EXPECT_EQ(test, 0x02, tag);636KUNIT_EXPECT_EQ(test, 0x0d, channel);637KUNIT_EXPECT_EQ(test, 0x0e, tcode);638KUNIT_EXPECT_EQ(test, 0x0c, sy);639640serialize_isoc_header(&header, data_length, tag, channel, tcode, sy);641642KUNIT_EXPECT_EQ(test, header, expected);643}644645static void test_phy_packet_self_id_zero_case0(struct kunit *test)646{647// TSB41AB1/2 with 1 port.648const u32 expected[] = {0x80458c80};649u32 quadlets[] = {0};650651unsigned int packet_identifier;652unsigned int phy_id;653bool extended;654bool link_is_active;655unsigned int gap_count;656unsigned int scode;657bool is_contender;658unsigned int power_class;659enum phy_packet_self_id_port_status port_status[3];660bool is_initiated_reset;661bool has_more_packets;662unsigned int port_index;663664deserialize_phy_packet_self_id_zero(expected[0], &packet_identifier, &phy_id, &extended,665&link_is_active, &gap_count, &scode, &is_contender,666&power_class, &is_initiated_reset, &has_more_packets);667668KUNIT_EXPECT_EQ(test, PHY_PACKET_PACKET_IDENTIFIER_SELF_ID, packet_identifier);669KUNIT_EXPECT_EQ(test, 0, phy_id);670KUNIT_EXPECT_FALSE(test, extended);671KUNIT_EXPECT_TRUE(test, link_is_active);672KUNIT_EXPECT_EQ(test, 0x05, gap_count);673KUNIT_EXPECT_EQ(test, SCODE_400, scode);674KUNIT_EXPECT_TRUE(test, is_contender);675KUNIT_EXPECT_EQ(test, 0x4, power_class);676KUNIT_EXPECT_FALSE(test, is_initiated_reset);677KUNIT_EXPECT_FALSE(test, has_more_packets);678679serialize_phy_packet_self_id_zero(quadlets, packet_identifier, phy_id, extended,680link_is_active, gap_count, scode, is_contender,681power_class, is_initiated_reset, has_more_packets);682683for (port_index = 0; port_index < ARRAY_SIZE(port_status); ++port_index) {684port_status[port_index] =685self_id_sequence_get_port_status(expected, ARRAY_SIZE(expected), port_index);686}687688KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_PARENT, port_status[0]);689KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_NONE, port_status[1]);690KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_NONE, port_status[2]);691692for (port_index = 0; port_index < ARRAY_SIZE(port_status); ++port_index) {693self_id_sequence_set_port_status(quadlets, ARRAY_SIZE(quadlets), port_index,694port_status[port_index]);695}696697KUNIT_EXPECT_MEMEQ(test, quadlets, expected, sizeof(expected));698}699700static void test_phy_packet_self_id_zero_case1(struct kunit *test)701{702// XIO2213 and TSB81BA3E with 3 ports.703const u32 expected[] = {0x817fcc5e};704u32 quadlets[] = {0};705706unsigned int packet_identifier;707unsigned int phy_id;708bool extended;709bool link_is_active;710unsigned int gap_count;711unsigned int scode;712bool is_contender;713unsigned int power_class;714enum phy_packet_self_id_port_status port_status[3];715bool is_initiated_reset;716bool has_more_packets;717unsigned int port_index;718719deserialize_phy_packet_self_id_zero(expected[0], &packet_identifier, &phy_id, &extended,720&link_is_active, &gap_count, &scode, &is_contender,721&power_class, &is_initiated_reset, &has_more_packets);722723KUNIT_EXPECT_EQ(test, PHY_PACKET_PACKET_IDENTIFIER_SELF_ID, packet_identifier);724KUNIT_EXPECT_EQ(test, 1, phy_id);725KUNIT_EXPECT_FALSE(test, extended);726KUNIT_EXPECT_TRUE(test, link_is_active);727KUNIT_EXPECT_EQ(test, 0x3f, gap_count);728KUNIT_EXPECT_EQ(test, SCODE_800, scode);729KUNIT_EXPECT_TRUE(test, is_contender);730KUNIT_EXPECT_EQ(test, 0x4, power_class);731KUNIT_EXPECT_TRUE(test, is_initiated_reset);732KUNIT_EXPECT_FALSE(test, has_more_packets);733734serialize_phy_packet_self_id_zero(quadlets, packet_identifier, phy_id, extended,735link_is_active, gap_count, scode, is_contender,736power_class, is_initiated_reset, has_more_packets);737738for (port_index = 0; port_index < ARRAY_SIZE(port_status); ++port_index) {739port_status[port_index] =740self_id_sequence_get_port_status(expected, ARRAY_SIZE(expected), port_index);741}742743KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_NCONN, port_status[0]);744KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_NCONN, port_status[1]);745KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_CHILD, port_status[2]);746747for (port_index = 0; port_index < ARRAY_SIZE(port_status); ++port_index) {748self_id_sequence_set_port_status(quadlets, ARRAY_SIZE(quadlets), port_index,749port_status[port_index]);750}751752KUNIT_EXPECT_MEMEQ(test, quadlets, expected, sizeof(expected));753}754755static void test_phy_packet_self_id_zero_and_one(struct kunit *test)756{757// TSB41LV06A with 6 ports.758const u32 expected[] = {7590x803f8459,7600x80815000,761};762u32 quadlets[] = {0, 0};763764unsigned int packet_identifier;765unsigned int phy_id;766bool extended;767bool link_is_active;768unsigned int gap_count;769unsigned int scode;770bool is_contender;771unsigned int power_class;772enum phy_packet_self_id_port_status port_status[11];773bool is_initiated_reset;774bool has_more_packets;775776unsigned int sequence;777unsigned int port_index;778779deserialize_phy_packet_self_id_zero(expected[0], &packet_identifier, &phy_id, &extended,780&link_is_active, &gap_count, &scode, &is_contender,781&power_class, &is_initiated_reset, &has_more_packets);782783KUNIT_EXPECT_EQ(test, PHY_PACKET_PACKET_IDENTIFIER_SELF_ID, packet_identifier);784KUNIT_EXPECT_EQ(test, 0, phy_id);785KUNIT_EXPECT_FALSE(test, extended);786KUNIT_EXPECT_FALSE(test, link_is_active);787KUNIT_EXPECT_EQ(test, 0x3f, gap_count);788KUNIT_EXPECT_EQ(test, SCODE_400, scode);789KUNIT_EXPECT_FALSE(test, is_contender);790KUNIT_EXPECT_EQ(test, 0x4, power_class);791KUNIT_EXPECT_FALSE(test, is_initiated_reset);792KUNIT_EXPECT_TRUE(test, has_more_packets);793794serialize_phy_packet_self_id_zero(quadlets, packet_identifier, phy_id, extended,795link_is_active, gap_count, scode, is_contender,796power_class, is_initiated_reset, has_more_packets);797798deserialize_phy_packet_self_id_extended(expected[1], &packet_identifier, &phy_id, &extended,799&sequence, &has_more_packets);800801KUNIT_EXPECT_EQ(test, PHY_PACKET_PACKET_IDENTIFIER_SELF_ID, packet_identifier);802KUNIT_EXPECT_EQ(test, 0, phy_id);803KUNIT_EXPECT_TRUE(test, extended);804KUNIT_EXPECT_EQ(test, 0, sequence);805KUNIT_EXPECT_FALSE(test, has_more_packets);806807serialize_phy_packet_self_id_extended(&quadlets[1], packet_identifier, phy_id, extended,808sequence, has_more_packets);809810811for (port_index = 0; port_index < ARRAY_SIZE(port_status); ++port_index) {812port_status[port_index] =813self_id_sequence_get_port_status(expected, ARRAY_SIZE(expected), port_index);814}815816KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_NCONN, port_status[0]);817KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_NCONN, port_status[1]);818KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_PARENT, port_status[2]);819KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_NCONN, port_status[3]);820KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_NCONN, port_status[4]);821KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_NCONN, port_status[5]);822KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_NONE, port_status[6]);823KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_NONE, port_status[7]);824KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_NONE, port_status[8]);825KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_NONE, port_status[9]);826KUNIT_EXPECT_EQ(test, PHY_PACKET_SELF_ID_PORT_STATUS_NONE, port_status[10]);827828for (port_index = 0; port_index < ARRAY_SIZE(port_status); ++port_index) {829self_id_sequence_set_port_status(quadlets, ARRAY_SIZE(quadlets), port_index,830port_status[port_index]);831}832833KUNIT_EXPECT_MEMEQ(test, quadlets, expected, sizeof(expected));834}835836static void test_phy_packet_phy_config_force_root_node(struct kunit *test)837{838const u32 expected = 0x02800000;839u32 quadlet = 0;840841unsigned int packet_identifier;842unsigned int root_id;843bool has_force_root_node;844bool has_gap_count_optimization;845unsigned int gap_count;846847deserialize_phy_packet_phy_config(expected, &packet_identifier, &root_id,848&has_force_root_node, &has_gap_count_optimization,849&gap_count);850851KUNIT_EXPECT_EQ(test, PHY_PACKET_PACKET_IDENTIFIER_PHY_CONFIG, packet_identifier);852KUNIT_EXPECT_EQ(test, 0x02, root_id);853KUNIT_EXPECT_TRUE(test, has_force_root_node);854KUNIT_EXPECT_FALSE(test, has_gap_count_optimization);855KUNIT_EXPECT_EQ(test, 0, gap_count);856857serialize_phy_packet_phy_config(&quadlet, packet_identifier, root_id, has_force_root_node,858has_gap_count_optimization, gap_count);859860KUNIT_EXPECT_EQ(test, quadlet, expected);861}862863static void test_phy_packet_phy_config_gap_count_optimization(struct kunit *test)864{865const u32 expected = 0x034f0000;866u32 quadlet = 0;867868unsigned int packet_identifier;869unsigned int root_id;870bool has_force_root_node;871bool has_gap_count_optimization;872unsigned int gap_count;873874deserialize_phy_packet_phy_config(expected, &packet_identifier, &root_id,875&has_force_root_node, &has_gap_count_optimization,876&gap_count);877878KUNIT_EXPECT_EQ(test, PHY_PACKET_PACKET_IDENTIFIER_PHY_CONFIG, packet_identifier);879KUNIT_EXPECT_EQ(test, 0x03, root_id);880KUNIT_EXPECT_FALSE(test, has_force_root_node);881KUNIT_EXPECT_TRUE(test, has_gap_count_optimization);882KUNIT_EXPECT_EQ(test, 0x0f, gap_count);883884serialize_phy_packet_phy_config(&quadlet, packet_identifier, root_id, has_force_root_node,885has_gap_count_optimization, gap_count);886887KUNIT_EXPECT_EQ(test, quadlet, expected);888}889890static struct kunit_case packet_serdes_test_cases[] = {891KUNIT_CASE(test_async_header_write_quadlet_request),892KUNIT_CASE(test_async_header_write_block_request),893KUNIT_CASE(test_async_header_write_response),894KUNIT_CASE(test_async_header_read_quadlet_request),895KUNIT_CASE(test_async_header_read_quadlet_response),896KUNIT_CASE(test_async_header_read_block_request),897KUNIT_CASE(test_async_header_read_block_response),898KUNIT_CASE(test_async_header_lock_request),899KUNIT_CASE(test_async_header_lock_response),900KUNIT_CASE(test_isoc_header),901KUNIT_CASE(test_phy_packet_self_id_zero_case0),902KUNIT_CASE(test_phy_packet_self_id_zero_case1),903KUNIT_CASE(test_phy_packet_self_id_zero_and_one),904KUNIT_CASE(test_phy_packet_phy_config_force_root_node),905KUNIT_CASE(test_phy_packet_phy_config_gap_count_optimization),906{}907};908909static struct kunit_suite packet_serdes_test_suite = {910.name = "firewire-packet-serdes",911.test_cases = packet_serdes_test_cases,912};913kunit_test_suite(packet_serdes_test_suite);914915MODULE_DESCRIPTION("FireWire packet serialization/deserialization unit test suite");916MODULE_LICENSE("GPL");917918919