Lines Matching full:sparx5
2 /* Microchip Sparx5 Switch driver
78 static int sparx5_get_dev2g5_status(struct sparx5 *sparx5, in sparx5_get_dev2g5_status() argument
87 value = spx5_rd(sparx5, DEV2G5_PCS1G_STICKY(portno)); in sparx5_get_dev2g5_status()
90 spx5_wr(value, sparx5, DEV2G5_PCS1G_STICKY(portno)); in sparx5_get_dev2g5_status()
93 value = spx5_rd(sparx5, DEV2G5_PCS1G_LINK_STATUS(portno)); in sparx5_get_dev2g5_status()
105 value = spx5_rd(sparx5, DEV2G5_PCS1G_ANEG_STATUS(portno)); in sparx5_get_dev2g5_status()
113 value = spx5_rd(sparx5, DEV2G5_PCS1G_ANEG_CFG(portno)); in sparx5_get_dev2g5_status()
121 static int sparx5_get_sfi_status(struct sparx5 *sparx5, in sparx5_get_sfi_status() argument
135 dev = sparx5_to_high_dev(sparx5, portno); in sparx5_get_sfi_status()
136 tinst = sparx5_port_dev_index(sparx5, portno); in sparx5_get_sfi_status()
137 inst = spx5_inst_get(sparx5, dev, tinst); in sparx5_get_sfi_status()
160 int sparx5_get_port_status(struct sparx5 *sparx5, in sparx5_get_port_status() argument
175 return sparx5_get_dev2g5_status(sparx5, port, status); in sparx5_get_port_status()
179 return sparx5_get_sfi_status(sparx5, port, status); in sparx5_get_port_status()
212 static int sparx5_port_verify_speed(struct sparx5 *sparx5, in sparx5_port_verify_speed() argument
216 const struct sparx5_ops *ops = sparx5->data->ops; in sparx5_port_verify_speed()
275 static bool sparx5_dev_change(struct sparx5 *sparx5, in sparx5_dev_change() argument
283 static int sparx5_port_flush_poll(struct sparx5 *sparx5, u32 portno) in sparx5_port_flush_poll() argument
302 value = spx5_rd(sparx5, in sparx5_port_flush_poll()
316 dev_err(sparx5->dev, in sparx5_port_flush_poll()
327 static int sparx5_port_disable(struct sparx5 *sparx5, struct sparx5_port *port, bool high_spd_dev) in sparx5_port_disable() argument
330 sparx5_port_dev_index(sparx5, port->portno) : port->portno; in sparx5_port_disable()
332 sparx5_to_high_dev(sparx5, port->portno) : TARGET_DEV2G5; in sparx5_port_disable()
333 void __iomem *devinst = spx5_inst_get(sparx5, dev, tinst); in sparx5_port_disable()
334 const struct sparx5_ops *ops = sparx5->data->ops; in sparx5_port_disable()
366 sparx5, in sparx5_port_disable()
372 sparx5, in sparx5_port_disable()
378 sparx5, in sparx5_port_disable()
394 sparx5, in sparx5_port_disable()
400 sparx5, in sparx5_port_disable()
404 err = sparx5_port_flush_poll(sparx5, port->portno); in sparx5_port_disable()
438 sparx5, in sparx5_port_disable()
442 u32 pcs = sparx5_to_pcs_dev(sparx5, port->portno); in sparx5_port_disable()
443 void __iomem *pcsinst = spx5_inst_get(sparx5, pcs, tinst); in sparx5_port_disable()
455 sparx5, in sparx5_port_disable()
461 sparx5, in sparx5_port_disable()
469 static int sparx5_port_fifo_sz(struct sparx5 *sparx5, in sparx5_port_fifo_sz() argument
472 u32 sys_clk = sparx5_clk_period(sparx5->coreclock); in sparx5_port_fifo_sz()
488 if (!is_sparx5(sparx5)) in sparx5_port_fifo_sz()
531 int sparx5_port_mux_set(struct sparx5 *sparx5, struct sparx5_port *port, in sparx5_port_mux_set() argument
545 sparx5, in sparx5_port_mux_set()
556 sparx5, in sparx5_port_mux_set()
566 static int sparx5_port_max_tags_set(struct sparx5 *sparx5, in sparx5_port_max_tags_set() argument
575 u32 dev = sparx5_to_high_dev(sparx5, port->portno); in sparx5_port_max_tags_set()
576 u32 tinst = sparx5_port_dev_index(sparx5, port->portno); in sparx5_port_max_tags_set()
577 void __iomem *inst = spx5_inst_get(sparx5, dev, tinst); in sparx5_port_max_tags_set()
578 const struct sparx5_ops *ops = sparx5->data->ops; in sparx5_port_max_tags_set()
590 sparx5, in sparx5_port_max_tags_set()
615 int sparx5_port_fwd_urg(struct sparx5 *sparx5, u32 speed) in sparx5_port_fwd_urg() argument
650 static int sparx5_port_fc_setup(struct sparx5 *sparx5, in sparx5_port_fc_setup() argument
664 sparx5, in sparx5_port_fc_setup()
670 sparx5, in sparx5_port_fc_setup()
676 sparx5, in sparx5_port_fc_setup()
682 sparx5, in sparx5_port_fc_setup()
696 int sparx5_serdes_set(struct sparx5 *sparx5, in sparx5_serdes_set() argument
742 static int sparx5_port_pcs_low_set(struct sparx5 *sparx5, in sparx5_port_pcs_low_set() argument
757 err = sparx5_serdes_set(sparx5, port, conf); in sparx5_port_pcs_low_set()
767 sparx5, in sparx5_port_pcs_low_set()
772 sparx5, in sparx5_port_pcs_low_set()
783 sparx5, in sparx5_port_pcs_low_set()
786 spx5_wr(0, sparx5, DEV2G5_PCS1G_ANEG_CFG(port->portno)); in sparx5_port_pcs_low_set()
796 sparx5, in sparx5_port_pcs_low_set()
802 static int sparx5_port_pcs_high_set(struct sparx5 *sparx5, in sparx5_port_pcs_high_set() argument
807 u32 pix = sparx5_port_dev_index(sparx5, port->portno); in sparx5_port_pcs_high_set()
808 u32 dev = sparx5_to_high_dev(sparx5, port->portno); in sparx5_port_pcs_high_set()
809 u32 pcs = sparx5_to_pcs_dev(sparx5, port->portno); in sparx5_port_pcs_high_set()
814 devinst = spx5_inst_get(sparx5, dev, pix); in sparx5_port_pcs_high_set()
815 pcsinst = spx5_inst_get(sparx5, pcs, pix); in sparx5_port_pcs_high_set()
818 err = sparx5_serdes_set(sparx5, port, conf); in sparx5_port_pcs_high_set()
825 sparx5, in sparx5_port_pcs_high_set()
859 static void sparx5_dev_switch(struct sparx5 *sparx5, int port, bool hsd) in sparx5_dev_switch() argument
861 const struct sparx5_ops *ops = sparx5->data->ops; in sparx5_dev_switch()
864 bt_indx = BIT(ops->get_port_dev_bit(sparx5, port)); in sparx5_dev_switch()
869 sparx5, in sparx5_dev_switch()
874 sparx5, in sparx5_dev_switch()
879 sparx5, in sparx5_dev_switch()
885 static int sparx5_port_config_low_set(struct sparx5 *sparx5, in sparx5_port_config_low_set() argument
904 sparx5, in sparx5_port_config_low_set()
911 sparx5, in sparx5_port_config_low_set()
917 sparx5, in sparx5_port_config_low_set()
923 sparx5, in sparx5_port_config_low_set()
933 sparx5, in sparx5_port_config_low_set()
937 if (!is_sparx5(sparx5)) { in sparx5_port_config_low_set()
946 sparx5, DEV2G5_PHAD_CTRL(port->portno, i)); in sparx5_port_config_low_set()
953 int sparx5_port_pcs_set(struct sparx5 *sparx5, in sparx5_port_pcs_set() argument
961 if (sparx5_dev_change(sparx5, port, conf)) { in sparx5_port_pcs_set()
963 sparx5_dev_switch(sparx5, port->portno, high_speed_dev); in sparx5_port_pcs_set()
966 err = sparx5_port_disable(sparx5, port, !high_speed_dev); in sparx5_port_pcs_set()
971 err = sparx5_port_disable(sparx5, port, high_speed_dev); in sparx5_port_pcs_set()
976 err = sparx5_port_pcs_high_set(sparx5, port, conf); in sparx5_port_pcs_set()
978 err = sparx5_port_pcs_low_set(sparx5, port, conf); in sparx5_port_pcs_set()
987 sparx5, in sparx5_port_pcs_set()
993 sparx5, in sparx5_port_pcs_set()
1002 int sparx5_port_config(struct sparx5 *sparx5, in sparx5_port_config() argument
1008 const struct sparx5_ops *ops = sparx5->data->ops; in sparx5_port_config()
1011 err = sparx5_port_verify_speed(sparx5, port, conf); in sparx5_port_config()
1023 sparx5_port_config_low_set(sparx5, port, conf); in sparx5_port_config()
1026 err = sparx5_port_fc_setup(sparx5, port, conf); in sparx5_port_config()
1030 if (!is_sparx5(sparx5) && ops->is_port_10g(port->portno) && in sparx5_port_config()
1034 sparx5, in sparx5_port_config()
1038 stop_wm = sparx5_port_fifo_sz(sparx5, port->portno, conf->speed); in sparx5_port_config()
1041 sparx5, in sparx5_port_config()
1045 urgency = sparx5_port_fwd_urg(sparx5, conf->speed); in sparx5_port_config()
1050 sparx5, in sparx5_port_config()
1060 int sparx5_port_init(struct sparx5 *sparx5, in sparx5_port_init() argument
1066 const struct sparx5_ops *ops = sparx5->data->ops; in sparx5_port_init()
1067 u32 devhigh = sparx5_to_high_dev(sparx5, port->portno); in sparx5_port_init()
1068 u32 pix = sparx5_port_dev_index(sparx5, port->portno); in sparx5_port_init()
1069 u32 pcs = sparx5_to_pcs_dev(sparx5, port->portno); in sparx5_port_init()
1078 devinst = spx5_inst_get(sparx5, devhigh, pix); in sparx5_port_init()
1079 pcsinst = spx5_inst_get(sparx5, pcs, pix); in sparx5_port_init()
1082 err = ops->set_port_mux(sparx5, port, conf); in sparx5_port_init()
1093 sparx5, in sparx5_port_init()
1098 sparx5, in sparx5_port_init()
1102 spx5_wr(PAUSE_DISCARD, sparx5, ANA_CL_CAPTURE_BPDU_CFG(port->portno)); in sparx5_port_init()
1107 sparx5, ANA_CL_FILTER_CTRL(port->portno)); in sparx5_port_init()
1113 err = sparx5_port_max_tags_set(sparx5, port); in sparx5_port_init()
1120 sparx5, in sparx5_port_init()
1127 sparx5, in sparx5_port_init()
1132 err = sparx5_serdes_set(sparx5, port, conf); in sparx5_port_init()
1140 sparx5, in sparx5_port_init()
1143 sparx5_dev_switch(sparx5, port->portno, false); in sparx5_port_init()
1149 sparx5, in sparx5_port_init()
1156 sparx5, in sparx5_port_init()
1167 sparx5_dev_switch(sparx5, port->portno, true); in sparx5_port_init()
1187 sparx5, in sparx5_port_init()
1191 if (!is_sparx5(sparx5)) { in sparx5_port_init()
1196 dev = sparx5_to_high_dev(sparx5, port->portno); in sparx5_port_init()
1197 tinst = sparx5_port_dev_index(sparx5, port->portno); in sparx5_port_init()
1198 inst = spx5_inst_get(sparx5, dev, tinst); in sparx5_port_init()
1203 dev = sparx5_to_high_dev(sparx5, port->portno); in sparx5_port_init()
1204 tinst = sparx5_port_dev_index(sparx5, port->portno); in sparx5_port_init()
1205 inst = spx5_inst_get(sparx5, dev, tinst); in sparx5_port_init()
1217 struct sparx5 *sparx5 = port->sparx5; in sparx5_port_enable() local
1222 sparx5, in sparx5_port_enable()
1242 struct sparx5 *sparx5 = port->sparx5; in sparx5_port_qos_pcp_rewr_set() local
1255 port->sparx5, REW_TAG_CTRL(port->portno)); in sparx5_port_qos_pcp_rewr_set()
1274 REW_PCP_MAP_DE1_PCP_DE1, sparx5, in sparx5_port_qos_pcp_rewr_set()
1278 REW_DEI_MAP_DE1_DEI_DE1, port->sparx5, in sparx5_port_qos_pcp_rewr_set()
1282 REW_PCP_MAP_DE0_PCP_DE0, sparx5, in sparx5_port_qos_pcp_rewr_set()
1286 REW_DEI_MAP_DE0_DEI_DE0, port->sparx5, in sparx5_port_qos_pcp_rewr_set()
1297 struct sparx5 *sparx5 = port->sparx5; in sparx5_port_qos_pcp_set() local
1306 sparx5, ANA_CL_QOS_CFG(port->portno)); in sparx5_port_qos_pcp_set()
1315 ANA_CL_PCP_DEI_MAP_CFG_PCP_DEI_DP_VAL, sparx5, in sparx5_port_qos_pcp_set()
1326 ANA_CL_QOS_CFG_DSCP_REWR_MODE_SEL, port->sparx5, in sparx5_port_qos_dscp_rewr_mode_set()
1333 struct sparx5 *sparx5 = port->sparx5; in sparx5_port_qos_dscp_rewr_set() local
1345 REW_DSCP_MAP_DSCP_UPDATE_ENA, sparx5, in sparx5_port_qos_dscp_rewr_set()
1354 ANA_CL_QOS_MAP_CFG_DSCP_REWR_VAL, sparx5, in sparx5_port_qos_dscp_rewr_set()
1364 struct sparx5 *sparx5 = port->sparx5; in sparx5_port_qos_dscp_set() local
1375 ANA_CL_QOS_CFG_DSCP_KEEP_ENA, sparx5, in sparx5_port_qos_dscp_set()
1383 ANA_CL_DSCP_CFG_DSCP_DP_VAL, sparx5, in sparx5_port_qos_dscp_set()
1391 ANA_CL_DSCP_CFG_DSCP_TRUST_ENA, sparx5, in sparx5_port_qos_dscp_set()
1402 struct sparx5 *sparx5 = port->sparx5; in sparx5_port_qos_default_set() local
1409 sparx5, ANA_CL_QOS_CFG(port->portno)); in sparx5_port_qos_default_set()
1416 sparx5, ANA_CL_VLAN_CTRL(port->portno)); in sparx5_port_qos_default_set()
1421 int sparx5_get_internal_port(struct sparx5 *sparx5, int port) in sparx5_get_internal_port() argument
1423 return sparx5->data->consts->n_ports + port; in sparx5_get_internal_port()