diff --git a/danctnix-besser-pkgbuild/kernel/0001-bes2600-besser-cumulative-series.patch b/danctnix-besser-pkgbuild/kernel/0001-bes2600-besser-cumulative-series.patch index 7bf4b813f..a0adf6fd3 100644 --- a/danctnix-besser-pkgbuild/kernel/0001-bes2600-besser-cumulative-series.patch +++ b/danctnix-besser-pkgbuild/kernel/0001-bes2600-besser-cumulative-series.patch @@ -1,4 +1,4 @@ -From 777cbda9157951b6edbedfc8f3b0be8dc700ca3b Mon Sep 17 00:00:00 2001 +From 4e176b8f930373bc02382c903e6d739ab2d5fd47 Mon Sep 17 00:00:00 2001 From: Markus Fritsche Date: Fri, 8 May 2026 10:07:47 +0200 Subject: [PATCH] bes2600: BESser cumulative patch series (16 commits squashed) @@ -48,20 +48,20 @@ Signed-off-by: Markus Fritsche drivers/staging/bes2600/ap.c | 25 +- drivers/staging/bes2600/ap.h | 9 +- drivers/staging/bes2600/bes2600.h | 58 +- - drivers/staging/bes2600/bes2600_factory.c | 117 +-- + drivers/staging/bes2600/bes2600_factory.c | 117 ++- drivers/staging/bes2600/bes2600_factory.h | 12 +- drivers/staging/bes2600/bes2600_plat.h | 9 +- - drivers/staging/bes2600/bes2600_sdio.c | 268 ++++-- - drivers/staging/bes2600/bes_chardev.c | 837 ++---------------- - drivers/staging/bes2600/bes_chardev.h | 13 +- + drivers/staging/bes2600/bes2600_sdio.c | 268 +++++-- + drivers/staging/bes2600/bes_chardev.c | 65 +- + drivers/staging/bes2600/bes_chardev.h | 11 +- drivers/staging/bes2600/bes_fw.c | 43 +- drivers/staging/bes2600/bes_fw_common.c | 9 +- drivers/staging/bes2600/bes_fw_common.h | 9 +- drivers/staging/bes2600/bes_log.h | 30 + .../bes2600/bes_nl80211_testmode_msg.h | 9 +- - drivers/staging/bes2600/bes_pwr.c | 243 ++++- + drivers/staging/bes2600/bes_pwr.c | 243 +++++- drivers/staging/bes2600/bes_pwr.h | 33 +- - drivers/staging/bes2600/bh.c | 732 ++++----------- + drivers/staging/bes2600/bh.c | 732 ++++-------------- drivers/staging/bes2600/bh.h | 21 +- drivers/staging/bes2600/debug.c | 29 +- drivers/staging/bes2600/debug.h | 12 +- @@ -82,18 +82,18 @@ Signed-off-by: Markus Fritsche drivers/staging/bes2600/queue.c | 26 +- drivers/staging/bes2600/queue.h | 12 +- drivers/staging/bes2600/sbus.h | 31 +- - drivers/staging/bes2600/scan.c | 133 ++- + drivers/staging/bes2600/scan.c | 133 +++- drivers/staging/bes2600/scan.h | 23 +- drivers/staging/bes2600/sta.c | 204 +++-- drivers/staging/bes2600/sta.h | 12 +- drivers/staging/bes2600/tx_loop.c | 9 +- drivers/staging/bes2600/tx_loop.h | 9 +- - drivers/staging/bes2600/txrx.c | 168 +++- + drivers/staging/bes2600/txrx.c | 168 ++-- drivers/staging/bes2600/txrx.h | 12 +- drivers/staging/bes2600/wifi_testmode_cmd.c | 9 +- drivers/staging/bes2600/wsm.c | 29 +- drivers/staging/bes2600/wsm.h | 16 +- - 48 files changed, 1426 insertions(+), 2003 deletions(-) + 48 files changed, 1412 insertions(+), 1243 deletions(-) diff --git a/drivers/staging/bes2600/ap.c b/drivers/staging/bes2600/ap.c index 7b1e3b42c..16c0451e0 100644 @@ -1007,7 +1007,7 @@ index 13d4ff1e5..517e6f874 100644 return -EAGAIN; } diff --git a/drivers/staging/bes2600/bes_chardev.c b/drivers/staging/bes2600/bes_chardev.c -index f89dcb8fb..fe46fc569 100644 +index f89dcb8fb..5374d5117 100644 --- a/drivers/staging/bes2600/bes_chardev.c +++ b/drivers/staging/bes2600/bes_chardev.c @@ -1,12 +1,9 @@ @@ -1026,757 +1026,7 @@ index f89dcb8fb..fe46fc569 100644 */ #include #include -@@ -43,12 +40,6 @@ enum bus_probe_state { - }; - - struct bes_cdev { -- struct cdev cdev; -- dev_t dev_id; -- int major; -- int minor; -- struct class *class; -- struct device *device; - atomic_t num_proc; - wait_queue_head_t open_wq; - spinlock_t status_lock; -@@ -69,9 +60,6 @@ struct bes_cdev { - struct delayed_work probe_timeout_work; - enum bus_probe_state bus_probe; - struct work_struct wifi_force_close_work; --#ifdef BES2600_WRITE_DPD_TO_FILE -- int no_dpd; --#endif - enum pend_read_op read_flag; - enum wakeup_event wakeup_by_event; /* used to filter unwanted event wakeup reason report */ - u16 wakeup_state; /* for userspace check wakeup reason */ -@@ -91,9 +79,6 @@ struct bes2600_op_map { - - static struct bes_cdev bes2600_cdev; - module_param_named(fw_type, bes2600_cdev.fw_type, int, 0644); --#ifdef BES2600_WRITE_DPD_TO_FILE --module_param_named(no_dpd, bes2600_cdev.no_dpd, int, 0644); --#endif - - extern int bes2600_register_net_dev(struct sbus_priv *bus_priv); - extern int bes2600_unregister_net_dev(struct sbus_priv *bus_priv); -@@ -196,445 +181,19 @@ static int bes2600_switch_wifi(bool on) - return ret; - } - --static int bes2600_switch_bt(bool on) --{ -- int ret = 0; -- long status = 0; -- -- if (bes2600_cdev.bt_opened == on) -- return 0; -- -- if (on) { -- if (bes2600_chrdev_check_system_close()) { -- bes_devel("power up bes2600 when active bt.\n"); -- /* reset bus error status when restart bes2600 */ -- spin_lock(&bes2600_cdev.status_lock); -- bes2600_cdev.bus_error = false; -- bes2600_cdev.halt_dev = false; -- bes2600_cdev.bus_probe = BES2600_BUS_PROBE_NONE; -- spin_unlock(&bes2600_cdev.status_lock); -- -- /* set opend state in advance */ -- bes2600_cdev.bt_opened = true; -- bes2600_cdev.bton_pending = true; -- -- /* power up bes2600, trigger system to execute probe function */ -- bes2600_cdev.sbus_ops->power_switch(NULL, 1); -- -- /* wait bootup process end */ -- status = wait_event_timeout(bes2600_cdev.probe_done_wq, -- bes2600_bootup_end(), HZ * 8); -- WARN_ON(status <= 0); -- -- /* check if there is a error when bootup */ -- ret = (status <= 0 || bes2600_chrdev_is_bus_error()) ? -1 : 0; -- } else { -- bes_devel("bes2600 activate bt.\n"); -- ret = bes2600_chrdev_switch_subsys(GPIO_WAKE_FLAG_BT_ON, SUBSYSTEM_BT, true); -- } -- } else { -- bes_devel("bes2600 deactivate bt.\n"); -- bes2600_chrdev_switch_subsys(GPIO_WAKE_FLAG_BT_OFF, SUBSYSTEM_BT, false); -- } -- -- if (!ret) { -- bes2600_cdev.bt_opened = on; -- } else { -- bes2600_cdev.bt_opened = false; -- bes2600_cdev.bton_pending = false; -- if (ret) -- bes_info("open bt failed\n"); -- } -- -- return ret; --} -- --/* -- * This is a global function so we don't have to make many changes to -- * the driver. -- * -- * @wifi: 1 to turn on, 0 to turn off. Otherwise, leave unchanged -- * @bt: 1 to turn on, 0 to turn off. Otherwise, leave unchanged -- */ --int bes2600_chrdev_switch_subsys_glb(int wifi, int bt) --{ -- int ret = 0; -- -- switch (wifi) { -- case 0: -- ret = bes2600_switch_wifi(false); -- break; -- case 1: -- ret = bes2600_switch_wifi(true); -- break; -- default: -- break; -- } -- -- if (ret) -- goto result; -- -- switch (bt) { -- case 0: -- ret = bes2600_switch_bt(false); -- break; -- case 1: -- ret = bes2600_switch_bt(true); -- break; -- default: -- break; -- } -- --result: -- return ret; --} --EXPORT_SYMBOL_GPL(bes2600_chrdev_switch_subsys_glb); -- --static int bes2600_get_cmd_and_ifname(const char *str, char **result) --{ -- int cmd_len = 0; -- int ifname_len = 0; -- char *sp = NULL; -- char *tmp_ptr = NULL; -- char *cmd_ptr = NULL; -- -- /* check if input arguments is valid */ -- if (!str || strncmp(str, "ifname:", 7) != 0) -- return -1; - -- sp = strchr(str, ' '); -- if (strncmp(sp + 1, "cmd:", 4) != 0) -- return -1; - -- /* extract interface name */ -- ifname_len = sp - str - 7; -- tmp_ptr = kmalloc(ifname_len + 1, GFP_KERNEL); -- if (!tmp_ptr) { -- return -2; -- } - -- strncpy(tmp_ptr, str+7, ifname_len); -- tmp_ptr[ifname_len] = '\0'; -- result[0] = tmp_ptr; -- -- /* get command length */ -- cmd_ptr = strstr(str, "cmd:"); -- cmd_ptr += 4; -- sp = strchr(cmd_ptr, ' '); -- if (!sp) { /* the command don't have any parameter */ -- cmd_len = strlen(cmd_ptr); -- if (cmd_ptr[cmd_len - 1] == '\n') -- --cmd_len; -- } else { /* the command have one or more parameter */ -- cmd_len = sp - cmd_ptr; -- } - -- /* copy command to out buffer */ -- tmp_ptr = kmalloc( cmd_len + 1, GFP_KERNEL); -- if (!tmp_ptr) { -- kfree(result[0]); -- result[0] = NULL; -- return -3; -- } - -- strncpy(tmp_ptr, cmd_ptr, cmd_len); -- tmp_ptr[cmd_len] = '\0'; -- result[1] = tmp_ptr; - -- return 0; --} - --static void bes2600_recyle_cmd_and_ifname_mem(char **info) --{ -- if (info[0]) { -- kfree(info[0]); -- info[0] = NULL; -- } - -- if (info[1]) { -- kfree(info[1]); -- info[1] = NULL; -- } - --} -- --static int bes2600_op_default_handler(const char *str) --{ -- char *info[2] = {0}; -- -- if (bes2600_get_cmd_and_ifname(str, info) == 0) { -- bes_devel("cmd(%s) on %s not handled\n", info[1], info[0]); -- } else { -- bes_err("%s get command fail, the origin string is %s\n", __func__, str); -- } -- -- bes2600_recyle_cmd_and_ifname_mem(info); -- -- return 0; --} -- --static int bes2600_op_wifi_bt_on_off(const char *str) --{ -- char *info[2] = {0}; -- int ret = 0; -- enum wait_state wait_state; -- enum bus_probe_state probe_state; -- unsigned long status = 0; -- -- spin_lock(&bes2600_cdev.status_lock); -- probe_state = bes2600_cdev.bus_probe; -- wait_state = bes2600_cdev.wait_state; -- spin_unlock(&bes2600_cdev.status_lock); -- -- /* only work for wifi signal mode */ -- if (bes2600_cdev.fw_type != BES2600_FW_TYPE_WIFI_SIGNAL) -- return -EFAULT; -- -- /* wait bus probe operation end */ -- if (probe_state == BES2600_BUS_PROBE_START) { -- bes_devel("wait bus probe operation end\n"); -- status = wait_event_timeout(bes2600_cdev.probe_done_wq, -- (bes2600_cdev.bus_probe > BES2600_BUS_PROBE_START), -- HZ); -- WARN_ON(status <= 0); -- } -- -- /* must wait previous operation end in critical section */ -- if (wait_state != BES2600_BOOT_WAIT_NONE) { -- bes_devel("wait previous operation end\n"); -- status = wait_event_timeout(bes2600_cdev.probe_done_wq, -- (bes2600_cdev.wait_state == BES2600_BOOT_WAIT_NONE), -- HZ * 8); -- WARN_ON(status <= 0); -- } -- -- /* if dpd calibration is doing, modify wifi and bt state directly */ -- spin_lock(&bes2600_cdev.status_lock); -- if (bes2600_cdev.bus_probe == BES2600_BUS_PROBE_OK && !bes2600_cdev.dpd_calied) { -- if (bes2600_get_cmd_and_ifname(str, info) == 0) { -- if (strncmp(info[1], "WIFI_ON", 7) == 0) { -- bes2600_cdev.wifi_opened = true; -- } else if (strncmp(info[1], "WIFI_OFF", 8) == 0) { -- bes2600_cdev.wifi_opened = false; -- } else if (strncmp(info[1], "BT_ON", 5) == 0) { -- bes2600_cdev.bt_opened = true; -- bes2600_cdev.bton_pending = true; -- } else if (strncmp(info[1], "BT_OFF", 6) == 0) { -- bes2600_cdev.bt_opened = false; -- bes2600_cdev.bton_pending = false; -- } -- } -- bes2600_recyle_cmd_and_ifname_mem(info); -- spin_unlock(&bes2600_cdev.status_lock); -- -- /* wait probe done event */ -- status = wait_event_timeout(bes2600_cdev.probe_done_wq, -- bes2600_bootup_end(), HZ * 8); -- WARN_ON(status <= 0); -- -- return (status <= 0 || bes2600_chrdev_is_bus_error()) ? -EFAULT : 0; -- } -- spin_unlock(&bes2600_cdev.status_lock); -- -- /* process wifi/bt on/off operation */ -- if (bes2600_get_cmd_and_ifname(str, info) == 0) { -- if (strncmp(info[1], "WIFI_ON", 7) == 0) { -- ret = bes2600_switch_wifi(1); -- } else if (strncmp(info[1], "WIFI_OFF", 8) == 0) { -- ret = bes2600_switch_wifi(0); -- } else if (strncmp(info[1], "BT_ON", 5) == 0) { -- ret = bes2600_switch_bt(1); -- } else if (strncmp(info[1], "BT_OFF", 6) == 0) { -- ret = bes2600_switch_bt(0); -- } -- } -- -- if (!ret && bes2600_chrdev_check_system_close()) -- ret = bes2600_chrdev_do_system_close(bes2600_cdev.sbus_ops, -- bes2600_cdev.sbus_priv); -- -- bes2600_recyle_cmd_and_ifname_mem(info); -- -- return ret ; --} -- -- --static int bes2600_op_change_fw_type(const char *str) --{ -- int ret = 0; -- int temp = 0; -- long status = 0; -- char *cmd_ptr = NULL; -- char fw_type[5] = {0}; -- bool sys_closed = bes2600_chrdev_check_system_close(); -- -- bes_devel("%s is called, arg:%s\n", __func__, str); -- -- if (!bes2600_cdev.sbus_ops->power_switch && !bes2600_cdev.sbus_ops->reboot) -- return -EPERM; -- -- /* check if user input is valid */ -- cmd_ptr = strstr(str, "CHANGE_FW_TYPE "); -- if (strlen(str) < 16 || !cmd_ptr) { -- bes_err("the format of \"%s\" is error\n", str); -- return -EINVAL; -- } -- -- /* convert fw_type from string to int */ -- strncpy(fw_type, cmd_ptr + 14, 4); -- fw_type[0] = '+'; -- ret = kstrtoint(fw_type, 10, &temp); -- if (ret < 0) { -- bes_err("%s parse error\n", __func__); -- return -EINVAL; -- } -- -- /* no need to realod firmware if new fw_type is equal to the old */ -- if (temp == bes2600_cdev.fw_type ) { -- bes_devel("fw type is equal\n"); -- return 0; -- } -- -- /* close wifi net device */ -- if (bes2600_cdev.sbus_priv -- && bes2600_is_net_dev_created(bes2600_cdev.sbus_priv)) { -- bes2600_unregister_net_dev(bes2600_cdev.sbus_priv); -- } -- -- /* update firmware type */ -- bes2600_cdev.fw_type = temp; -- bes2600_chrdev_update_signal_mode(); -- -- if (!sys_closed) { -- /* close device to call disconnect function */ -- if (bes2600_cdev.sbus_ops->power_switch) -- bes2600_cdev.sbus_ops->power_switch(bes2600_cdev.sbus_priv, 0); -- else if (bes2600_cdev.sbus_ops->reboot) -- bes2600_cdev.sbus_ops->reboot(bes2600_cdev.sbus_priv); -- } -- -- if (bes2600_cdev.sbus_ops->reboot) -- bes2600_chrdev_start_bus_probe(); -- -- /* wait disconnect event */ -- status = wait_event_timeout(bes2600_cdev.probe_done_wq, (bes2600_cdev.sbus_priv == NULL), HZ * 10); -- WARN_ON(status <= 0); -- -- if (bes2600_cdev.dpd_calied -- && bes2600_chrdev_check_system_close()) { -- bes_devel("no need to reload firmware\n"); -- return 0; -- } -- -- bes_devel("reload firmware...\n"); -- /* power on device to call probe function */ -- if (bes2600_cdev.sbus_ops->power_switch) -- bes2600_cdev.sbus_ops->power_switch(NULL, 1); -- -- /* wait probe done event */ -- status = wait_event_timeout(bes2600_cdev.probe_done_wq, -- bes2600_bootup_end(), HZ * 10); -- WARN_ON(status <= 0); -- -- ret = (status <= 0 || bes2600_chrdev_is_bus_error()) ? -1 : 0; -- -- -- return ret; --} -- --static int bes2600_op_bt_wakeup(const char *str) --{ -- int ret = 0; -- unsigned long status = 0; -- -- spin_lock(&bes2600_cdev.status_lock); -- if (!bes2600_cdev.bt_opened) { -- spin_unlock(&bes2600_cdev.status_lock); -- return -EFAULT; -- } -- spin_unlock(&bes2600_cdev.status_lock); -- -- /* wait probe done event */ -- status = wait_event_timeout(bes2600_cdev.probe_done_wq, -- bes2600_bootup_end(), HZ * 8); -- if (status <= 0 || bes2600_chrdev_is_bus_error()) -- return -EFAULT; -- -- bes_devel("bes2600 wakeup bt.\n"); -- ret = bes2600_chrdev_switch_subsys(GPIO_WAKE_FLAG_BT_LP_ON, SUBSYSTEM_BT_LP, true); -- -- return ret; --} -- --static int bes2600_op_bt_sleep(const char *str) --{ -- int ret = 0; -- unsigned long status = 0; -- -- spin_lock(&bes2600_cdev.status_lock); -- if (!bes2600_cdev.bt_opened) { -- spin_unlock(&bes2600_cdev.status_lock); -- return -EFAULT; -- } -- spin_unlock(&bes2600_cdev.status_lock); -- -- /* wait probe done event */ -- status = wait_event_timeout(bes2600_cdev.probe_done_wq, -- bes2600_bootup_end(), HZ * 8); -- if (status <= 0 || bes2600_chrdev_is_bus_error()) -- return -EFAULT; -- -- bes_devel("bes2600 allow bt sleep.\n"); -- ret = bes2600_chrdev_switch_subsys(GPIO_WAKE_FLAG_BT_LP_OFF, SUBSYSTEM_BT_LP, false); -- -- return ret; --} -- --static int bes2600_op_set_wakeup_read_flag(const char *str) --{ -- bes_devel("%s is called, arg:%s\n", __func__, str); -- spin_lock(&bes2600_cdev.status_lock); -- bes2600_cdev.read_flag = BES_CDEV_READ_WAKEUP_STATE; -- spin_unlock(&bes2600_cdev.status_lock); -- -- return 0; --} - - #ifdef FW_DOWNLOAD_UART_DAEMON --int bes2600_load_uevent(char *env[]) --{ -- return kobject_uevent_env(&bes2600_cdev.device->kobj, KOBJ_CHANGE, env); --} - #endif - --static struct bes2600_op_map bes2600_op_map_tab[] ={ -- /*op op_len handler */ -- {"P2P_SET_NOA", 11, bes2600_op_default_handler}, -- {"P2P_SET_PS", 10, bes2600_op_default_handler}, -- {"SET_AP_WPS_P2P_IE", 17, bes2600_op_default_handler}, -- {"LINKSPEED", 9, bes2600_op_default_handler}, -- {"RSSI", 4, bes2600_op_default_handler}, -- {"GETBAND", 7, bes2600_op_default_handler}, -- {"WLS_BATCHING", 12, bes2600_op_default_handler}, -- {"MACADDR", 7, bes2600_op_default_handler}, -- {"RXFILTER-START", 14, bes2600_op_default_handler}, -- {"RXFILTER-STOP", 13, bes2600_op_default_handler}, -- {"RXFILTER-ADD", 12, bes2600_op_default_handler}, -- {"RXFILTER-REMOVE", 15, bes2600_op_default_handler}, -- {"BTCOEXMODE", 10, bes2600_op_default_handler}, -- {"BTCOEXSCAN-START", 16, bes2600_op_default_handler}, -- {"BTCOEXSCAN-STOP", 15, bes2600_op_default_handler}, -- {"SETSUSPENDMODE", 14, bes2600_op_default_handler}, -- {"COUNTRY", 7, bes2600_op_default_handler}, -- {"WIFI_ON", 7, bes2600_op_wifi_bt_on_off}, -- {"WIFI_OFF", 8, bes2600_op_wifi_bt_on_off}, -- {"BT_ON", 5, bes2600_op_wifi_bt_on_off}, -- {"BT_OFF", 6, bes2600_op_wifi_bt_on_off}, -- {"CHANGE_FW_TYPE", 14, bes2600_op_change_fw_type}, -- {"BT_WAKEUP", 9, bes2600_op_bt_wakeup}, -- {"BT_SLEEP", 8, bes2600_op_bt_sleep}, -- {"WAKEUP_STATE", 12, bes2600_op_set_wakeup_read_flag}, --}; - - static int bes2600_chrdev_check_system_close_internal(void) - { -@@ -644,255 +203,13 @@ static int bes2600_chrdev_check_system_close_internal(void) - && (bes2600_cdev.wifi_opened == false); - } - --static int bes2600_chrdev_open(struct inode *inode, struct file *filp) --{ -- if (atomic_read(&bes2600_cdev.num_proc) > 0) { -- wait_event_timeout(bes2600_cdev.open_wq, -- (atomic_read(&bes2600_cdev.num_proc) == 0), -- MAX_SCHEDULE_TIMEOUT); -- } -- -- bes_devel("bes2600 char device is opened\n"); -- atomic_inc(&bes2600_cdev.num_proc); -- -- return 0; --} -- --static ssize_t bes2600_chrdev_read(struct file *file, char __user *user_buf, -- size_t count, loff_t *ppos) --{ -- char buf[64] = {0}; -- unsigned int len; -- long status = 0; -- -- switch (bes2600_cdev.read_flag) { -- case BES_CDEV_READ_WAKEUP_STATE: -- if (bes2600_chrdev_wakeup_by_event_get() > WAKEUP_EVENT_NONE) { -- status = wait_event_timeout(bes2600_cdev.wakeup_reason_wq, -- bes2600_chrdev_wakeup_by_event_get() == WAKEUP_EVENT_NONE, HZ * 2); -- WARN_ON(status <= 0); -- } -- len = sprintf(buf, "wakeup_reason: %u, src_port: %u\n", -- bes2600_cdev.wakeup_state, bes2600_cdev.src_port); -- break; -- default: -- len = sprintf(buf, "dpd_calied:%d wifi_opened:%d bt_opened:%d fw_type:%d\n", -- bes2600_cdev.dpd_calied, -- bes2600_cdev.wifi_opened, -- bes2600_cdev.bt_opened, -- bes2600_cdev.fw_type); -- break; -- } -- -- len = sizeof(buf); -- /* reset read flag */ -- spin_lock(&bes2600_cdev.status_lock); -- bes2600_cdev.read_flag = BES_CDEV_READ_NUM_MAX; -- spin_unlock(&bes2600_cdev.status_lock); -- -- return simple_read_from_buffer(user_buf, count, ppos, buf, len); --} -- --static ssize_t bes2600_chrdev_write(struct file *file, -- const char __user *user_buf, size_t count, loff_t *ppos) --{ -- int i = 0; -- int cmd_num = ARRAY_SIZE(bes2600_op_map_tab); -- int cmd_len = 0; -- int ret = 0; -- char *info[2] = {0}; -- char *buf = NULL; -- -- /* copy content from user space to kernel */ -- /* message format:"ifname:wlanx cmd:xxx arg1 arg2 ..." */ -- buf = kmalloc(count + 1, GFP_KERNEL); -- if (copy_from_user(buf, user_buf, count)) -- return -EFAULT; -- -- /* add terminal character */ -- buf[count] = '\0'; -- -- /* extract comand and interface */ -- if (bes2600_get_cmd_and_ifname(buf, info) != 0) { -- bes_err("%s get command fail, the origin string is %s\n", __func__, buf); -- kfree(buf); -- return -EINVAL; -- } -- -- /* match operation item and execure its handler */ -- cmd_len = strlen(info[1]); -- for (i = 0; i < cmd_num; i++) { -- if (cmd_len < bes2600_op_map_tab[i].op_len) -- continue; -- -- if (strncasecmp(info[1], bes2600_op_map_tab[i].op, bes2600_op_map_tab[i].op_len) == 0) { -- ret = bes2600_op_map_tab[i].handler(buf); -- break; -- } -- } -- -- /* operation item mismatch */ -- if (i == cmd_num) { -- bes_err("cmd(%s) mismatch\n", info[1]); -- } -- -- bes2600_recyle_cmd_and_ifname_mem(info); -- kfree(buf); -- -- return (ret == 0) ? count : ret; --} -- --static int bes2600_chrdev_release (struct inode *inode, struct file *file) --{ -- if (atomic_dec_and_test(&bes2600_cdev.num_proc)) { -- wake_up(&bes2600_cdev.open_wq); -- } -- -- bes_devel("bes2600 char device is closed\n"); -- -- return 0; --} -- --static struct file_operations bes2600_chardev_fops = --{ -- .owner = THIS_MODULE, -- .open = bes2600_chrdev_open, -- .read = bes2600_chrdev_read, -- .write = bes2600_chrdev_write, -- .release = bes2600_chrdev_release, --}; -- --#ifdef BES2600_WRITE_DPD_TO_FILE --static int bes2600_chrdev_write_dpd_data_to_file(const char *path, void *buffer, int size) --{ -- int ret = 0; -- struct file *fp; -- -- if (buffer == NULL || size == 0) -- return 0; -- -- fp = filp_open(path, O_TRUNC | O_CREAT | O_RDWR, S_IRUSR); -- if (IS_ERR(fp)) { -- bes_err("BES2600 : can't open %s\n",path); -- return -1; -- } -- -- ret = kernel_write(fp, buffer, size, &fp->f_pos); -- if (ret < 0) -- bes_err("write dpd to file failed\n"); -- -- filp_close(fp,NULL); -- -- bes_devel("write dpd to %s\n", path); -- -- return ret; --} -- --static bool bes2600_chrdev_dpd_is_vaild(u8 *dpd_data) --{ -- u32 cal_crc = 0; -- u32 dpd_crc = le32_to_cpup((__le32 *)(dpd_data)); -- u32 dpd_ver = le32_to_cpup((__le32 *)(dpd_data + DPD_VERSION_OFFSET)); -- -- /* check version */ -- if (dpd_ver < DPD_CUR_VERSION) -- return false; -- -- cal_crc ^= 0xffffffffL; -- cal_crc = crc32_le(cal_crc, dpd_data + 4, DPD_BIN_SIZE - 4); -- cal_crc ^= 0xffffffffL; -- -- /* check if the dpd data is valid */ -- if (cal_crc != dpd_crc) { -- bes_err( -- "bes2600 dpd data from file check failed, calc_crc:0x%08x dpd_crc: 0x%08x\n", -- cal_crc, dpd_crc); -- return false; -- } -- -- return true; --} -- --static int bes2600_chrdev_read_and_check_dpd_data(const char *file, u8 **data, u32 *len) --{ -- int ret = 0; -- u8* read_data = NULL; -- struct file *fp; - -- /* open file */ -- fp = filp_open(file, O_RDONLY, 0);//S_IRUSR -- if (IS_ERR(fp)) { -- bes_devel("BES2600 : can't open %s\n",file); -- return -1; -- } - --#ifdef BES2600_WRITE_DPD_TO_FILE -- if (fp->f_inode->i_size != DPD_BIN_FILE_SIZE) { -- bes_err( -- "bes2600 dpd data file size check failed, read_size: %lld file_size: %d\n", -- fp->f_inode->i_size, DPD_BIN_FILE_SIZE); -- filp_close(fp, NULL); -- return -1; -- } --#endif -- -- /* allocate memory for storing reading data */ -- read_data = kmalloc(fp->f_inode->i_size, GFP_KERNEL); -- if (read_data == NULL) { -- bes_devel("%s alloc mem fail\n", __func__); -- goto err1; -- } -- -- /* read data from file */ -- ret = kernel_read(fp, read_data, fp->f_inode->i_size, &fp->f_pos); -- if (ret < DPD_BIN_SIZE) { -- bes_err("%s read fail, ret=%d\n", __func__, ret); -- goto err2; -- } -- -- /* check dpd version and crc */ -- if (!bes2600_chrdev_dpd_is_vaild(read_data)) -- goto err2; -- -- /* close file */ -- filp_close(fp, NULL); -- -- /* copy data to external */ -- *data = read_data; -- *len = DPD_BIN_SIZE;; -- -- /* output debug information */ -- bes_devel("read dpd data from %s\n", file); - -- return 0; - --err2: -- kfree(read_data); --err1: -- filp_close(fp, NULL); -- *data = NULL; -- *len = 0; -- return -1; --} --#endif - - const u8* bes2600_chrdev_get_dpd_data(u32 *len) - { --#ifdef BES2600_WRITE_DPD_TO_FILE -- if (!bes2600_cdev.dpd_calied && bes2600_cdev.no_dpd) { -- /* read dpd data from file that stores factory dpd calibration data */ -- if ((bes2600_chrdev_read_and_check_dpd_data(BES2600_DPD_GOLDEN_PATH, -- &bes2600_cdev.dpd_data, &bes2600_cdev.dpd_len) < 0) && -- (bes2600_chrdev_read_and_check_dpd_data(BES2600_DEFAULT_DPD_PATH, -- &bes2600_cdev.dpd_data, &bes2600_cdev.dpd_len) < 0)) { -- bes_err("%s read dpd data fail\n", __func__); -- return NULL; -- } else { -- bes2600_cdev.dpd_calied = true; -- } -- } --#endif -- - if (!bes2600_cdev.dpd_calied) - return NULL; - if (len) -@@ -953,14 +270,6 @@ int bes2600_chrdev_update_dpd_data(void) - } - spin_unlock(&bes2600_cdev.status_lock); - --#ifdef BES2600_WRITE_DPD_TO_FILE -- /* write dpd data to file */ -- memset(bes2600_cdev.dpd_data + DPD_BIN_SIZE, 0, DPD_BIN_FILE_SIZE - DPD_BIN_SIZE); -- bes2600_chrdev_write_dpd_data_to_file(BES2600_DPD_PATH, -- bes2600_cdev.dpd_data, DPD_BIN_FILE_SIZE); --#endif -- -- - return 0; - } - -@@ -1078,6 +387,60 @@ int bes2600_chrdev_do_system_close(const struct sbus_ops *sbus_ops, struct sbus_ +@@ -1078,6 +1075,62 @@ int bes2600_chrdev_do_system_close(const struct sbus_ops *sbus_ops, struct sbus_ return ret; } @@ -1821,6 +1071,7 @@ index f89dcb8fb..fe46fc569 100644 + + return 0; +} ++EXPORT_SYMBOL_GPL(bes2600_chrdev_do_bus_reset); + +/* + * Trigger bes2600_chrdev_do_bus_reset() against the file-global @@ -1833,149 +1084,13 @@ index f89dcb8fb..fe46fc569 100644 + return bes2600_chrdev_do_bus_reset(bes2600_cdev.sbus_ops, + bes2600_cdev.sbus_priv); +} ++EXPORT_SYMBOL_GPL(bes2600_chrdev_trigger_bus_reset); + bool bes2600_chrdev_is_wifi_opened(void) { bool wifi_opened = false; -@@ -1126,7 +489,6 @@ void bes2600_chrdev_wakeup_bt(void) - bes_err("Wakeup BT fail in resume\n"); - } - } --EXPORT_SYMBOL_GPL(bes2600_chrdev_wakeup_bt); - - int bes2600_chrdev_get_fw_type(void) - { -@@ -1148,7 +510,6 @@ bool bes2600_chrdev_is_bus_error(void) - - return error; - } --EXPORT_SYMBOL_GPL(bes2600_chrdev_is_bus_error); - - void bes2600_chrdev_update_signal_mode(void) - { -@@ -1167,12 +528,6 @@ void bes2600_chrdev_update_signal_mode(void) - - static void bes2600_chrdev_wifi_force_close_work(struct work_struct *work) - { -- char wifi_state[15]; -- char bt_state[15]; -- char fw_type[15]; -- char *env[] = { wifi_state, bt_state, fw_type, NULL }; -- int ret; -- - if (bes2600_chrdev_is_wifi_opened()) { - bes_devel("system exeception, force wifi down\n"); - -@@ -1184,19 +539,24 @@ static void bes2600_chrdev_wifi_force_close_work(struct work_struct *work) - /* unregister wifi */ - bes2600_switch_wifi(0); - -- /* power down device if wifi is only opened */ -- if (bes2600_chrdev_check_system_close()) { -+ /* -+ * Hard exception with a bus_reset implementation: tear the -+ * bus down via mmc_hw_reset() (or equivalent) so the next -+ * bringup probes a freshly reset chip. On PineTab2 this is -+ * the only effective recovery path -- the existing -+ * power_switch(0)/(1) sequence has no chip-reset signal of -+ * its own (sdio_pwrseq owns wifi_reset). -+ * -+ * Soft close, or hard close on a board without bus_reset: -+ * fall back to the legacy power_switch(0) sequence. -+ */ -+ if (bes2600_cdev.halt_dev && bes2600_cdev.sbus_ops->bus_reset) { -+ bes2600_chrdev_do_bus_reset(bes2600_cdev.sbus_ops, -+ bes2600_cdev.sbus_priv); -+ } else if (bes2600_chrdev_check_system_close()) { - bes2600_chrdev_do_system_close(bes2600_cdev.sbus_ops, - bes2600_cdev.sbus_priv); - } -- -- /* notify userspace */ -- snprintf(wifi_state, sizeof(wifi_state), "WIFI_OPENED=%d", bes2600_cdev.wifi_opened); -- snprintf(bt_state, sizeof(bt_state), "BT_OPENED=%d", bes2600_cdev.bt_opened); -- snprintf(fw_type, sizeof(fw_type), "FW_TYPE=%d", bes2600_cdev.fw_type); -- ret = kobject_uevent_env(&bes2600_cdev.device->kobj, KOBJ_CHANGE, env); -- if (!ret) -- bes_err("bes2600 notify userspace failed\n"); - } - } - -@@ -1290,46 +650,6 @@ int bes2600_chrdev_wakeup_by_event_get(void) - - int bes2600_chrdev_init(struct sbus_ops *ops) - { -- int ret = 0; -- -- /* allocate devide id */ -- ret = alloc_chrdev_region(&bes2600_cdev.dev_id, 0, 1, "bes2600_chrdev"); -- if (ret < 0){ -- bes_err("bes2600 alloc device id fail\n"); -- ret = -EFAULT; -- goto fail; -- } -- -- /* extract major and minor device id */ -- bes2600_cdev.major = MAJOR(bes2600_cdev.dev_id); -- bes2600_cdev.minor = MINOR(bes2600_cdev.dev_id); -- -- /* add char device and bind operation function */ -- bes2600_cdev.cdev.owner = THIS_MODULE; -- cdev_init(&bes2600_cdev.cdev, &bes2600_chardev_fops); -- ret = cdev_add(&bes2600_cdev.cdev, bes2600_cdev.dev_id, 1); -- if (ret < 0){ -- bes_err("bes2600 char device add fail\n"); -- ret = -EFAULT; -- goto fail1; -- } -- -- /* create class for creating device node */ -- bes2600_cdev.class = class_create("bes2600_chrdev"); -- if (IS_ERR(bes2600_cdev.class)){ -- bes_err("bes2600 char device add fail\n"); -- ret = -EFAULT; -- goto fail2; -- } -- -- /* get char device pointer */ -- bes2600_cdev.device = device_create(bes2600_cdev.class, NULL, bes2600_cdev.dev_id, NULL, "bes2600"); -- if (IS_ERR(bes2600_cdev.device)){ -- bes_err("bes2600 char device create fail\n"); -- ret = -EFAULT; -- goto fail3; -- } -- - /* initialise global variable */ - atomic_set(&bes2600_cdev.num_proc, 0); - init_waitqueue_head(&bes2600_cdev.open_wq); -@@ -1361,15 +681,6 @@ int bes2600_chrdev_init(struct sbus_ops *ops) - bes_devel("%s done\n", __func__); - - return 0; -- --fail3: -- class_destroy(bes2600_cdev.class); --fail2: -- cdev_del(&bes2600_cdev.cdev); --fail1: -- unregister_chrdev_region(bes2600_cdev.dev_id, 1); --fail: -- return ret; - } - - void bes2600_chrdev_free(void) -@@ -1379,9 +690,5 @@ void bes2600_chrdev_free(void) - bes2600_free_dpd_log_buffer(); - #endif - bes2600_chrdev_free_dpd_data(); -- cdev_del(&bes2600_cdev.cdev); -- unregister_chrdev_region(bes2600_cdev.dev_id, 1); -- device_destroy(bes2600_cdev.class, bes2600_cdev.dev_id); -- class_destroy(bes2600_cdev.class); - bes_devel("%s done\n", __func__); - } diff --git a/drivers/staging/bes2600/bes_chardev.h b/drivers/staging/bes2600/bes_chardev.h -index c627bb7c3..9cd994cf2 100644 +index c627bb7c3..9edb2067a 100644 --- a/drivers/staging/bes2600/bes_chardev.h +++ b/drivers/staging/bes2600/bes_chardev.h @@ -1,12 +1,9 @@ @@ -1994,7 +1109,7 @@ index c627bb7c3..9cd994cf2 100644 */ #ifndef __BES_CHARDEV_H__ #define __BES_CHARDEV_H__ -@@ -60,10 +57,11 @@ struct sbus_priv *bes2600_chrdev_get_sbus_priv_data(void); +@@ -60,6 +57,8 @@ struct sbus_priv *bes2600_chrdev_get_sbus_priv_data(void); /* used to control device power down */ int bes2600_chrdev_check_system_close(void); int bes2600_chrdev_do_system_close(const struct sbus_ops *sbus_ops, struct sbus_priv *priv); @@ -2003,16 +1118,6 @@ index c627bb7c3..9cd994cf2 100644 void bes2600_chrdev_wakeup_bt(void); void bes2600_chrdev_wifi_force_close(struct bes2600_common *hw_priv, bool halt_dev); void bes2600_chrdev_usb_remove(struct bes2600_common *hw_priv); --int bes2600_chrdev_switch_subsys_glb(int wifi, int bt); - - /* get and set internal state */ - bool bes2600_chrdev_is_wifi_opened(void); -@@ -92,4 +90,5 @@ u8* bes2600_alloc_dpd_log_buffer(u16 len); - void bes2600_get_dpd_log(char **data, size_t *len); - #endif - -+ - #endif /* __BES_CHARDEV_H__ */ diff --git a/drivers/staging/bes2600/bes_fw.c b/drivers/staging/bes2600/bes_fw.c index 133c9453b..6c5598b94 100644 --- a/drivers/staging/bes2600/bes_fw.c diff --git a/danctnix-besser-pkgbuild/kernel/PKGBUILD b/danctnix-besser-pkgbuild/kernel/PKGBUILD index 60e77b824..76e2492b3 100644 --- a/danctnix-besser-pkgbuild/kernel/PKGBUILD +++ b/danctnix-besser-pkgbuild/kernel/PKGBUILD @@ -50,7 +50,7 @@ b2sums=('3d9795083c8938f80f480de0d10bfd9c525640e59d5c7f22983de3f12ee42c84c31be90 'SKIP' '71fe98221e802b315e54b4b10d3e8c8f376695a36bae3541d876e5776a37f3fa33c8f8dfa6e51fcbd6f5396add02e5166634165f2351836a0ea0453c172fe56c' 'SKIP' - '93fa699a467ed671632eae6e4b47cd544b1a591619d58a33e9be9fa3a77d21e108a57847517138b43ee12efbc11cd1ad848d14673ea4224b3d516783a0b5b0e7' + 'fca0a5badf762d5dbc085261cccc07ddeef96384d2ae0a426fb0412acd7a180e068cabd59f01342b7575d41889afc0f47dfbc9256801ab809f746278e6dab510' '19c35c69a4ed40635fb6ad108d2e0ed3d0edc682972255b4a9b719d09e377aa916e533b2e29f4aed256d3a393d77df9e11b661b690acd96edcf61eafe016f55b') export KBUILD_BUILD_HOST=archlinux