drivers/net/ethernet/freescale/enetc/enetc_ierb.c

Source file repositories/reference/linux-study-clean/drivers/net/ethernet/freescale/enetc/enetc_ierb.c

File Facts

System
Linux kernel
Corpus path
drivers/net/ethernet/freescale/enetc/enetc_ierb.c
Extension
.c
Size
5012 bytes
Lines
148
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.

Dependency Surface

Detected Declarations

Annotated Snippet

struct enetc_ierb {
	void __iomem *regs;
};

static void enetc_ierb_write(struct enetc_ierb *ierb, u32 offset, u32 val)
{
	iowrite32(val, ierb->regs + offset);
}

int enetc_ierb_register_pf(struct platform_device *pdev,
			   struct pci_dev *pf_pdev)
{
	struct enetc_ierb *ierb = platform_get_drvdata(pdev);
	int port = enetc_pf_to_port(pf_pdev);
	u16 tx_credit, rx_credit, tx_alloc;

	if (port < 0)
		return -ENODEV;

	if (!ierb)
		return -EPROBE_DEFER;

	/* By default, it is recommended to set the Host Transfer Agent
	 * per port transmit byte credit to "1000 + max_frame_size/2".
	 * The power-on reset value (1800 bytes) is rounded up to the nearest
	 * 100 assuming a maximum frame size of 1536 bytes.
	 */
	tx_credit = roundup(1000 + ENETC_MAC_MAXFRM_SIZE / 2, 100);

	/* Internal memory allocated for transmit buffering is guaranteed but
	 * not reserved; i.e. if the total transmit allocation is not used,
	 * then the unused portion is not left idle, it can be used for receive
	 * buffering but it will be reclaimed, if required, from receive by
	 * intelligently dropping already stored receive frames in the internal
	 * memory to ensure that the transmit allocation is respected.
	 *
	 * PaTXMBAR must be set to a value larger than
	 *     PaTXBCR + 2 * max_frame_size + 32
	 * if frame preemption is not enabled, or to
	 *     2 * PaTXBCR + 2 * p_max_frame_size (pMAC maximum frame size) +
	 *     2 * np_max_frame_size (eMAC maximum frame size) + 64
	 * if frame preemption is enabled.
	 */
	tx_alloc = roundup(2 * tx_credit + 4 * ENETC_MAC_MAXFRM_SIZE + 64, 16);

	/* Initial credits, in units of 8 bytes, to the Ingress Congestion
	 * Manager for the maximum amount of bytes the port is allocated for
	 * pending traffic.
	 * It is recommended to set the initial credits to 2 times the maximum
	 * frame size (2 frames of maximum size).
	 */
	rx_credit = DIV_ROUND_UP(ENETC_MAC_MAXFRM_SIZE * 2, 8);

	enetc_ierb_write(ierb, ENETC_IERB_TXBCR(port), tx_credit);
	enetc_ierb_write(ierb, ENETC_IERB_TXMBAR(port), tx_alloc);
	enetc_ierb_write(ierb, ENETC_IERB_RXBCR(port), rx_credit);

	return 0;
}
EXPORT_SYMBOL(enetc_ierb_register_pf);

static int enetc_ierb_probe(struct platform_device *pdev)
{
	struct enetc_ierb *ierb;
	void __iomem *regs;

	ierb = devm_kzalloc(&pdev->dev, sizeof(*ierb), GFP_KERNEL);
	if (!ierb)
		return -ENOMEM;

	regs = devm_platform_get_and_ioremap_resource(pdev, 0, NULL);
	if (IS_ERR(regs))
		return PTR_ERR(regs);

	ierb->regs = regs;

	/* Free buffer depletion threshold in bytes.
	 * This sets the minimum amount of free buffer memory that should be
	 * maintained in the datapath sub system, and when the amount of free
	 * buffer memory falls below this threshold, a depletion indication is
	 * asserted, which may trigger "intelligent drop" frame releases from
	 * the ingress queues in the ICM.
	 * It is recommended to set the free buffer depletion threshold to 1024
	 * bytes, since the ICM needs some FIFO memory for its own use.
	 */
	enetc_ierb_write(ierb, ENETC_IERB_FMBDTR, ENETC_RESERVED_FOR_ICM);

	platform_set_drvdata(pdev, ierb);

	return 0;

Annotation

Implementation Notes