Loading drivers/net/wireless/cnss/cnss_sdio.c +119 −0 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ #include <linux/gpio.h> #include <linux/delay.h> #include <linux/err.h> #include <linux/slab.h> #define WLAN_VREG_NAME "vdd-wlan" #define WLAN_VREG_IO_NAME "vdd-wlan-io" Loading @@ -31,6 +32,18 @@ #define WLAN_VREG_XTAL_MIN 1800000 #define POWER_ON_DELAY 4 #define CNSS_MAX_CH_NUM 100 struct cnss_unsafe_channel_list { u16 unsafe_ch_count; u16 unsafe_ch_list[CNSS_MAX_CH_NUM]; }; struct cnss_dfs_nol_info { void *dfs_nol_info; u16 dfs_nol_info_len; }; struct cnss_sdio_wlan_gpio_info { u32 num; u32 flags; Loading @@ -46,8 +59,106 @@ static struct cnss_sdio_data { struct cnss_sdio_regulator regulator; struct platform_device *pdev; struct cnss_sdio_wlan_gpio_info pmic_gpio; struct cnss_dfs_nol_info dfs_info; struct cnss_unsafe_channel_list unsafe_list; } *cnss_pdata; int cnss_set_wlan_unsafe_channel(u16 *unsafe_ch_list, u16 ch_count) { struct cnss_unsafe_channel_list *unsafe_list; if (!cnss_pdata) return -ENODEV; if ((!unsafe_ch_list) || (!ch_count) || (ch_count > CNSS_MAX_CH_NUM)) return -EINVAL; unsafe_list = &cnss_pdata->unsafe_list; unsafe_list->unsafe_ch_count = ch_count; memcpy( (char *)unsafe_list->unsafe_ch_list, (char *)unsafe_ch_list, ch_count * sizeof(u16)); return 0; } EXPORT_SYMBOL(cnss_set_wlan_unsafe_channel); int cnss_get_wlan_unsafe_channel( u16 *unsafe_ch_list, u16 *ch_count, u16 buf_len) { struct cnss_unsafe_channel_list *unsafe_list; if (!cnss_pdata) return -ENODEV; if (!unsafe_ch_list || !ch_count) return -EINVAL; unsafe_list = &cnss_pdata->unsafe_list; if (buf_len < (unsafe_list->unsafe_ch_count * sizeof(u16))) return -ENOMEM; *ch_count = unsafe_list->unsafe_ch_count; memcpy( (char *)unsafe_ch_list, (char *)unsafe_list->unsafe_ch_list, unsafe_list->unsafe_ch_count * sizeof(u16)); return 0; } EXPORT_SYMBOL(cnss_get_wlan_unsafe_channel); int cnss_wlan_set_dfs_nol(void *info, u16 info_len) { void *temp; struct cnss_dfs_nol_info *dfs_info; if (!cnss_pdata) return -ENODEV; if (!info || !info_len) return -EINVAL; temp = kmalloc(info_len, GFP_KERNEL); if (!temp) return -ENOMEM; memcpy(temp, info, info_len); dfs_info = &cnss_pdata->dfs_info; kfree(dfs_info->dfs_nol_info); dfs_info->dfs_nol_info = temp; dfs_info->dfs_nol_info_len = info_len; return 0; } EXPORT_SYMBOL(cnss_wlan_set_dfs_nol); int cnss_wlan_get_dfs_nol(void *info, u16 info_len) { int len; struct cnss_dfs_nol_info *dfs_info; if (!cnss_pdata) return -ENODEV; if (!info || !info_len) return -EINVAL; dfs_info = &cnss_pdata->dfs_info; if (dfs_info->dfs_nol_info == NULL || dfs_info->dfs_nol_info_len == 0) return -ENOENT; len = min(info_len, dfs_info->dfs_nol_info_len); memcpy(info, dfs_info->dfs_nol_info, len); return len; } EXPORT_SYMBOL(cnss_wlan_get_dfs_nol); static int cnss_sdio_configure_gpio(void) { int error; Loading Loading @@ -250,6 +361,14 @@ err_wlan_enable_gpio: static int cnss_sdio_remove(struct platform_device *pdev) { struct cnss_dfs_nol_info *dfs_info; if (!cnss_pdata) return -ENODEV; dfs_info = &cnss_pdata->dfs_info; kfree(dfs_info->dfs_nol_info); cnss_sdio_release_resource(); return 0; } Loading Loading
drivers/net/wireless/cnss/cnss_sdio.c +119 −0 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ #include <linux/gpio.h> #include <linux/delay.h> #include <linux/err.h> #include <linux/slab.h> #define WLAN_VREG_NAME "vdd-wlan" #define WLAN_VREG_IO_NAME "vdd-wlan-io" Loading @@ -31,6 +32,18 @@ #define WLAN_VREG_XTAL_MIN 1800000 #define POWER_ON_DELAY 4 #define CNSS_MAX_CH_NUM 100 struct cnss_unsafe_channel_list { u16 unsafe_ch_count; u16 unsafe_ch_list[CNSS_MAX_CH_NUM]; }; struct cnss_dfs_nol_info { void *dfs_nol_info; u16 dfs_nol_info_len; }; struct cnss_sdio_wlan_gpio_info { u32 num; u32 flags; Loading @@ -46,8 +59,106 @@ static struct cnss_sdio_data { struct cnss_sdio_regulator regulator; struct platform_device *pdev; struct cnss_sdio_wlan_gpio_info pmic_gpio; struct cnss_dfs_nol_info dfs_info; struct cnss_unsafe_channel_list unsafe_list; } *cnss_pdata; int cnss_set_wlan_unsafe_channel(u16 *unsafe_ch_list, u16 ch_count) { struct cnss_unsafe_channel_list *unsafe_list; if (!cnss_pdata) return -ENODEV; if ((!unsafe_ch_list) || (!ch_count) || (ch_count > CNSS_MAX_CH_NUM)) return -EINVAL; unsafe_list = &cnss_pdata->unsafe_list; unsafe_list->unsafe_ch_count = ch_count; memcpy( (char *)unsafe_list->unsafe_ch_list, (char *)unsafe_ch_list, ch_count * sizeof(u16)); return 0; } EXPORT_SYMBOL(cnss_set_wlan_unsafe_channel); int cnss_get_wlan_unsafe_channel( u16 *unsafe_ch_list, u16 *ch_count, u16 buf_len) { struct cnss_unsafe_channel_list *unsafe_list; if (!cnss_pdata) return -ENODEV; if (!unsafe_ch_list || !ch_count) return -EINVAL; unsafe_list = &cnss_pdata->unsafe_list; if (buf_len < (unsafe_list->unsafe_ch_count * sizeof(u16))) return -ENOMEM; *ch_count = unsafe_list->unsafe_ch_count; memcpy( (char *)unsafe_ch_list, (char *)unsafe_list->unsafe_ch_list, unsafe_list->unsafe_ch_count * sizeof(u16)); return 0; } EXPORT_SYMBOL(cnss_get_wlan_unsafe_channel); int cnss_wlan_set_dfs_nol(void *info, u16 info_len) { void *temp; struct cnss_dfs_nol_info *dfs_info; if (!cnss_pdata) return -ENODEV; if (!info || !info_len) return -EINVAL; temp = kmalloc(info_len, GFP_KERNEL); if (!temp) return -ENOMEM; memcpy(temp, info, info_len); dfs_info = &cnss_pdata->dfs_info; kfree(dfs_info->dfs_nol_info); dfs_info->dfs_nol_info = temp; dfs_info->dfs_nol_info_len = info_len; return 0; } EXPORT_SYMBOL(cnss_wlan_set_dfs_nol); int cnss_wlan_get_dfs_nol(void *info, u16 info_len) { int len; struct cnss_dfs_nol_info *dfs_info; if (!cnss_pdata) return -ENODEV; if (!info || !info_len) return -EINVAL; dfs_info = &cnss_pdata->dfs_info; if (dfs_info->dfs_nol_info == NULL || dfs_info->dfs_nol_info_len == 0) return -ENOENT; len = min(info_len, dfs_info->dfs_nol_info_len); memcpy(info, dfs_info->dfs_nol_info, len); return len; } EXPORT_SYMBOL(cnss_wlan_get_dfs_nol); static int cnss_sdio_configure_gpio(void) { int error; Loading Loading @@ -250,6 +361,14 @@ err_wlan_enable_gpio: static int cnss_sdio_remove(struct platform_device *pdev) { struct cnss_dfs_nol_info *dfs_info; if (!cnss_pdata) return -ENODEV; dfs_info = &cnss_pdata->dfs_info; kfree(dfs_info->dfs_nol_info); cnss_sdio_release_resource(); return 0; } Loading