Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d4e16d42 authored by Rasesh Mody's avatar Rasesh Mody Committed by David S. Miller
Browse files

bna: Add HW Semaphore Unlock Logic



Change details:
 - Added logic to unlock hw semaphore if the previos FW boot was from boot
   code (flash based) and the current FW initialization attempt is from OS
   driver.

Signed-off-by: default avatarRasesh Mody <rmody@brocade.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent f374b361
Loading
Loading
Loading
Loading
+25 −0
Original line number Diff line number Diff line
@@ -58,6 +58,7 @@ static bool bfa_nw_auto_recover = true;
/*
 * forward declarations
 */
static void bfa_ioc_hw_sem_init(struct bfa_ioc *ioc);
static void bfa_ioc_hw_sem_get(struct bfa_ioc *ioc);
static void bfa_ioc_hw_sem_get_cancel(struct bfa_ioc *ioc);
static void bfa_ioc_hwinit(struct bfa_ioc *ioc, bool force);
@@ -590,6 +591,7 @@ bfa_iocpf_sm_reset(struct bfa_iocpf *iocpf, enum iocpf_event event)
static void
bfa_iocpf_sm_fwcheck_entry(struct bfa_iocpf *iocpf)
{
	bfa_ioc_hw_sem_init(iocpf->ioc);
	bfa_ioc_hw_sem_get(iocpf->ioc);
}

@@ -1175,6 +1177,29 @@ bfa_nw_ioc_sem_release(void __iomem *sem_reg)
	writel(1, sem_reg);
}

static void
bfa_ioc_hw_sem_init(struct bfa_ioc *ioc)
{
	struct bfi_ioc_image_hdr fwhdr;
	u32 fwstate = readl(ioc->ioc_regs.ioc_fwstate);

	if (fwstate == BFI_IOC_UNINIT)
		return;

	bfa_nw_ioc_fwver_get(ioc, &fwhdr);

	if (swab32(fwhdr.exec) == BFI_FWBOOT_TYPE_NORMAL)
		return;

	writel(BFI_IOC_UNINIT, ioc->ioc_regs.ioc_fwstate);

	/*
	 * Try to lock and then unlock the semaphore.
	 */
	readl(ioc->ioc_regs.ioc_sem_reg);
	writel(1, ioc->ioc_regs.ioc_sem_reg);
}

static void
bfa_ioc_hw_sem_get(struct bfa_ioc *ioc)
{
+6 −0
Original line number Diff line number Diff line
@@ -289,6 +289,12 @@ struct bfi_ioc_image_hdr {
	u32	md5sum[BFI_IOC_MD5SUM_SZ];
};

enum bfi_fwboot_type {
	BFI_FWBOOT_TYPE_NORMAL	= 0,
	BFI_FWBOOT_TYPE_FLASH	= 1,
	BFI_FWBOOT_TYPE_MEMTEST	= 2,
};

/**
 *  BFI_IOC_I2H_READY_EVENT message
 */