Commit 4e14e76c authored by Igor Mitsyanko's avatar Igor Mitsyanko Committed by Kalle Valo

qtnfmac: advertise netdev port parent ID

Use MAC address of the first active radio as a unique device ID.
Signed-off-by: default avatarIgor Mitsyanko <igor.mitsyanko.os@quantenna.com>
Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
parent 904628d3
...@@ -67,6 +67,7 @@ struct qtnf_bus { ...@@ -67,6 +67,7 @@ struct qtnf_bus {
struct mutex bus_lock; /* lock during command/event processing */ struct mutex bus_lock; /* lock during command/event processing */
struct dentry *dbg_dir; struct dentry *dbg_dir;
struct notifier_block netdev_nb; struct notifier_block netdev_nb;
u8 hw_id[ETH_ALEN];
/* bus private data */ /* bus private data */
char bus_priv[0] __aligned(sizeof(void *)); char bus_priv[0] __aligned(sizeof(void *));
}; };
......
...@@ -1242,10 +1242,7 @@ qtnf_cmd_resp_proc_mac_info(struct qtnf_wmac *mac, ...@@ -1242,10 +1242,7 @@ qtnf_cmd_resp_proc_mac_info(struct qtnf_wmac *mac,
mac_info = &mac->macinfo; mac_info = &mac->macinfo;
mac_info->bands_cap = resp_info->bands_cap; mac_info->bands_cap = resp_info->bands_cap;
memcpy(&mac_info->dev_mac, &resp_info->dev_mac, ether_addr_copy(mac->macaddr, resp_info->dev_mac);
sizeof(mac_info->dev_mac));
ether_addr_copy(mac->macaddr, mac_info->dev_mac);
vif = qtnf_mac_get_base_vif(mac); vif = qtnf_mac_get_base_vif(mac);
if (vif) if (vif)
......
...@@ -204,6 +204,21 @@ static int qtnf_netdev_set_mac_address(struct net_device *ndev, void *addr) ...@@ -204,6 +204,21 @@ static int qtnf_netdev_set_mac_address(struct net_device *ndev, void *addr)
return ret; return ret;
} }
static int qtnf_netdev_port_parent_id(struct net_device *ndev,
struct netdev_phys_item_id *ppid)
{
const struct qtnf_vif *vif = qtnf_netdev_get_priv(ndev);
const struct qtnf_bus *bus = vif->mac->bus;
if (!(bus->hw_info.hw_capab & QLINK_HW_CAPAB_HW_BRIDGE))
return -EOPNOTSUPP;
ppid->id_len = sizeof(bus->hw_id);
memcpy(&ppid->id, bus->hw_id, ppid->id_len);
return 0;
}
/* Network device ops handlers */ /* Network device ops handlers */
const struct net_device_ops qtnf_netdev_ops = { const struct net_device_ops qtnf_netdev_ops = {
.ndo_open = qtnf_netdev_open, .ndo_open = qtnf_netdev_open,
...@@ -212,6 +227,7 @@ const struct net_device_ops qtnf_netdev_ops = { ...@@ -212,6 +227,7 @@ const struct net_device_ops qtnf_netdev_ops = {
.ndo_tx_timeout = qtnf_netdev_tx_timeout, .ndo_tx_timeout = qtnf_netdev_tx_timeout,
.ndo_get_stats64 = qtnf_netdev_get_stats64, .ndo_get_stats64 = qtnf_netdev_get_stats64,
.ndo_set_mac_address = qtnf_netdev_set_mac_address, .ndo_set_mac_address = qtnf_netdev_set_mac_address,
.ndo_get_port_parent_id = qtnf_netdev_port_parent_id,
}; };
static int qtnf_mac_init_single_band(struct wiphy *wiphy, static int qtnf_mac_init_single_band(struct wiphy *wiphy,
...@@ -565,6 +581,10 @@ static int qtnf_core_mac_attach(struct qtnf_bus *bus, unsigned int macid) ...@@ -565,6 +581,10 @@ static int qtnf_core_mac_attach(struct qtnf_bus *bus, unsigned int macid)
goto error; goto error;
} }
/* Use MAC address of the first active radio as a unique device ID */
if (is_zero_ether_addr(mac->bus->hw_id))
ether_addr_copy(mac->bus->hw_id, mac->macaddr);
vif = qtnf_mac_get_base_vif(mac); vif = qtnf_mac_get_base_vif(mac);
if (!vif) { if (!vif) {
pr_err("MAC%u: primary VIF is not ready\n", macid); pr_err("MAC%u: primary VIF is not ready\n", macid);
......
...@@ -74,7 +74,6 @@ struct qtnf_vif { ...@@ -74,7 +74,6 @@ struct qtnf_vif {
struct qtnf_mac_info { struct qtnf_mac_info {
u8 bands_cap; u8 bands_cap;
u8 dev_mac[ETH_ALEN];
u8 num_tx_chain; u8 num_tx_chain;
u8 num_rx_chain; u8 num_rx_chain;
u16 max_ap_assoc_sta; u16 max_ap_assoc_sta;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment