int dprc_init_container_obj(struct dprc_obj_desc obj_desc, uint16_t dprc_handle) { int error = 0, state = 0; struct dprc_endpoint dpni_endpoint, dpmac_endpoint; if (!strcmp(obj_desc.type, "dpbp")) { if (!dflt_dpbp) { error = dpbp_init(obj_desc); if (error < 0) printf("dpbp_init failed\n"); } } else if (!strcmp(obj_desc.type, "dpio")) { if (!dflt_dpio) { error = dpio_init(obj_desc); if (error < 0) printf("dpio_init failed\n"); } } else if (!strcmp(obj_desc.type, "dpni")) { strcpy(dpni_endpoint.type, obj_desc.type); dpni_endpoint.id = obj_desc.id; error = dprc_get_connection(dflt_mc_io, MC_CMD_NO_FLAGS, dprc_handle, &dpni_endpoint, &dpmac_endpoint, &state); if (!strcmp(dpmac_endpoint.type, "dpmac")) error = ldpaa_eth_init(obj_desc); if (error < 0) printf("ldpaa_eth_init failed\n"); } return error; }
static int ldpaa_dpmac_bind(struct ldpaa_eth_priv *priv) { int err = 0; struct dprc_connection_cfg dprc_connection_cfg = { /* If both rates are zero the connection */ /* will be configured in "best effort" mode. */ .committed_rate = 0, .max_rate = 0 }; #ifdef DEBUG struct dprc_endpoint dbg_endpoint; int state = 0; #endif memset(&dpmac_endpoint, 0, sizeof(struct dprc_endpoint)); sprintf(dpmac_endpoint.type, "dpmac"); dpmac_endpoint.id = priv->dpmac_id; memset(&dpni_endpoint, 0, sizeof(struct dprc_endpoint)); sprintf(dpni_endpoint.type, "dpni"); dpni_endpoint.id = dflt_dpni->dpni_id; err = dprc_connect(dflt_mc_io, MC_CMD_NO_FLAGS, dflt_dprc_handle, &dpmac_endpoint, &dpni_endpoint, &dprc_connection_cfg); if (err) printf("dprc_connect() failed\n"); #ifdef DEBUG err = dprc_get_connection(dflt_mc_io, MC_CMD_NO_FLAGS, dflt_dprc_handle, &dpni_endpoint, &dbg_endpoint, &state); printf("%s, DPMAC Type= %s\n", __func__, dbg_endpoint.type); printf("%s, DPMAC ID= %d\n", __func__, dbg_endpoint.id); printf("%s, DPMAC State= %d\n", __func__, state); memset(&dbg_endpoint, 0, sizeof(struct dprc_endpoint)); err = dprc_get_connection(dflt_mc_io, MC_CMD_NO_FLAGS, dflt_dprc_handle, &dpmac_endpoint, &dbg_endpoint, &state); printf("%s, DPNI Type= %s\n", __func__, dbg_endpoint.type); printf("%s, DPNI ID= %d\n", __func__, dbg_endpoint.id); printf("%s, DPNI State= %d\n", __func__, state); #endif return err; } static int ldpaa_dpni_setup(struct ldpaa_eth_priv *priv) { int err; /* and get a handle for the DPNI this interface is associate with */ err = dpni_open(dflt_mc_io, MC_CMD_NO_FLAGS, dflt_dpni->dpni_id, &dflt_dpni->dpni_handle); if (err) { printf("dpni_open() failed\n"); goto err_open; } err = dpni_get_attributes(dflt_mc_io, MC_CMD_NO_FLAGS, dflt_dpni->dpni_handle, &dflt_dpni->dpni_attrs); if (err) { printf("dpni_get_attributes() failed (err=%d)\n", err); goto err_get_attr; } /* Configure our buffers' layout */ dflt_dpni->buf_layout.options = DPNI_BUF_LAYOUT_OPT_PARSER_RESULT | DPNI_BUF_LAYOUT_OPT_FRAME_STATUS | DPNI_BUF_LAYOUT_OPT_PRIVATE_DATA_SIZE | DPNI_BUF_LAYOUT_OPT_DATA_ALIGN; dflt_dpni->buf_layout.pass_parser_result = true; dflt_dpni->buf_layout.pass_frame_status = true; dflt_dpni->buf_layout.private_data_size = LDPAA_ETH_SWA_SIZE; /* HW erratum mandates data alignment in multiples of 256 */ dflt_dpni->buf_layout.data_align = LDPAA_ETH_BUF_ALIGN; /* ...rx, ... */ err = dpni_set_rx_buffer_layout(dflt_mc_io, MC_CMD_NO_FLAGS, dflt_dpni->dpni_handle, &dflt_dpni->buf_layout); if (err) { printf("dpni_set_rx_buffer_layout() failed"); goto err_buf_layout; } /* ... tx, ... */ /* remove Rx-only options */ dflt_dpni->buf_layout.options &= ~(DPNI_BUF_LAYOUT_OPT_DATA_ALIGN | DPNI_BUF_LAYOUT_OPT_PARSER_RESULT); err = dpni_set_tx_buffer_layout(dflt_mc_io, MC_CMD_NO_FLAGS, dflt_dpni->dpni_handle, &dflt_dpni->buf_layout); if (err) { printf("dpni_set_tx_buffer_layout() failed"); goto err_buf_layout; } /* ... tx-confirm. */ dflt_dpni->buf_layout.options &= ~DPNI_BUF_LAYOUT_OPT_PRIVATE_DATA_SIZE; err = dpni_set_tx_conf_buffer_layout(dflt_mc_io, MC_CMD_NO_FLAGS, dflt_dpni->dpni_handle, &dflt_dpni->buf_layout); if (err) { printf("dpni_set_tx_conf_buffer_layout() failed"); goto err_buf_layout; } /* Now that we've set our tx buffer layout, retrieve the minimum * required tx data offset. */ err = dpni_get_tx_data_offset(dflt_mc_io, MC_CMD_NO_FLAGS, dflt_dpni->dpni_handle, &priv->tx_data_offset); if (err) { printf("dpni_get_tx_data_offset() failed\n"); goto err_data_offset; } /* Warn in case TX data offset is not multiple of 64 bytes. */ WARN_ON(priv->tx_data_offset % 64); /* Accomodate SWA space. */ priv->tx_data_offset += LDPAA_ETH_SWA_SIZE; debug("priv->tx_data_offset=%d\n", priv->tx_data_offset); return 0; err_data_offset: err_buf_layout: err_get_attr: dpni_close(dflt_mc_io, MC_CMD_NO_FLAGS, dflt_dpni->dpni_handle); err_open: return err; }