static void hss_start_hdlc(struct port *port) { struct msg msg; memset(&msg, 0, sizeof(msg)); msg.cmd = PKT_PIPE_FLOW_ENABLE; msg.hss_port = port->id; msg.data32 = 0; hss_npe_send(port, &msg, "HSS_ENABLE_PKT_PIPE"); }
static void hss_stop_hdlc(struct port *port) { struct msg msg; memset(&msg, 0, sizeof(msg)); msg.cmd = PKT_PIPE_FLOW_DISABLE; msg.hss_port = port->id; hss_npe_send(port, &msg, "HSS_DISABLE_PKT_PIPE"); hss_get_status(port); }
static void hss_set_hdlc_cfg(struct port *port) { struct msg msg; memset(&msg, 0, sizeof(msg)); msg.cmd = PKT_PIPE_HDLC_CFG_WRITE; msg.hss_port = port->id; msg.data8a = port->hdlc_cfg; msg.data8b = port->hdlc_cfg | (PKT_EXTRA_FLAGS << 3); hss_npe_send(port, &msg, "HSS_SET_HDLC_CFG"); }
static int hss_load_firmware(struct port *port) { struct msg msg; int err; if (port->initialized) return 0; if (!npe_running(port->npe) && (err = npe_load_firmware(port->npe, npe_name(port->npe), port->dev))) return err; memset(&msg, 0, sizeof(msg)); msg.cmd = PKT_NUM_PIPES_WRITE; msg.hss_port = port->id; msg.data8a = PKT_NUM_PIPES; hss_npe_send(port, &msg, "HSS_SET_PKT_PIPES"); msg.cmd = PKT_PIPE_FIFO_SIZEW_WRITE; msg.data8a = PKT_PIPE_FIFO_SIZEW; hss_npe_send(port, &msg, "HSS_SET_PKT_FIFO"); msg.cmd = PKT_PIPE_MODE_WRITE; msg.data8a = NPE_PKT_MODE_HDLC; hss_npe_send(port, &msg, "HSS_SET_PKT_MODE"); msg.cmd = PKT_PIPE_RX_SIZE_WRITE; msg.data16a = HDLC_MAX_MRU; hss_npe_send(port, &msg, "HSS_SET_PKT_RX_SIZE"); msg.cmd = PKT_PIPE_IDLE_PATTERN_WRITE; msg.data32 = 0x7F7F7F7F; hss_npe_send(port, &msg, "HSS_SET_PKT_IDLE"); port->initialized = 1; return 0; }
static void hss_config_set_lut(struct port *port) { struct msg msg; int ch; memset(&msg, 0, sizeof(msg)); msg.cmd = PORT_CONFIG_WRITE; msg.hss_port = port->id; for (ch = 0; ch < MAX_CHANNELS; ch++) { msg.data32 >>= 2; msg.data32 |= TDMMAP_HDLC << 30; if (ch % 16 == 15) { msg.index = HSS_CONFIG_TX_LUT + ((ch / 4) & ~3); hss_npe_send(port, &msg, "HSS_SET_TX_LUT"); msg.index += HSS_CONFIG_RX_LUT - HSS_CONFIG_TX_LUT; hss_npe_send(port, &msg, "HSS_SET_RX_LUT"); } } }
static u32 hss_get_status(struct port *port) { struct msg msg; memset(&msg, 0, sizeof(msg)); msg.cmd = PORT_ERROR_READ; msg.hss_port = port->id; hss_npe_send(port, &msg, "PORT_ERROR_READ"); if (npe_recv_message(port->npe, &msg, "PORT_ERROR_READ")) { pr_crit("HSS-%i: unable to read HSS status\n", port->id); BUG(); } return msg.data32; }
static void hss_config(struct port *port) { struct msg msg; memset(&msg, 0, sizeof(msg)); msg.cmd = PORT_CONFIG_WRITE; msg.hss_port = port->id; msg.index = HSS_CONFIG_TX_PCR; msg.data32 = PCR_FRM_PULSE_DISABLED | PCR_MSB_ENDIAN | PCR_TX_DATA_ENABLE | PCR_SOF_NO_FBIT; if (port->clock_type == CLOCK_INT) msg.data32 |= PCR_SYNC_CLK_DIR_OUTPUT; hss_npe_send(port, &msg, "HSS_SET_TX_PCR"); msg.index = HSS_CONFIG_RX_PCR; msg.data32 ^= PCR_TX_DATA_ENABLE | PCR_DCLK_EDGE_RISING; hss_npe_send(port, &msg, "HSS_SET_RX_PCR"); memset(&msg, 0, sizeof(msg)); msg.cmd = PORT_CONFIG_WRITE; msg.hss_port = port->id; msg.index = HSS_CONFIG_CORE_CR; msg.data32 = (port->loopback ? CCR_LOOPBACK : 0) | (port->id ? CCR_SECOND_HSS : 0); hss_npe_send(port, &msg, "HSS_SET_CORE_CR"); memset(&msg, 0, sizeof(msg)); msg.cmd = PORT_CONFIG_WRITE; msg.hss_port = port->id; msg.index = HSS_CONFIG_CLOCK_CR; msg.data32 = port->clock_reg; hss_npe_send(port, &msg, "HSS_SET_CLOCK_CR"); memset(&msg, 0, sizeof(msg)); msg.cmd = PORT_CONFIG_WRITE; msg.hss_port = port->id; msg.index = HSS_CONFIG_TX_FCR; msg.data16a = FRAME_OFFSET; msg.data16b = FRAME_SIZE - 1; hss_npe_send(port, &msg, "HSS_SET_TX_FCR"); memset(&msg, 0, sizeof(msg)); msg.cmd = PORT_CONFIG_WRITE; msg.hss_port = port->id; msg.index = HSS_CONFIG_RX_FCR; msg.data16a = FRAME_OFFSET; msg.data16b = FRAME_SIZE - 1; hss_npe_send(port, &msg, "HSS_SET_RX_FCR"); hss_config_set_lut(port); memset(&msg, 0, sizeof(msg)); msg.cmd = PORT_CONFIG_LOAD; msg.hss_port = port->id; hss_npe_send(port, &msg, "HSS_LOAD_CONFIG"); if (npe_recv_message(port->npe, &msg, "HSS_LOAD_CONFIG") || msg.cmd != PORT_CONFIG_LOAD || msg.data32) { pr_crit("HSS-%i: HSS_LOAD_CONFIG failed\n", port->id); BUG(); } npe_recv_message(port->npe, &msg, "FLUSH_IT"); }
static void hss_config(struct port *port) { struct msg msg; memset(&msg, 0, sizeof(msg)); msg.cmd = PORT_CONFIG_WRITE; msg.hss_port = port->id; msg.index = HSS_CONFIG_TX_PCR; msg.data32 = PCR_FRM_SYNC_OUTPUT_RISING | PCR_MSB_ENDIAN | PCR_TX_DATA_ENABLE | PCR_SOF_NO_FBIT; if (port->clock_type == CLOCK_INT) msg.data32 |= PCR_SYNC_CLK_DIR_OUTPUT; hss_npe_send(port, &msg, "HSS_SET_TX_PCR"); msg.index = HSS_CONFIG_RX_PCR; msg.data32 ^= PCR_TX_DATA_ENABLE | PCR_DCLK_EDGE_RISING; hss_npe_send(port, &msg, "HSS_SET_RX_PCR"); memset(&msg, 0, sizeof(msg)); msg.cmd = PORT_CONFIG_WRITE; msg.hss_port = port->id; msg.index = HSS_CONFIG_CORE_CR; msg.data32 = (port->loopback ? CCR_LOOPBACK : 0) | (port->id ? CCR_SECOND_HSS : 0); hss_npe_send(port, &msg, "HSS_SET_CORE_CR"); memset(&msg, 0, sizeof(msg)); msg.cmd = PORT_CONFIG_WRITE; msg.hss_port = port->id; msg.index = HSS_CONFIG_CLOCK_CR; msg.data32 = CLK42X_SPEED_2048KHZ /* FIXME */; hss_npe_send(port, &msg, "HSS_SET_CLOCK_CR"); memset(&msg, 0, sizeof(msg)); msg.cmd = PORT_CONFIG_WRITE; msg.hss_port = port->id; msg.index = HSS_CONFIG_TX_FCR; msg.data16a = FRAME_OFFSET; msg.data16b = FRAME_SIZE - 1; hss_npe_send(port, &msg, "HSS_SET_TX_FCR"); memset(&msg, 0, sizeof(msg)); msg.cmd = PORT_CONFIG_WRITE; msg.hss_port = port->id; msg.index = HSS_CONFIG_RX_FCR; msg.data16a = FRAME_OFFSET; msg.data16b = FRAME_SIZE - 1; hss_npe_send(port, &msg, "HSS_SET_RX_FCR"); hss_config_set_lut(port); memset(&msg, 0, sizeof(msg)); msg.cmd = PORT_CONFIG_LOAD; msg.hss_port = port->id; hss_npe_send(port, &msg, "HSS_LOAD_CONFIG"); if (npe_recv_message(port->npe, &msg, "HSS_LOAD_CONFIG") || /* HSS_LOAD_CONFIG for port #1 returns port_id = #4 */ msg.cmd != PORT_CONFIG_LOAD || msg.data32) { printk(KERN_CRIT "HSS-%i: HSS_LOAD_CONFIG failed\n", port->id); BUG(); } /* HDLC may stop working without this - check FIXME */ npe_recv_message(port->npe, &msg, "FLUSH_IT"); }