[PATCH v2 net-next 1/3] net: dsa: mediatek: add VLAN support for MT7530

kbuild test robot lkp at intel.com
Fri Dec 15 09:37:57 PST 2017


Hi Sean,

I love your patch! Perhaps something to improve:

[auto build test WARNING on net-next/master]

url:    https://github.com/0day-ci/linux/commits/sean-wang-mediatek-com/add-VLAN-support-to-DSA-MT7530/20171215-214450
config: x86_64-randconfig-g0-12151942 (attached as .config)
compiler: gcc-4.9 (Debian 4.9.4-2) 4.9.4
reproduce:
        # save the attached .config to linux build tree
        make ARCH=x86_64 

All warnings (new ones prefixed by >>):

   drivers/net/dsa/mt7530.c: In function 'mt7530_port_vlan_add':
   drivers/net/dsa/mt7530.c:1131:6: warning: unused variable 'ret' [-Wunused-variable]
     int ret;
         ^
   drivers/net/dsa/mt7530.c: At top level:
>> drivers/net/dsa/mt7530.c:1324:2: warning: initialization from incompatible pointer type
     .port_vlan_prepare = mt7530_port_vlan_prepare,
     ^
   drivers/net/dsa/mt7530.c:1324:2: warning: (near initialization for 'mt7530_switch_ops.port_vlan_prepare')
   drivers/net/dsa/mt7530.c:1325:2: warning: initialization from incompatible pointer type
     .port_vlan_add  = mt7530_port_vlan_add,
     ^
   drivers/net/dsa/mt7530.c:1325:2: warning: (near initialization for 'mt7530_switch_ops.port_vlan_add')
   Cyclomatic Complexity 3 include/linux/string.h:strncpy
   Cyclomatic Complexity 1 include/linux/err.h:ERR_PTR
   Cyclomatic Complexity 1 include/linux/err.h:PTR_ERR
   Cyclomatic Complexity 1 include/linux/err.h:IS_ERR
   Cyclomatic Complexity 3 include/linux/ktime.h:ktime_compare
   Cyclomatic Complexity 1 include/linux/ktime.h:ktime_add_us
   Cyclomatic Complexity 1 include/linux/device.h:devm_kzalloc
   Cyclomatic Complexity 1 include/linux/device.h:dev_get_drvdata
   Cyclomatic Complexity 1 include/linux/device.h:dev_set_drvdata
   Cyclomatic Complexity 5 include/linux/mii.h:mii_resolve_flowctrl_fdx
   Cyclomatic Complexity 1 include/linux/of.h:of_property_read_bool
   Cyclomatic Complexity 1 include/linux/phy.h:phy_is_pseudo_fixed_link
   Cyclomatic Complexity 1 include/linux/reset.h:reset_control_assert
   Cyclomatic Complexity 1 include/linux/reset.h:reset_control_deassert
   Cyclomatic Complexity 2 include/linux/reset.h:__devm_reset_control_get
   Cyclomatic Complexity 2 include/linux/reset.h:devm_reset_control_get_exclusive
   Cyclomatic Complexity 1 include/linux/reset.h:devm_reset_control_get
   Cyclomatic Complexity 1 include/net/dsa.h:dsa_to_port
   Cyclomatic Complexity 1 include/net/dsa.h:dsa_is_cpu_port
   Cyclomatic Complexity 1 include/net/dsa.h:dsa_is_user_port
   Cyclomatic Complexity 3 include/net/dsa.h:dsa_user_ports
   Cyclomatic Complexity 1 drivers/net/dsa/mt7530.h:mt7530_hw_vlan_entry_init
   Cyclomatic Complexity 1 drivers/net/dsa/mt7530.h:INIT_MT7530_DUMMY_POLL
   Cyclomatic Complexity 2 drivers/net/dsa/mt7530.c:mt7530_get_strings
   Cyclomatic Complexity 1 drivers/net/dsa/mt7530.c:mt7530_get_sset_count
   Cyclomatic Complexity 1 drivers/net/dsa/mt7530.c:mt7530_port_vlan_prepare
   Cyclomatic Complexity 1 drivers/net/dsa/mt7530.c:mdio_module_init
   Cyclomatic Complexity 2 drivers/net/dsa/mt7530.c:mt7530_mii_read
   Cyclomatic Complexity 4 drivers/net/dsa/mt7530.c:mt7530_mii_write
   Cyclomatic Complexity 4 drivers/net/dsa/mt7530.c:core_read_mmd_indirect
   Cyclomatic Complexity 5 drivers/net/dsa/mt7530.c:core_write_mmd_indirect
   Cyclomatic Complexity 3 drivers/net/dsa/mt7530.c:mt7530_remove
   Cyclomatic Complexity 9 drivers/net/dsa/mt7530.c:mt7530_probe
   Cyclomatic Complexity 1 drivers/net/dsa/mt7530.c:_mt7530_read
   Cyclomatic Complexity 1 drivers/net/dsa/mt7530.c:mt7530_read
   Cyclomatic Complexity 2 drivers/net/dsa/mt7530.c:mt7530_fdb_read
   Cyclomatic Complexity 3 drivers/net/dsa/mt7530.c:mt7530_get_ethtool_stats
   Cyclomatic Complexity 1 drivers/net/dsa/mt7530.c:mt7530_write
   Cyclomatic Complexity 2 drivers/net/dsa/mt7530.c:mt7530_fdb_write
   Cyclomatic Complexity 3 drivers/net/dsa/mt7530.c:mt7530_hw_vlan_del
   Cyclomatic Complexity 1 drivers/net/dsa/mt7530.c:mt7530_mib_reset
   Cyclomatic Complexity 1 drivers/net/dsa/mt7530.c:mt7530_rmw
   Cyclomatic Complexity 2 drivers/net/dsa/mt7530.c:mt7530_hw_vlan_add
   Cyclomatic Complexity 1 drivers/net/dsa/mt7530.c:mt7530_port_set_vlan_aware
   Cyclomatic Complexity 2 drivers/net/dsa/mt7530.c:mt7530_port_vlan_filtering
   Cyclomatic Complexity 5 drivers/net/dsa/mt7530.c:mt7530_stp_state_set
   Cyclomatic Complexity 1 drivers/net/dsa/mt7530.c:mt7530_clear
   Cyclomatic Complexity 5 drivers/net/dsa/mt7530.c:mt7530_port_set_vlan_unaware
   Cyclomatic Complexity 1 drivers/net/dsa/mt7530.c:mt7530_set
   Cyclomatic Complexity 2 drivers/net/dsa/mt7530.c:mt7530_port_set_status
   Cyclomatic Complexity 1 drivers/net/dsa/mt7530.c:mt7530_cpu_port_enable
   Cyclomatic Complexity 8 drivers/net/dsa/mt7530.c:mt7530_port_bridge_leave
   Cyclomatic Complexity 7 drivers/net/dsa/mt7530.c:mt7530_port_bridge_join
   Cyclomatic Complexity 1 drivers/net/dsa/mt7530.c:mt7530_port_disable
   Cyclomatic Complexity 1 drivers/net/dsa/mt7530.c:mt7530_port_enable
   Cyclomatic Complexity 1 drivers/net/dsa/mt7530.c:core_rmw
   Cyclomatic Complexity 1 drivers/net/dsa/mt7530.c:core_clear
   Cyclomatic Complexity 1 drivers/net/dsa/mt7530.c:core_set
   Cyclomatic Complexity 1 drivers/net/dsa/mt7530.c:core_write
   Cyclomatic Complexity 11 drivers/net/dsa/mt7530.c:mt7530_fdb_cmd
   Cyclomatic Complexity 8 drivers/net/dsa/mt7530.c:mt7530_port_fdb_dump
   Cyclomatic Complexity 1 drivers/net/dsa/mt7530.c:mt7530_port_fdb_del
   Cyclomatic Complexity 1 drivers/net/dsa/mt7530.c:mt7530_port_fdb_add
   Cyclomatic Complexity 9 drivers/net/dsa/mt7530.c:mt7530_vlan_cmd
   Cyclomatic Complexity 1 drivers/net/dsa/mt7530.c:mt7530_hw_vlan_update
   Cyclomatic Complexity 4 drivers/net/dsa/mt7530.c:mt7530_port_vlan_del
   Cyclomatic Complexity 4 drivers/net/dsa/mt7530.c:mt7530_port_vlan_add
   Cyclomatic Complexity 2 drivers/net/dsa/mt7530.c:mt7623_trgmii_read
   Cyclomatic Complexity 2 drivers/net/dsa/mt7530.c:mt7623_trgmii_write
   Cyclomatic Complexity 1 drivers/net/dsa/mt7530.c:mt7623_trgmii_rmw
   Cyclomatic Complexity 1 drivers/net/dsa/mt7530.c:mt7623_trgmii_set
   Cyclomatic Complexity 7 drivers/net/dsa/mt7530.c:mt7530_pad_clk_setup
   Cyclomatic Complexity 1 drivers/net/dsa/mt7530.c:mt7623_trgmii_clear
   Cyclomatic Complexity 2 drivers/net/dsa/mt7530.c:mt7623_pad_clk_setup
   Cyclomatic Complexity 12 drivers/net/dsa/mt7530.c:mt7530_adjust_link
   Cyclomatic Complexity 1 drivers/net/dsa/mt7530.c:mt7530_phy_write
   Cyclomatic Complexity 1 drivers/net/dsa/mt7530.c:mt7530_phy_read
   Cyclomatic Complexity 16 drivers/net/dsa/mt7530.c:mt7530_setup
   Cyclomatic Complexity 2 drivers/net/dsa/mt7530.c:mtk_get_tag_protocol
   Cyclomatic Complexity 1 drivers/net/dsa/mt7530.c:mdio_module_exit

