Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 46 additions & 3 deletions drivers/wifi/infineon/airoc_wifi.c
Original file line number Diff line number Diff line change
Expand Up @@ -363,6 +363,37 @@ static void airoc_wifi_network_process_ethernet_data(whd_interface_t interface,
}
}

static enum ethernet_hw_caps airoc_get_capabilities(const struct device *dev)
{
ARG_UNUSED(dev);

return ETHERNET_HW_FILTERING;
}

static int airoc_set_config(const struct device *dev,
enum ethernet_config_type type,
const struct ethernet_config *config)
{
ARG_UNUSED(dev);
whd_mac_t whd_mac_addr;

switch (type) {
case ETHERNET_CONFIG_TYPE_FILTER:
for (int i = 0; i < WHD_ETHER_ADDR_LEN; i++) {
whd_mac_addr.octet[i] = config->filter.mac_address.addr[i];
}
if (config->filter.set) {
whd_wifi_register_multicast_address(airoc_if, &whd_mac_addr);
} else {
whd_wifi_unregister_multicast_address(airoc_if, &whd_mac_addr);
}
return 0;
default:
break;
}
return -ENOTSUP;
}

static void *link_events_handler(whd_interface_t ifp, const whd_event_header_t *event_header,
const uint8_t *event_data, void *handler_user_data)
{
Expand Down Expand Up @@ -502,7 +533,7 @@ static int airoc_mgmt_connect(const struct device *dev, struct wifi_connect_req_
goto error;
}

if (usr_result.security == 0) {
if (usr_result.security == WHD_SECURITY_UNKNOWN) {
ret = -EAGAIN;
LOG_ERR("Could not scan device");
goto error;
Expand Down Expand Up @@ -620,10 +651,18 @@ static int airoc_mgmt_ap_enable(const struct device *dev, struct wifi_connect_re
params->channel);
}

if (params->psk_length == 0) {
switch (params->security) {
case WIFI_SECURITY_TYPE_NONE:
security = WHD_SECURITY_OPEN;
} else {
break;
case WIFI_SECURITY_TYPE_PSK:
security = WHD_SECURITY_WPA2_AES_PSK;
break;
case WIFI_SECURITY_TYPE_SAE:
security = WHD_SECURITY_WPA3_SAE;
break;
default:
goto error;
}

if (whd_wifi_init_ap(airoc_ap_if, &ssid, security, (const uint8_t *)params->psk,
Expand All @@ -650,6 +689,7 @@ static int airoc_mgmt_ap_enable(const struct device *dev, struct wifi_connect_re

data->is_ap_up = true;
airoc_if = airoc_ap_if;
net_if_dormant_off(data->iface);
error:

k_sem_give(&data->sema_common);
Expand Down Expand Up @@ -695,6 +735,7 @@ static int airoc_mgmt_ap_disable(const struct device *dev)
if (whd_ret == CY_RSLT_SUCCESS) {
data->is_ap_up = false;
airoc_if = airoc_sta_if;
net_if_dormant_on(data->iface);
} else {
LOG_ERR("Can't stop wifi ap: %u", whd_ret);
}
Expand Down Expand Up @@ -769,6 +810,8 @@ static const struct wifi_mgmt_ops airoc_wifi_mgmt = {
static const struct net_wifi_mgmt_offload airoc_api = {
.wifi_iface.iface_api.init = airoc_mgmt_init,
.wifi_iface.send = airoc_mgmt_send,
.wifi_iface.get_capabilities = airoc_get_capabilities,
.wifi_iface.set_config = airoc_set_config,
.wifi_mgmt_api = &airoc_wifi_mgmt,
};

Expand Down