drivers/net/ethernet/ti/am65-cpsw-qos.c
Source file repositories/reference/linux-study-clean/drivers/net/ethernet/ti/am65-cpsw-qos.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/net/ethernet/ti/am65-cpsw-qos.c- Extension
.c- Size
- 36441 bytes
- Lines
- 1344
- 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.
- 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.
- Uses kernel synchronization; read lock ordering, sleepability, and interrupt context assumptions before translating.
- Allocates kernel memory; connect allocation flags and lifetime to context constraints.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/pm_runtime.hlinux/math.hlinux/math64.hlinux/time.hlinux/units.hnet/pkt_cls.ham65-cpsw-nuss.ham65-cpsw-qos.ham65-cpts.hcpsw_ale.h
Detected Declarations
enum timer_actfunction am65_cpsw_qos_tx_rate_calcfunction am65_cpsw_tx_pn_shaper_resetfunction am65_cpsw_tx_pn_shaper_applyfunction am65_cpsw_mqprio_verify_shaperfunction am65_cpsw_reset_tc_mqpriofunction am65_cpsw_setup_mqpriofunction am65_cpsw_iet_set_verify_timeout_countfunction am65_cpsw_iet_verify_waitfunction am65_cpsw_iet_set_preempt_maskfunction am65_cpsw_iet_common_enablefunction am65_cpsw_iet_commit_preemptible_tcsfunction am65_cpsw_iet_change_preemptible_tcsfunction am65_cpsw_iet_link_state_updatefunction am65_cpsw_port_est_enabledfunction am65_cpsw_est_enablefunction am65_cpsw_port_est_enablefunction am65_cpsw_port_est_assign_buf_numfunction matchfunction am65_cpsw_port_est_get_free_buf_numfunction am65_cpsw_admin_to_operfunction am65_cpsw_port_est_get_buf_numfunction am65_cpsw_est_setfunction am65_cpsw_est_update_statefunction am65_est_cmd_ns_to_cntfunction am65_cpsw_est_calc_cmd_numfunction am65_cpsw_est_check_schedsfunction am65_cpsw_est_set_sched_listfunction am65_cpsw_timer_setfunction am65_cpsw_timer_stopfunction am65_cpsw_timer_actfunction am65_cpsw_stop_estfunction am65_cpsw_taprio_destroyfunction am65_cpsw_cp_tapriofunction am65_cpsw_taprio_replacefunction am65_cpsw_est_link_upfunction am65_cpsw_setup_tapriofunction am65_cpsw_tc_query_capsfunction am65_cpsw_qos_clsflower_add_policerfunction ether_addr_equal_unalignedfunction am65_cpsw_qos_clsflower_policer_validatefunction am65_cpsw_qos_configure_clsflowerfunction flow_action_for_eachfunction am65_cpsw_qos_delete_clsflowerfunction am65_cpsw_qos_setup_tc_clsflowerfunction am65_cpsw_qos_setup_tc_block_cbfunction am65_cpsw_qos_setup_tc_blockfunction am65_cpsw_qos_tx_p0_rate_apply
Annotated Snippet
if (mqprio->max_rate[tc]) {
rate_mbps = mqprio->max_rate[tc] - mqprio->min_rate[tc];
rate_mbps = TO_MBPS(rate_mbps);
rate_mbps = am65_cpsw_qos_tx_rate_calc(rate_mbps,
common->bus_freq);
}
writel(rate_mbps,
port->port_base + AM65_CPSW_PN_REG_PRI_EIR(prio));
}
}
static int am65_cpsw_mqprio_verify_shaper(struct am65_cpsw_port *port,
struct tc_mqprio_qopt_offload *mqprio)
{
struct am65_cpsw_mqprio *p_mqprio = &port->qos.mqprio;
struct netlink_ext_ack *extack = mqprio->extack;
u64 min_rate_total = 0, max_rate_total = 0;
u32 min_rate_msk = 0, max_rate_msk = 0;
bool has_min_rate, has_max_rate;
int num_tc, i;
if (!(mqprio->flags & TC_MQPRIO_F_SHAPER))
return 0;
if (mqprio->shaper != TC_MQPRIO_SHAPER_BW_RATE)
return 0;
has_min_rate = !!(mqprio->flags & TC_MQPRIO_F_MIN_RATE);
has_max_rate = !!(mqprio->flags & TC_MQPRIO_F_MAX_RATE);
if (!has_min_rate && has_max_rate) {
NL_SET_ERR_MSG_MOD(extack, "min_rate is required with max_rate");
return -EOPNOTSUPP;
}
if (!has_min_rate)
return 0;
num_tc = mqprio->qopt.num_tc;
for (i = num_tc - 1; i >= 0; i--) {
u32 ch_msk;
if (mqprio->min_rate[i])
min_rate_msk |= BIT(i);
min_rate_total += mqprio->min_rate[i];
if (has_max_rate) {
if (mqprio->max_rate[i])
max_rate_msk |= BIT(i);
max_rate_total += mqprio->max_rate[i];
if (!mqprio->min_rate[i] && mqprio->max_rate[i]) {
NL_SET_ERR_MSG_FMT_MOD(extack,
"TX tc%d rate max>0 but min=0",
i);
return -EINVAL;
}
if (mqprio->max_rate[i] &&
mqprio->max_rate[i] < mqprio->min_rate[i]) {
NL_SET_ERR_MSG_FMT_MOD(extack,
"TX tc%d rate min(%llu)>max(%llu)",
i, mqprio->min_rate[i],
mqprio->max_rate[i]);
return -EINVAL;
}
}
ch_msk = GENMASK(num_tc - 1, i);
if ((min_rate_msk & BIT(i)) && (min_rate_msk ^ ch_msk)) {
NL_SET_ERR_MSG_FMT_MOD(extack,
"Min rate must be set sequentially hi->lo tx_rate_msk%x",
min_rate_msk);
return -EINVAL;
}
if ((max_rate_msk & BIT(i)) && (max_rate_msk ^ ch_msk)) {
NL_SET_ERR_MSG_FMT_MOD(extack,
"Max rate must be set sequentially hi->lo tx_rate_msk%x",
max_rate_msk);
return -EINVAL;
}
}
min_rate_total = TO_MBPS(min_rate_total);
max_rate_total = TO_MBPS(max_rate_total);
p_mqprio->shaper_en = true;
Annotation
- Immediate include surface: `linux/pm_runtime.h`, `linux/math.h`, `linux/math64.h`, `linux/time.h`, `linux/units.h`, `net/pkt_cls.h`, `am65-cpsw-nuss.h`, `am65-cpsw-qos.h`.
- Detected declarations: `enum timer_act`, `function am65_cpsw_qos_tx_rate_calc`, `function am65_cpsw_tx_pn_shaper_reset`, `function am65_cpsw_tx_pn_shaper_apply`, `function am65_cpsw_mqprio_verify_shaper`, `function am65_cpsw_reset_tc_mqprio`, `function am65_cpsw_setup_mqprio`, `function am65_cpsw_iet_set_verify_timeout_count`, `function am65_cpsw_iet_verify_wait`, `function am65_cpsw_iet_set_preempt_mask`.
- Atlas domain: Driver Families / drivers/net.
- Implementation status: source implementation candidate.
- Synchronization appears in or near this file; preserve lock ordering, sleepability, and interrupt-context constraints.
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.