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: Adham Abozaeid <adham.abozaeid@microchip.com> Link: https://lore.kernel.org/r/20190809182510.22443-2-adham.abozaeid@microchip.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
b2a878de11
commit
0d1b57c1f0
@ -475,7 +475,7 @@ static void wilc_wlan_deinitialize(struct net_device *dev)
|
||||
wlan_deinitialize_threads(dev);
|
||||
deinit_irq(dev);
|
||||
|
||||
wilc_wlan_stop(wl);
|
||||
wilc_wlan_stop(wl, vif);
|
||||
wilc_wlan_cleanup(dev);
|
||||
wlan_deinit_locks(dev);
|
||||
|
||||
@ -573,7 +573,7 @@ static int wilc_wlan_initialize(struct net_device *dev, struct wilc_vif *vif)
|
||||
return 0;
|
||||
|
||||
fail_fw_start:
|
||||
wilc_wlan_stop(wl);
|
||||
wilc_wlan_stop(wl, vif);
|
||||
|
||||
fail_irq_enable:
|
||||
if (!wl->dev_irq_num &&
|
||||
|
@ -968,60 +968,42 @@ int wilc_wlan_start(struct wilc *wilc)
|
||||
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;
|
||||
int ret;
|
||||
u8 timeout = 10;
|
||||
|
||||
acquire_bus(wilc, WILC_BUS_ACQUIRE_AND_WAKEUP);
|
||||
|
||||
ret = wilc->hif_func->hif_read_reg(wilc, WILC_GLB_RESET_0, ®);
|
||||
ret = wilc->hif_func->hif_read_reg(wilc, WILC_GP_REG_0, ®);
|
||||
if (!ret) {
|
||||
netdev_err(vif->ndev, "Error while reading reg\n");
|
||||
release_bus(wilc, WILC_BUS_RELEASE_ALLOW_SLEEP);
|
||||
return ret;
|
||||
}
|
||||
|
||||
reg &= ~BIT(10);
|
||||
ret = wilc->hif_func->hif_write_reg(wilc, WILC_GLB_RESET_0, reg);
|
||||
ret = wilc->hif_func->hif_write_reg(wilc, WILC_GP_REG_0,
|
||||
(reg | WILC_ABORT_REQ_BIT));
|
||||
if (!ret) {
|
||||
netdev_err(vif->ndev, "Error while writing reg\n");
|
||||
release_bus(wilc, WILC_BUS_RELEASE_ALLOW_SLEEP);
|
||||
return ret;
|
||||
}
|
||||
|
||||
do {
|
||||
ret = wilc->hif_func->hif_read_reg(wilc,
|
||||
WILC_GLB_RESET_0, ®);
|
||||
if (!ret) {
|
||||
release_bus(wilc, WILC_BUS_RELEASE_ALLOW_SLEEP);
|
||||
return ret;
|
||||
}
|
||||
ret = wilc->hif_func->hif_read_reg(wilc, WILC_FW_HOST_COMM, ®);
|
||||
if (!ret) {
|
||||
netdev_err(vif->ndev, "Error while reading reg\n");
|
||||
release_bus(wilc, WILC_BUS_RELEASE_ALLOW_SLEEP);
|
||||
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,
|
||||
®);
|
||||
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);
|
||||
|
||||
@ -1032,8 +1014,6 @@ void wilc_wlan_cleanup(struct net_device *dev)
|
||||
{
|
||||
struct txq_entry_t *tqe;
|
||||
struct rxq_entry_t *rqe;
|
||||
u32 reg = 0;
|
||||
int ret;
|
||||
struct wilc_vif *vif = netdev_priv(dev);
|
||||
struct wilc *wilc = vif->wilc;
|
||||
|
||||
@ -1058,23 +1038,6 @@ void wilc_wlan_cleanup(struct net_device *dev)
|
||||
wilc->rx_buffer = NULL;
|
||||
kfree(wilc->tx_buffer);
|
||||
wilc->tx_buffer = NULL;
|
||||
|
||||
acquire_bus(wilc, WILC_BUS_ACQUIRE_AND_WAKEUP);
|
||||
|
||||
ret = wilc->hif_func->hif_read_reg(wilc, WILC_GP_REG_0, ®);
|
||||
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);
|
||||
}
|
||||
|
||||
|
@ -98,6 +98,7 @@
|
||||
#define WILC_VMM_TBL_RX_SHADOW_BASE WILC_AHB_SHARE_MEM_BASE
|
||||
#define WILC_VMM_TBL_RX_SHADOW_SIZE 256
|
||||
|
||||
#define WILC_FW_HOST_COMM 0x13c0
|
||||
#define WILC_GP_REG_0 0x149c
|
||||
#define WILC_GP_REG_1 0x14a0
|
||||
|
||||
@ -129,7 +130,7 @@
|
||||
|
||||
#define WILC_PLL_TO_SDIO 4
|
||||
#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_TX_BUFF_SIZE (64 * 1024)
|
||||
@ -280,7 +281,7 @@ struct wilc_vif;
|
||||
int wilc_wlan_firmware_download(struct wilc *wilc, const u8 *buffer,
|
||||
u32 buffer_size);
|
||||
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,
|
||||
u32 buffer_size,
|
||||
void (*tx_complete_fn)(void *, int));
|
||||
|
Loading…
x
Reference in New Issue
Block a user