Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

firewire: ohci: add static inline functions to serialize/deserialize data of IT DMA

In 1394 OHCI specification, the format of data for IT DMA is different from
the format of isochronous packet in IEEE 1394 specification, in its spd and
srcBusID fields.

This commit adds some static inline functions to serialize/deserialize the
data of IT DMA.

Link: https://lore.kernel.org/r/20240802003606.109402-4-o-takashi@sakamocchi.jp
Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>

+116
+32
drivers/firewire/ohci-serdes-test.c
··· 73 73 KUNIT_EXPECT_MEMEQ(test, quadlets, expected, sizeof(expected)); 74 74 } 75 75 76 + static void test_it_data_serdes(struct kunit *test) 77 + { 78 + static const __le32 expected[] = { 79 + cpu_to_le32(0x000349a7), 80 + cpu_to_le32(0x02300000), 81 + }; 82 + __le32 quadlets[] = {0, 0}; 83 + unsigned int scode = ohci1394_it_data_get_speed(expected); 84 + unsigned int tag = ohci1394_it_data_get_tag(expected); 85 + unsigned int channel = ohci1394_it_data_get_channel(expected); 86 + unsigned int tcode = ohci1394_it_data_get_tcode(expected); 87 + unsigned int sync = ohci1394_it_data_get_sync(expected); 88 + unsigned int data_length = ohci1394_it_data_get_data_length(expected); 89 + 90 + KUNIT_EXPECT_EQ(test, 0x03, scode); 91 + KUNIT_EXPECT_EQ(test, 0x01, tag); 92 + KUNIT_EXPECT_EQ(test, 0x09, channel); 93 + KUNIT_EXPECT_EQ(test, 0x0a, tcode); 94 + KUNIT_EXPECT_EQ(test, 0x7, sync); 95 + KUNIT_EXPECT_EQ(test, 0x0230, data_length); 96 + 97 + ohci1394_it_data_set_speed(quadlets, scode); 98 + ohci1394_it_data_set_tag(quadlets, tag); 99 + ohci1394_it_data_set_channel(quadlets, channel); 100 + ohci1394_it_data_set_tcode(quadlets, tcode); 101 + ohci1394_it_data_set_sync(quadlets, sync); 102 + ohci1394_it_data_set_data_length(quadlets, data_length); 103 + 104 + KUNIT_EXPECT_MEMEQ(test, quadlets, expected, sizeof(expected)); 105 + } 106 + 76 107 static struct kunit_case ohci_serdes_test_cases[] = { 77 108 KUNIT_CASE(test_self_id_count_register_deserialization), 78 109 KUNIT_CASE(test_self_id_receive_buffer_deserialization), 79 110 KUNIT_CASE(test_at_data_serdes), 111 + KUNIT_CASE(test_it_data_serdes), 80 112 {} 81 113 }; 82 114
+84
drivers/firewire/ohci.h
··· 269 269 data[1] |= cpu_to_le32((rcode << OHCI1394_AT_DATA_Q1_rCode_SHIFT) & OHCI1394_AT_DATA_Q1_rCode_MASK); 270 270 } 271 271 272 + // Isochronous Transmit DMA. 273 + // 274 + // The content of first two quadlets of data for IT DMA is different from the header for IEEE 1394 275 + // isochronous packet. 276 + 277 + #define OHCI1394_IT_DATA_Q0_spd_MASK 0x00070000 278 + #define OHCI1394_IT_DATA_Q0_spd_SHIFT 16 279 + #define OHCI1394_IT_DATA_Q0_tag_MASK 0x0000c000 280 + #define OHCI1394_IT_DATA_Q0_tag_SHIFT 14 281 + #define OHCI1394_IT_DATA_Q0_chanNum_MASK 0x00003f00 282 + #define OHCI1394_IT_DATA_Q0_chanNum_SHIFT 8 283 + #define OHCI1394_IT_DATA_Q0_tcode_MASK 0x000000f0 284 + #define OHCI1394_IT_DATA_Q0_tcode_SHIFT 4 285 + #define OHCI1394_IT_DATA_Q0_sy_MASK 0x0000000f 286 + #define OHCI1394_IT_DATA_Q0_sy_SHIFT 0 287 + #define OHCI1394_IT_DATA_Q1_dataLength_MASK 0xffff0000 288 + #define OHCI1394_IT_DATA_Q1_dataLength_SHIFT 16 289 + 290 + static inline unsigned int ohci1394_it_data_get_speed(const __le32 *data) 291 + { 292 + return (le32_to_cpu(data[0]) & OHCI1394_IT_DATA_Q0_spd_MASK) >> OHCI1394_IT_DATA_Q0_spd_SHIFT; 293 + } 294 + 295 + static inline void ohci1394_it_data_set_speed(__le32 *data, unsigned int scode) 296 + { 297 + data[0] &= cpu_to_le32(~OHCI1394_IT_DATA_Q0_spd_MASK); 298 + data[0] |= cpu_to_le32((scode << OHCI1394_IT_DATA_Q0_spd_SHIFT) & OHCI1394_IT_DATA_Q0_spd_MASK); 299 + } 300 + 301 + static inline unsigned int ohci1394_it_data_get_tag(const __le32 *data) 302 + { 303 + return (le32_to_cpu(data[0]) & OHCI1394_IT_DATA_Q0_tag_MASK) >> OHCI1394_IT_DATA_Q0_tag_SHIFT; 304 + } 305 + 306 + static inline void ohci1394_it_data_set_tag(__le32 *data, unsigned int tag) 307 + { 308 + data[0] &= cpu_to_le32(~OHCI1394_IT_DATA_Q0_tag_MASK); 309 + data[0] |= cpu_to_le32((tag << OHCI1394_IT_DATA_Q0_tag_SHIFT) & OHCI1394_IT_DATA_Q0_tag_MASK); 310 + } 311 + 312 + static inline unsigned int ohci1394_it_data_get_channel(const __le32 *data) 313 + { 314 + return (le32_to_cpu(data[0]) & OHCI1394_IT_DATA_Q0_chanNum_MASK) >> OHCI1394_IT_DATA_Q0_chanNum_SHIFT; 315 + } 316 + 317 + static inline void ohci1394_it_data_set_channel(__le32 *data, unsigned int channel) 318 + { 319 + data[0] &= cpu_to_le32(~OHCI1394_IT_DATA_Q0_chanNum_MASK); 320 + data[0] |= cpu_to_le32((channel << OHCI1394_IT_DATA_Q0_chanNum_SHIFT) & OHCI1394_IT_DATA_Q0_chanNum_MASK); 321 + } 322 + 323 + static inline unsigned int ohci1394_it_data_get_tcode(const __le32 *data) 324 + { 325 + return (le32_to_cpu(data[0]) & OHCI1394_IT_DATA_Q0_tcode_MASK) >> OHCI1394_IT_DATA_Q0_tcode_SHIFT; 326 + } 327 + 328 + static inline void ohci1394_it_data_set_tcode(__le32 *data, unsigned int tcode) 329 + { 330 + data[0] &= cpu_to_le32(~OHCI1394_IT_DATA_Q0_tcode_MASK); 331 + data[0] |= cpu_to_le32((tcode << OHCI1394_IT_DATA_Q0_tcode_SHIFT) & OHCI1394_IT_DATA_Q0_tcode_MASK); 332 + } 333 + 334 + static inline unsigned int ohci1394_it_data_get_sync(const __le32 *data) 335 + { 336 + return (le32_to_cpu(data[0]) & OHCI1394_IT_DATA_Q0_sy_MASK) >> OHCI1394_IT_DATA_Q0_sy_SHIFT; 337 + } 338 + 339 + static inline void ohci1394_it_data_set_sync(__le32 *data, unsigned int sync) 340 + { 341 + data[0] &= cpu_to_le32(~OHCI1394_IT_DATA_Q0_sy_MASK); 342 + data[0] |= cpu_to_le32((sync << OHCI1394_IT_DATA_Q0_sy_SHIFT) & OHCI1394_IT_DATA_Q0_sy_MASK); 343 + } 344 + 345 + static inline unsigned int ohci1394_it_data_get_data_length(const __le32 *data) 346 + { 347 + return (le32_to_cpu(data[1]) & OHCI1394_IT_DATA_Q1_dataLength_MASK) >> OHCI1394_IT_DATA_Q1_dataLength_SHIFT; 348 + } 349 + 350 + static inline void ohci1394_it_data_set_data_length(__le32 *data, unsigned int data_length) 351 + { 352 + data[1] &= cpu_to_le32(~OHCI1394_IT_DATA_Q1_dataLength_MASK); 353 + data[1] |= cpu_to_le32((data_length << OHCI1394_IT_DATA_Q1_dataLength_SHIFT) & OHCI1394_IT_DATA_Q1_dataLength_MASK); 354 + } 355 + 272 356 // Self-ID DMA. 273 357 274 358 #define OHCI1394_SelfIDCount_selfIDError_MASK 0x80000000