vim +1324 drivers/net/dsa/mt7530.c

  1121	
  1122	static void
  1123	mt7530_port_vlan_add(struct dsa_switch *ds, int port,
  1124			     const struct switchdev_obj_port_vlan *vlan,
  1125			     struct switchdev_trans *trans)
  1126	{
  1127		bool untagged = vlan->flags & BRIDGE_VLAN_INFO_UNTAGGED;
  1128		bool pvid = vlan->flags & BRIDGE_VLAN_INFO_PVID;
  1129		struct mt7530_hw_vlan_entry new_entry;
  1130		struct mt7530_priv *priv = ds->priv;
> 1131		int ret;
  1132		u16 vid;
  1133	
  1134		/* The port is kept as VLAN-unaware if bridge with vlan_filtering not
  1135		 * being set.
  1136		 */
  1137		if (!priv->ports[port].vlan_filtering)
  1138			return;
  1139	
  1140		mutex_lock(&priv->reg_mutex);
  1141	
  1142		for (vid = vlan->vid_begin; vid <= vlan->vid_end; ++vid) {
  1143			mt7530_hw_vlan_entry_init(&new_entry, port, untagged);
  1144			mt7530_hw_vlan_update(priv, vid, &new_entry,
  1145					      mt7530_hw_vlan_add);
  1146		}
  1147	
  1148		if (pvid) {
  1149			mt7530_rmw(priv, MT7530_PPBV1_P(port), G0_PORT_VID_MASK,
  1150				   G0_PORT_VID(vlan->vid_end));
  1151			priv->ports[port].pvid = vlan->vid_end;
  1152		}
  1153	
  1154		mutex_unlock(&priv->reg_mutex);
  1155	}
  1156	
  1157	static int
  1158	mt7530_port_vlan_del(struct dsa_switch *ds, int port,
  1159			     const struct switchdev_obj_port_vlan *vlan)
  1160	{
  1161		struct mt7530_hw_vlan_entry target_entry;
  1162		struct mt7530_priv *priv = ds->priv;
  1163		u16 vid, pvid;
  1164	
  1165		/* The port is kept as VLAN-unaware if bridge with vlan_filtering not
  1166		 * being set.
  1167		 */
  1168		if (!priv->ports[port].vlan_filtering)
  1169			return 0;
  1170	
  1171		mutex_lock(&priv->reg_mutex);
  1172	
  1173		pvid = priv->ports[port].pvid;
  1174		for (vid = vlan->vid_begin; vid <= vlan->vid_end; ++vid) {
  1175			mt7530_hw_vlan_entry_init(&target_entry, port, 0);
  1176			mt7530_hw_vlan_update(priv, vid, &target_entry,
  1177					      mt7530_hw_vlan_del);
  1178	
  1179			/* PVID is being restored to the default whenever the PVID port
  1180			 * is being removed from the VLAN.
  1181			 */
  1182			if (pvid == vid)
  1183				pvid = G0_PORT_VID_DEF;
  1184		}
  1185	
  1186		mt7530_rmw(priv, MT7530_PPBV1_P(port), G0_PORT_VID_MASK, pvid);
  1187		priv->ports[port].pvid = pvid;
  1188	
  1189		mutex_unlock(&priv->reg_mutex);
  1190	
  1191		return 0;
  1192	}
  1193	
  1194	static enum dsa_tag_protocol
  1195	mtk_get_tag_protocol(struct dsa_switch *ds, int port)
  1196	{
  1197		struct mt7530_priv *priv = ds->priv;
  1198	
  1199		if (port != MT7530_CPU_PORT) {
  1200			dev_warn(priv->dev,
  1201				 "port not matched with tagging CPU port\n");
  1202			return DSA_TAG_PROTO_NONE;
  1203		} else {
  1204			return DSA_TAG_PROTO_MTK;
  1205		}
  1206	}
  1207	
  1208	static int
  1209	mt7530_setup(struct dsa_switch *ds)
  1210	{
  1211		struct mt7530_priv *priv = ds->priv;
  1212		int ret, i;
  1213		u32 id, val;
  1214		struct device_node *dn;
  1215		struct mt7530_dummy_poll p;
  1216	
  1217		/* The parent node of master netdev which holds the common system
  1218		 * controller also is the container for two GMACs nodes representing
  1219		 * as two netdev instances.
  1220		 */
  1221		dn = ds->ports[MT7530_CPU_PORT].master->dev.of_node->parent;
  1222		priv->ethernet = syscon_node_to_regmap(dn);
  1223		if (IS_ERR(priv->ethernet))
  1224			return PTR_ERR(priv->ethernet);
  1225	
  1226		regulator_set_voltage(priv->core_pwr, 1000000, 1000000);
  1227		ret = regulator_enable(priv->core_pwr);
  1228		if (ret < 0) {
  1229			dev_err(priv->dev,
  1230				"Failed to enable core power: %d\n", ret);
  1231			return ret;
  1232		}
  1233	
  1234		regulator_set_voltage(priv->io_pwr, 3300000, 3300000);
  1235		ret = regulator_enable(priv->io_pwr);
  1236		if (ret < 0) {
  1237			dev_err(priv->dev, "Failed to enable io pwr: %d\n",
  1238				ret);
  1239			return ret;
  1240		}
  1241	
  1242		/* Reset whole chip through gpio pin or memory-mapped registers for
  1243		 * different type of hardware
  1244		 */
  1245		if (priv->mcm) {
  1246			reset_control_assert(priv->rstc);
  1247			usleep_range(1000, 1100);
  1248			reset_control_deassert(priv->rstc);
  1249		} else {
  1250			gpiod_set_value_cansleep(priv->reset, 0);
  1251			usleep_range(1000, 1100);
  1252			gpiod_set_value_cansleep(priv->reset, 1);
  1253		}
  1254	
  1255		/* Waiting for MT7530 got to stable */
  1256		INIT_MT7530_DUMMY_POLL(&p, priv, MT7530_HWTRAP);
  1257		ret = readx_poll_timeout(_mt7530_read, &p, val, val != 0,
  1258					 20, 1000000);
  1259		if (ret < 0) {
  1260			dev_err(priv->dev, "reset timeout\n");
  1261			return ret;
  1262		}
  1263	
  1264		id = mt7530_read(priv, MT7530_CREV);
  1265		id >>= CHIP_NAME_SHIFT;
  1266		if (id != MT7530_ID) {
  1267			dev_err(priv->dev, "chip %x can't be supported\n", id);
  1268			return -ENODEV;
  1269		}
  1270	
  1271		/* Reset the switch through internal reset */
  1272		mt7530_write(priv, MT7530_SYS_CTRL,
  1273			     SYS_CTRL_PHY_RST | SYS_CTRL_SW_RST |
  1274			     SYS_CTRL_REG_RST);
  1275	
  1276		/* Enable Port 6 only; P5 as GMAC5 which currently is not supported */
  1277		val = mt7530_read(priv, MT7530_MHWTRAP);
  1278		val &= ~MHWTRAP_P6_DIS & ~MHWTRAP_PHY_ACCESS;
  1279		val |= MHWTRAP_MANUAL;
  1280		mt7530_write(priv, MT7530_MHWTRAP, val);
  1281	
  1282		/* Enable and reset MIB counters */
  1283		mt7530_mib_reset(ds);
  1284	
  1285		mt7530_clear(priv, MT7530_MFC, UNU_FFP_MASK);
  1286	
  1287		for (i = 0; i < MT7530_NUM_PORTS; i++) {
  1288			/* Disable forwarding by default on all ports */
  1289			mt7530_rmw(priv, MT7530_PCR_P(i), PCR_MATRIX_MASK,
  1290				   PCR_MATRIX_CLR);
  1291	
  1292			if (dsa_is_cpu_port(ds, i))
  1293				mt7530_cpu_port_enable(priv, i);
  1294			else
  1295				mt7530_port_disable(ds, i, NULL);
  1296		}
  1297	
  1298		/* Flush the FDB table */
  1299		ret = mt7530_fdb_cmd(priv, MT7530_FDB_FLUSH, 0);
  1300		if (ret < 0)
  1301			return ret;
  1302	
  1303		return 0;
  1304	}
  1305	
  1306	static const struct dsa_switch_ops mt7530_switch_ops = {
  1307		.get_tag_protocol	= mtk_get_tag_protocol,
  1308		.setup			= mt7530_setup,
  1309		.get_strings		= mt7530_get_strings,
  1310		.phy_read		= mt7530_phy_read,
  1311		.phy_write		= mt7530_phy_write,
  1312		.get_ethtool_stats	= mt7530_get_ethtool_stats,
  1313		.get_sset_count		= mt7530_get_sset_count,
  1314		.adjust_link		= mt7530_adjust_link,
  1315		.port_enable		= mt7530_port_enable,
  1316		.port_disable		= mt7530_port_disable,
  1317		.port_stp_state_set	= mt7530_stp_state_set,
  1318		.port_bridge_join	= mt7530_port_bridge_join,
  1319		.port_bridge_leave	= mt7530_port_bridge_leave,
  1320		.port_fdb_add		= mt7530_port_fdb_add,
  1321		.port_fdb_del		= mt7530_port_fdb_del,
  1322		.port_fdb_dump		= mt7530_port_fdb_dump,
  1323		.port_vlan_filtering	= mt7530_port_vlan_filtering,
> 1324		.port_vlan_prepare	= mt7530_port_vlan_prepare,
  1325		.port_vlan_add		= mt7530_port_vlan_add,
  1326		.port_vlan_del		= mt7530_port_vlan_del,
  1327	};
  1328	

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation
-------------- next part --------------
A non-text attachment was scrubbed...
Name: .config.gz
Type: application/gzip
Size: 31760 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-mediatek/attachments/20171216/0f0ded8e/attachment-0001.gz>


More information about the Linux-mediatek mailing list