drivers/net/ethernet/freescale/fman/fman_sp.c
Source file repositories/reference/linux-study-clean/drivers/net/ethernet/freescale/fman/fman_sp.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/net/ethernet/freescale/fman/fman_sp.c- Extension
.c- Size
- 4540 bytes
- Lines
- 143
- Domain
- Driver Families
- Bucket
- drivers/net
- Inferred role
- Driver Families: exported/initcall integration point
- Status
- integration 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.
- 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.
- Exports symbols or registers init work; inspect boot/module ordering and who consumes the exported contract.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
fman_sp.hfman.h
Detected Declarations
function fman_sp_set_buf_pools_in_asc_order_of_buf_sizesfunction fman_sp_build_buffer_structexport fman_sp_set_buf_pools_in_asc_order_of_buf_sizesexport fman_sp_build_buffer_struct
Annotated Snippet
if (buf_size < sizes_array[ordered_array[j]]) {
/* move the pool_ids one place ahead
* to make room for this poolId
*/
for (k = i; k > j; k--)
ordered_array[k] =
ordered_array[k - 1];
/* now k==j, this is the place for
* the new size
*/
ordered_array[k] =
fm_ext_pools->ext_buf_pool[i].id;
break;
}
}
}
}
}
EXPORT_SYMBOL(fman_sp_set_buf_pools_in_asc_order_of_buf_sizes);
int fman_sp_build_buffer_struct(struct fman_sp_int_context_data_copy *
int_context_data_copy,
struct fman_buffer_prefix_content *
buffer_prefix_content,
struct fman_sp_buf_margins *buf_margins,
struct fman_sp_buffer_offsets *buffer_offsets,
u8 *internal_buf_offset)
{
u32 tmp;
/* Align start of internal context data to 16 byte */
int_context_data_copy->ext_buf_offset = (u16)
((buffer_prefix_content->priv_data_size & (OFFSET_UNITS - 1)) ?
((buffer_prefix_content->priv_data_size + OFFSET_UNITS) &
~(u16)(OFFSET_UNITS - 1)) :
buffer_prefix_content->priv_data_size);
/* Translate margin and int_context params to FM parameters */
/* Initialize with illegal value. Later we'll set legal values. */
buffer_offsets->prs_result_offset = (u32)ILLEGAL_BASE;
buffer_offsets->time_stamp_offset = (u32)ILLEGAL_BASE;
buffer_offsets->hash_result_offset = (u32)ILLEGAL_BASE;
/* Internally the driver supports 4 options
* 1. prsResult/timestamp/hashResult selection (in fact 8 options,
* but for simplicity we'll
* relate to it as 1).
* 2. All IC context (from AD) not including debug.
*/
/* This case covers the options under 1 */
/* Copy size must be in 16-byte granularity. */
int_context_data_copy->size =
(u16)((buffer_prefix_content->pass_prs_result ? 32 : 0) +
((buffer_prefix_content->pass_time_stamp ||
buffer_prefix_content->pass_hash_result) ? 16 : 0));
/* Align start of internal context data to 16 byte */
int_context_data_copy->int_context_offset =
(u8)(buffer_prefix_content->pass_prs_result ? 32 :
((buffer_prefix_content->pass_time_stamp ||
buffer_prefix_content->pass_hash_result) ? 64 : 0));
if (buffer_prefix_content->pass_prs_result)
buffer_offsets->prs_result_offset =
int_context_data_copy->ext_buf_offset;
if (buffer_prefix_content->pass_time_stamp)
buffer_offsets->time_stamp_offset =
buffer_prefix_content->pass_prs_result ?
(int_context_data_copy->ext_buf_offset +
sizeof(struct fman_prs_result)) :
int_context_data_copy->ext_buf_offset;
if (buffer_prefix_content->pass_hash_result)
/* If PR is not requested, whether TS is
* requested or not, IC will be copied from TS
*/
buffer_offsets->hash_result_offset =
buffer_prefix_content->pass_prs_result ?
(int_context_data_copy->ext_buf_offset +
sizeof(struct fman_prs_result) + 8) :
int_context_data_copy->ext_buf_offset + 8;
if (int_context_data_copy->size)
buf_margins->start_margins =
(u16)(int_context_data_copy->ext_buf_offset +
int_context_data_copy->size);
else
/* No Internal Context passing, STartMargin is
* immediately after private_info
Annotation
- Immediate include surface: `fman_sp.h`, `fman.h`.
- Detected declarations: `function fman_sp_set_buf_pools_in_asc_order_of_buf_sizes`, `function fman_sp_build_buffer_struct`, `export fman_sp_set_buf_pools_in_asc_order_of_buf_sizes`, `export fman_sp_build_buffer_struct`.
- Atlas domain: Driver Families / drivers/net.
- Implementation status: integration implementation candidate.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.