Commit 0d1b57c1 authored by Adham Abozaeid's avatar Adham Abozaeid Committed by Greg Kroah-Hartman

staging: wilc1000: Don't reset WILC CPU disgracefully

Send abort request to WILC from wilc_wlan_stop instead of resetting the
CPU.
The abort request was being sent from wilc_wlan_cleanup after the CPU
was reset which wasn't the correct order. The abort request handler
in the chip will take care of resetting the CPU.
Signed-off-by: default avatarAdham Abozaeid <adham.abozaeid@microchip.com>
Link: https://lore.kernel.org/r/20190809182510.22443-2-adham.abozaeid@microchip.comSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent b2a878de
...@@ -475,7 +475,7 @@ static void wilc_wlan_deinitialize(struct net_device *dev) ...@@ -475,7 +475,7 @@ static void wilc_wlan_deinitialize(struct net_device *dev)
wlan_deinitialize_threads(dev); wlan_deinitialize_threads(dev);
deinit_irq(dev); deinit_irq(dev);
wilc_wlan_stop(wl); wilc_wlan_stop(wl, vif);
wilc_wlan_cleanup(dev); wilc_wlan_cleanup(dev);
wlan_deinit_locks(dev); wlan_deinit_locks(dev);
...@@ -573,7 +573,7 @@ static int wilc_wlan_initialize(struct net_device *dev, struct wilc_vif *vif) ...@@ -573,7 +573,7 @@ static int wilc_wlan_initialize(struct net_device *dev, struct wilc_vif *vif)
return 0; return 0;
fail_fw_start: fail_fw_start:
wilc_wlan_stop(wl); wilc_wlan_stop(wl, vif);
fail_irq_enable: fail_irq_enable:
if (!wl->dev_irq_num && if (!wl->dev_irq_num &&
......
...@@ -968,60 +968,42 @@ int wilc_wlan_start(struct wilc *wilc) ...@@ -968,60 +968,42 @@ int wilc_wlan_start(struct wilc *wilc)
return (ret < 0) ? ret : 0; return (ret < 0) ? ret : 0;
} }
int wilc_wlan_stop(struct wilc *wilc) int wilc_wlan_stop(struct wilc *wilc, struct wilc_vif *vif)
{ {
u32 reg = 0; u32 reg = 0;
int ret; int ret;
u8 timeout = 10;
acquire_bus(wilc, WILC_BUS_ACQUIRE_AND_WAKEUP); acquire_bus(wilc, WILC_BUS_ACQUIRE_AND_WAKEUP);
ret = wilc->hif_func->hif_read_reg(wilc, WILC_GLB_RESET_0, &reg); ret = wilc->hif_func->hif_read_reg(wilc, WILC_GP_REG_0, &reg);
if (!ret) { if (!ret) {
netdev_err(vif->ndev, "Error while reading reg\n");
release_bus(wilc, WILC_BUS_RELEASE_ALLOW_SLEEP); release_bus(wilc, WILC_BUS_RELEASE_ALLOW_SLEEP);
return ret; return ret;
} }
reg &= ~BIT(10); ret = wilc->hif_func->hif_write_reg(wilc, WILC_GP_REG_0,
ret = wilc->hif_func->hif_write_reg(wilc, WILC_GLB_RESET_0, reg); (reg | WILC_ABORT_REQ_BIT));
if (!ret) { if (!ret) {
netdev_err(vif->ndev, "Error while writing reg\n");
release_bus(wilc, WILC_BUS_RELEASE_ALLOW_SLEEP); release_bus(wilc, WILC_BUS_RELEASE_ALLOW_SLEEP);
return ret; return ret;
} }
do { ret = wilc->hif_func->hif_read_reg(wilc, WILC_FW_HOST_COMM, &reg);
ret = wilc->hif_func->hif_read_reg(wilc, if (!ret) {
WILC_GLB_RESET_0, &reg); netdev_err(vif->ndev, "Error while reading reg\n");
if (!ret) { release_bus(wilc, WILC_BUS_RELEASE_ALLOW_SLEEP);
release_bus(wilc, WILC_BUS_RELEASE_ALLOW_SLEEP); return ret;
return ret; }
} reg = BIT(0);
if ((reg & BIT(10))) {
reg &= ~BIT(10);
ret = wilc->hif_func->hif_write_reg(wilc,
WILC_GLB_RESET_0,
reg);
timeout--;
} else {
ret = wilc->hif_func->hif_read_reg(wilc,
WILC_GLB_RESET_0,
&reg);
if (!ret) {
release_bus(wilc, WILC_BUS_RELEASE_ALLOW_SLEEP);
return ret;
}
break;
}
} while (timeout);
reg = (BIT(0) | BIT(1) | BIT(2) | BIT(3) | BIT(8) | BIT(9) | BIT(26) |
BIT(29) | BIT(30) | BIT(31));
wilc->hif_func->hif_write_reg(wilc, WILC_GLB_RESET_0, reg);
reg = (u32)~BIT(10);
ret = wilc->hif_func->hif_write_reg(wilc, WILC_GLB_RESET_0, reg); ret = wilc->hif_func->hif_write_reg(wilc, WILC_FW_HOST_COMM, reg);
if (!ret) {
netdev_err(vif->ndev, "Error while writing reg\n");
release_bus(wilc, WILC_BUS_RELEASE_ALLOW_SLEEP);
return ret;
}
release_bus(wilc, WILC_BUS_RELEASE_ALLOW_SLEEP); release_bus(wilc, WILC_BUS_RELEASE_ALLOW_SLEEP);
...@@ -1032,8 +1014,6 @@ void wilc_wlan_cleanup(struct net_device *dev) ...@@ -1032,8 +1014,6 @@ void wilc_wlan_cleanup(struct net_device *dev)
{ {
struct txq_entry_t *tqe; struct txq_entry_t *tqe;
struct rxq_entry_t *rqe; struct rxq_entry_t *rqe;
u32 reg = 0;
int ret;
struct wilc_vif *vif = netdev_priv(dev); struct wilc_vif *vif = netdev_priv(dev);
struct wilc *wilc = vif->wilc; struct wilc *wilc = vif->wilc;
...@@ -1058,23 +1038,6 @@ void wilc_wlan_cleanup(struct net_device *dev) ...@@ -1058,23 +1038,6 @@ void wilc_wlan_cleanup(struct net_device *dev)
wilc->rx_buffer = NULL; wilc->rx_buffer = NULL;
kfree(wilc->tx_buffer); kfree(wilc->tx_buffer);
wilc->tx_buffer = NULL; wilc->tx_buffer = NULL;
acquire_bus(wilc, WILC_BUS_ACQUIRE_AND_WAKEUP);
ret = wilc->hif_func->hif_read_reg(wilc, WILC_GP_REG_0, &reg);
if (!ret) {
release_bus(wilc, WILC_BUS_RELEASE_ALLOW_SLEEP);
return;
}
ret = wilc->hif_func->hif_write_reg(wilc, WILC_GP_REG_0,
(reg | ABORT_INT));
if (!ret) {
release_bus(wilc, WILC_BUS_RELEASE_ALLOW_SLEEP);
return;
}
release_bus(wilc, WILC_BUS_RELEASE_ALLOW_SLEEP);
wilc->hif_func->hif_deinit(NULL); wilc->hif_func->hif_deinit(NULL);
} }
......
...@@ -98,6 +98,7 @@ ...@@ -98,6 +98,7 @@
#define WILC_VMM_TBL_RX_SHADOW_BASE WILC_AHB_SHARE_MEM_BASE #define WILC_VMM_TBL_RX_SHADOW_BASE WILC_AHB_SHARE_MEM_BASE
#define WILC_VMM_TBL_RX_SHADOW_SIZE 256 #define WILC_VMM_TBL_RX_SHADOW_SIZE 256
#define WILC_FW_HOST_COMM 0x13c0
#define WILC_GP_REG_0 0x149c #define WILC_GP_REG_0 0x149c
#define WILC_GP_REG_1 0x14a0 #define WILC_GP_REG_1 0x14a0
...@@ -129,7 +130,7 @@ ...@@ -129,7 +130,7 @@
#define WILC_PLL_TO_SDIO 4 #define WILC_PLL_TO_SDIO 4
#define WILC_PLL_TO_SPI 2 #define WILC_PLL_TO_SPI 2
#define ABORT_INT BIT(31) #define WILC_ABORT_REQ_BIT BIT(31)
#define WILC_RX_BUFF_SIZE (96 * 1024) #define WILC_RX_BUFF_SIZE (96 * 1024)
#define WILC_TX_BUFF_SIZE (64 * 1024) #define WILC_TX_BUFF_SIZE (64 * 1024)
...@@ -280,7 +281,7 @@ struct wilc_vif; ...@@ -280,7 +281,7 @@ struct wilc_vif;
int wilc_wlan_firmware_download(struct wilc *wilc, const u8 *buffer, int wilc_wlan_firmware_download(struct wilc *wilc, const u8 *buffer,
u32 buffer_size); u32 buffer_size);
int wilc_wlan_start(struct wilc *wilc); int wilc_wlan_start(struct wilc *wilc);
int wilc_wlan_stop(struct wilc *wilc); int wilc_wlan_stop(struct wilc *wilc, struct wilc_vif *vif);
int wilc_wlan_txq_add_net_pkt(struct net_device *dev, void *priv, u8 *buffer, int wilc_wlan_txq_add_net_pkt(struct net_device *dev, void *priv, u8 *buffer,
u32 buffer_size, u32 buffer_size,
void (*tx_complete_fn)(void *, int)); void (*tx_complete_fn)(void *, int));
......
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