diff options
-rw-r--r-- | src/osmo-bts-octphy/octphy_hw_api.c | 51 | ||||
-rw-r--r-- | src/osmo-bts-octphy/octphy_hw_api.h | 44 | ||||
-rw-r--r-- | src/osmo-bts-octphy/octphy_vty.c | 89 |
3 files changed, 139 insertions, 45 deletions
diff --git a/src/osmo-bts-octphy/octphy_hw_api.c b/src/osmo-bts-octphy/octphy_hw_api.c index dc23676c..6666f77c 100644 --- a/src/osmo-bts-octphy/octphy_hw_api.c +++ b/src/osmo-bts-octphy/octphy_hw_api.c @@ -29,6 +29,7 @@ #include "l1_if.h" #include "l1_oml.h" #include "l1_utils.h" +#include "octphy_hw_api.h" #include <octphy/octvc1/octvc1_rc2string.h> #include <octphy/octvc1/hw/octvc1_hw_api.h> @@ -105,18 +106,12 @@ int octphy_hw_get_rf_port_info(struct octphy_hdl *fl1h, uint32_t index) return l1if_req_compl(fl1h, msg, rf_port_info_compl_cb, NULL); } -static const struct value_string radio_std_vals[] = { - { cOCTVC1_RADIO_STANDARD_ENUM_GSM, "GSM" }, - { cOCTVC1_RADIO_STANDARD_ENUM_UMTS, "UMTS" }, - { cOCTVC1_RADIO_STANDARD_ENUM_LTE, "LTE" }, - { cOCTVC1_RADIO_STANDARD_ENUM_INVALID, "INVALID" }, - { 0, NULL } -}; - /* Chapter 12.10 */ static int rf_port_stats_compl_cb(struct octphy_hdl *fl1, struct msgb *resp, void *data) { + struct octphy_hw_get_cb_data *get_cb_data; + tOCTVC1_HW_MSG_RF_PORT_STATS_RSP *psr = (tOCTVC1_HW_MSG_RF_PORT_STATS_RSP *) resp->l2h; @@ -136,12 +131,16 @@ static int rf_port_stats_compl_cb(struct octphy_hdl *fl1, struct msgb *resp, psr->TxStats.ulTxAveragePeriodUs, psr->TxStats.ulFrequencyKhz); + get_cb_data = (struct octphy_hw_get_cb_data*) data; + get_cb_data->cb(resp,get_cb_data->data); + msgb_free(resp); return 0; } /* Chapter 12.10 */ -int octphy_hw_get_rf_port_stats(struct octphy_hdl *fl1h, uint32_t index) +int octphy_hw_get_rf_port_stats(struct octphy_hdl *fl1h, uint32_t index, + struct octphy_hw_get_cb_data *cb_data) { struct msgb *msg = l1p_msgb_alloc(); tOCTVC1_HW_MSG_RF_PORT_STATS_CMD *psc; @@ -156,7 +155,7 @@ int octphy_hw_get_rf_port_stats(struct octphy_hdl *fl1h, uint32_t index) mOCTVC1_HW_MSG_RF_PORT_STATS_CMD_SWAP(psc); - return l1if_req_compl(fl1h, msg, rf_port_stats_compl_cb, NULL); + return l1if_req_compl(fl1h, msg, rf_port_stats_compl_cb, cb_data); } static const struct value_string rx_gain_mode_vals[] = { @@ -276,28 +275,6 @@ static const struct value_string clocksync_source_state_vals[] = { { 0, NULL } }; -static const struct value_string clocksync_state_vals[] = { - { cOCTVC1_HW_CLOCK_SYNC_MGR_STATE_ENUM_UNINITIALIZE, - "Uninitialized" }, -/* Note: Octasic renamed cOCTVC1_HW_CLOCK_SYNC_MGR_STATE_ENUM_UNUSED to - * cOCTVC1_HW_CLOCK_SYNC_MGR_STATE_ENUM_IDLE. The following ifdef - * statement ensures that older headers still work. */ -#ifdef cOCTVC1_HW_CLOCK_SYNC_MGR_STATE_ENUM_UNUSED - { cOCTVC1_HW_CLOCK_SYNC_MGR_STATE_ENUM_UNUSED, "Unused" }, -#else - { cOCTVC1_HW_CLOCK_SYNC_MGR_STATE_ENUM_IDLE, "Idle" }, -#endif - { cOCTVC1_HW_CLOCK_SYNC_MGR_STATE_ENUM_NO_EXT_CLOCK, - "No External Clock" }, - { cOCTVC1_HW_CLOCK_SYNC_MGR_STATE_ENUM_LOCKED, "Locked" }, - { cOCTVC1_HW_CLOCK_SYNC_MGR_STATE_ENUM_UNLOCKED,"Unlocked" }, - { cOCTVC1_HW_CLOCK_SYNC_MGR_STATE_ENUM_ERROR, "Error" }, - { cOCTVC1_HW_CLOCK_SYNC_MGR_STATE_ENUM_DISABLE, "Disabled" }, - { cOCTVC1_HW_CLOCK_SYNC_MGR_STATE_ENUM_LOSS_EXT_CLOCK, - "Loss of Ext Clock" }, - { 0, NULL } -}; - /* Chapter 12.15 */ static int get_clock_sync_compl_cb(struct octphy_hdl *fl1, struct msgb *resp, void *data) @@ -336,6 +313,8 @@ int octphy_hw_get_clock_sync_info(struct octphy_hdl *fl1h) static int get_clock_sync_stats_cb(struct octphy_hdl *fl1, struct msgb *resp, void *data) { + struct octphy_hw_get_cb_data *get_cb_data; + tOCTVC1_HW_MSG_CLOCK_SYNC_MGR_STATS_RSP *csr = (tOCTVC1_HW_MSG_CLOCK_SYNC_MGR_STATS_RSP *) resp->l2h; @@ -349,12 +328,16 @@ static int get_clock_sync_stats_cb(struct octphy_hdl *fl1, struct msgb *resp, csr->ulPllFractionalFreqHz, csr->ulSlipCnt, csr->ulSyncLosseCnt, csr->ulSourceState, csr->ulDacValue); + get_cb_data = (struct octphy_hw_get_cb_data*) data; + get_cb_data->cb(resp,get_cb_data->data); + msgb_free(resp); return 0; } /* Chapter 12.16 */ -int octphy_hw_get_clock_sync_stats(struct octphy_hdl *fl1h) +int octphy_hw_get_clock_sync_stats(struct octphy_hdl *fl1h, + struct octphy_hw_get_cb_data *cb_data) { struct msgb *msg = l1p_msgb_alloc(); tOCTVC1_HW_MSG_CLOCK_SYNC_MGR_STATS_CMD *csc; @@ -366,6 +349,6 @@ int octphy_hw_get_clock_sync_stats(struct octphy_hdl *fl1h) mOCTVC1_HW_MSG_CLOCK_SYNC_MGR_STATS_CMD_SWAP(csc); - return l1if_req_compl(fl1h, msg, get_clock_sync_stats_cb, NULL); + return l1if_req_compl(fl1h, msg, get_clock_sync_stats_cb, cb_data); } diff --git a/src/osmo-bts-octphy/octphy_hw_api.h b/src/osmo-bts-octphy/octphy_hw_api.h index bc8ab68d..78b72086 100644 --- a/src/osmo-bts-octphy/octphy_hw_api.h +++ b/src/osmo-bts-octphy/octphy_hw_api.h @@ -2,13 +2,53 @@ #include <stdint.h> #include "l1_if.h" +#include <octphy/octvc1/hw/octvc1_hw_api.h> + +static const struct value_string radio_std_vals[] = { + { cOCTVC1_RADIO_STANDARD_ENUM_GSM, "GSM" }, + { cOCTVC1_RADIO_STANDARD_ENUM_UMTS, "UMTS" }, + { cOCTVC1_RADIO_STANDARD_ENUM_LTE, "LTE" }, + { cOCTVC1_RADIO_STANDARD_ENUM_INVALID, "INVALID" }, + { 0, NULL } +}; + +static const struct value_string clocksync_state_vals[] = { + { cOCTVC1_HW_CLOCK_SYNC_MGR_STATE_ENUM_UNINITIALIZE, + "Uninitialized" }, +/* Note: Octasic renamed cOCTVC1_HW_CLOCK_SYNC_MGR_STATE_ENUM_UNUSED to + * cOCTVC1_HW_CLOCK_SYNC_MGR_STATE_ENUM_IDLE. The following ifdef + * statement ensures that older headers still work. */ +#ifdef cOCTVC1_HW_CLOCK_SYNC_MGR_STATE_ENUM_UNUSED + { cOCTVC1_HW_CLOCK_SYNC_MGR_STATE_ENUM_UNUSED, "Unused" }, +#else + { cOCTVC1_HW_CLOCK_SYNC_MGR_STATE_ENUM_IDLE, "Idle" }, +#endif + { cOCTVC1_HW_CLOCK_SYNC_MGR_STATE_ENUM_NO_EXT_CLOCK, + "No External Clock" }, + { cOCTVC1_HW_CLOCK_SYNC_MGR_STATE_ENUM_LOCKED, "Locked" }, + { cOCTVC1_HW_CLOCK_SYNC_MGR_STATE_ENUM_UNLOCKED,"Unlocked" }, + { cOCTVC1_HW_CLOCK_SYNC_MGR_STATE_ENUM_ERROR, "Error" }, + { cOCTVC1_HW_CLOCK_SYNC_MGR_STATE_ENUM_DISABLE, "Disabled" }, + { cOCTVC1_HW_CLOCK_SYNC_MGR_STATE_ENUM_LOSS_EXT_CLOCK, + "Loss of Ext Clock" }, + { 0, NULL } +}; + +typedef void octphy_hw_get_cb(struct msgb *resp, void *data); + +struct octphy_hw_get_cb_data { + octphy_hw_get_cb* cb; + void *data; +}; int octphy_hw_get_pcb_info(struct octphy_hdl *fl1h); int octphy_hw_get_rf_port_info(struct octphy_hdl *fl1h, uint32_t index); -int octphy_hw_get_rf_port_stats(struct octphy_hdl *fl1h, uint32_t index); +int octphy_hw_get_rf_port_stats(struct octphy_hdl *fl1h, uint32_t index, + struct octphy_hw_get_cb_data *cb_data); int octphy_hw_get_rf_ant_rx_config(struct octphy_hdl *fl1h, uint32_t port_idx, uint32_t ant_idx); int octphy_hw_get_rf_ant_tx_config(struct octphy_hdl *fl1h, uint32_t port_idx, uint32_t ant_idx); int octphy_hw_get_clock_sync_info(struct octphy_hdl *fl1h); -int octphy_hw_get_clock_sync_stats(struct octphy_hdl *fl1h); +int octphy_hw_get_clock_sync_stats(struct octphy_hdl *fl1h, + struct octphy_hw_get_cb_data *cb_data); diff --git a/src/osmo-bts-octphy/octphy_vty.c b/src/osmo-bts-octphy/octphy_vty.c index abfac1ed..bc4acd65 100644 --- a/src/osmo-bts-octphy/octphy_vty.c +++ b/src/osmo-bts-octphy/octphy_vty.c @@ -159,6 +159,45 @@ DEFUN(cfg_phy_tx_atten_db, cfg_phy_tx_atten_db_cmd, return CMD_SUCCESS; } +void show_rf_port_stats_cb(struct msgb *resp, void *data) +{ + struct vty *vty = (struct vty*) data; + tOCTVC1_HW_MSG_RF_PORT_STATS_RSP *psr; + + if (sizeof(tOCTVC1_HW_MSG_RF_PORT_STATS_RSP) != msgb_l2len(resp)) { + vty_out(vty, + "invalid msgb size (%d bytes, expected %zu bytes)%s", + msgb_l2len(resp), + sizeof(tOCTVC1_HW_MSG_RF_PORT_STATS_RSP), VTY_NEWLINE); + return; + } + + psr = (tOCTVC1_HW_MSG_RF_PORT_STATS_RSP *) msgb_l2(resp); + + vty_out(vty, "%s", VTY_NEWLINE); + vty_out(vty, "RF-PORT-STATS:%s", VTY_NEWLINE); + vty_out(vty, "Idx=%d%s", psr->ulPortIndex, VTY_NEWLINE); + vty_out(vty, "RadioStandard=%s%s", + get_value_string(radio_std_vals, psr->ulRadioStandard), + VTY_NEWLINE); + vty_out(vty, "Rx Bytes=%u%s", psr->RxStats.ulRxByteCnt, VTY_NEWLINE); + vty_out(vty, "Rx Overflow=%u%s", psr->RxStats.ulRxOverflowCnt, + VTY_NEWLINE); + vty_out(vty, "Rx AvgBps=%u%s", psr->RxStats.ulRxAverageBytePerSecond, + VTY_NEWLINE); + vty_out(vty, "Rx Period=%u%s", psr->RxStats.ulRxAveragePeriodUs, + VTY_NEWLINE); + vty_out(vty, "Rx Freq=%u%s", psr->RxStats.ulFrequencyKhz, VTY_NEWLINE); + vty_out(vty, "Tx Bytes=%u%s", psr->TxStats.ulTxByteCnt, VTY_NEWLINE); + vty_out(vty, "Tx Underflow=%u%s", psr->TxStats.ulTxUnderflowCnt, + VTY_NEWLINE); + vty_out(vty, "Tx AvgBps=%u%s", psr->TxStats.ulTxAverageBytePerSecond, + VTY_NEWLINE); + vty_out(vty, "Tx Period=%u%s", psr->TxStats.ulTxAveragePeriodUs, + VTY_NEWLINE); + vty_out(vty, "Tx Freq=%u%s", psr->TxStats.ulFrequencyKhz, VTY_NEWLINE); +} + DEFUN(show_rf_port_stats, show_rf_port_stats_cmd, "show phy <0-255> rf-port-stats <0-1>", "Show statistics for the RF Port\n" @@ -166,29 +205,61 @@ DEFUN(show_rf_port_stats, show_rf_port_stats_cmd, { int phy_nr = atoi(argv[0]); struct phy_link *plink = phy_link_by_num(phy_nr); + static struct octphy_hw_get_cb_data cb_data; - octphy_hw_get_rf_port_stats(plink->u.octphy.hdl, atoi(argv[1])); + cb_data.cb = show_rf_port_stats_cb; + cb_data.data = vty; - /* FIXME: Actually print to VTY, not just log */ - vty_out(vty, "Please check the log file for the response%s", - VTY_NEWLINE); + octphy_hw_get_rf_port_stats(plink->u.octphy.hdl, atoi(argv[1]), + &cb_data); return CMD_SUCCESS; } +void show_clk_sync_stats_cb(struct msgb *resp, void *data) +{ + struct vty *vty = (struct vty*) data; + tOCTVC1_HW_MSG_CLOCK_SYNC_MGR_STATS_RSP *csr; + + if (sizeof(tOCTVC1_HW_MSG_CLOCK_SYNC_MGR_STATS_RSP) != + msgb_l2len(resp)) { + vty_out(vty, + "invalid msgb size (%d bytes, expected %zu bytes)%s", + msgb_l2len(resp), + sizeof(tOCTVC1_HW_MSG_CLOCK_SYNC_MGR_STATS_RSP), + VTY_NEWLINE); + return; + } + + csr = (tOCTVC1_HW_MSG_CLOCK_SYNC_MGR_STATS_RSP *) msgb_l2(resp); + + vty_out(vty, "%s", VTY_NEWLINE); + vty_out(vty, "CLOCK-SYNC-MGR-STATS:%s", VTY_NEWLINE); + vty_out(vty, "State=%s%s", + get_value_string(clocksync_state_vals, csr->ulState), + VTY_NEWLINE); + vty_out(vty, "ClockError=%d%s", csr->lClockError, VTY_NEWLINE); + vty_out(vty, "DroppedCycles=%d%s", csr->lDroppedCycles, VTY_NEWLINE); + vty_out(vty, "PllFreqHz=%u%s", csr->ulPllFreqHz, VTY_NEWLINE); + vty_out(vty, "PllFract=%u%s", csr->ulPllFractionalFreqHz, VTY_NEWLINE); + vty_out(vty, "SlipCnt=%u%s", csr->ulSlipCnt, VTY_NEWLINE); + vty_out(vty, "SyncLosses=%u%s", csr->ulSyncLosseCnt, VTY_NEWLINE); + vty_out(vty, "SourceState=%u%s", csr->ulSourceState, VTY_NEWLINE); + vty_out(vty, "DacValue=%u%s", csr->ulDacValue, VTY_NEWLINE); +} + DEFUN(show_clk_sync_stats, show_clk_sync_stats_cmd, "show phy <0-255> clk-sync-stats", "Obtain statistics for the Clock Sync Manager\n") { int phy_nr = atoi(argv[0]); struct phy_link *plink = phy_link_by_num(phy_nr); + static struct octphy_hw_get_cb_data cb_data; - octphy_hw_get_clock_sync_stats(plink->u.octphy.hdl); - - /* FIXME: Actually print to VTY, not just log */ - vty_out(vty, "Please check the log file for the response%s", - VTY_NEWLINE); + cb_data.cb = show_clk_sync_stats_cb; + cb_data.data = vty; + octphy_hw_get_clock_sync_stats(plink->u.octphy.hdl, &cb_data); return CMD_SUCCESS; } |