liquidio: fix rare pci_driver.probe failure of VF driver
There's a rare pci_driver.probe failure of the VF driver that's caused by PF/VF handshake going out of sync. The culprit is octeon_mbox_write() who ignores an ack timeout condition; it just keeps unconditionally writing all elements of mbox_cmd->data[] even when the other side is not ready for them. Fix it by making each write of mbox_cmd->data[i] conditional to having previously received an ack. Also fix the octeon_mbox_state enum such that each state gets a unique value. Also add ULL suffix to numeric literals in macro definitions. Signed-off-by: Prasad Kanneganti <prasad.kanneganti@cavium.com> Signed-off-by: Felix Manlunas <felix.manlunas@cavium.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
ae782dec2c
commit
d5c7d9b934
|
@ -178,7 +178,10 @@ int octeon_mbox_write(struct octeon_device *oct,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
writeq(mbox_cmd->data[i], mbox->mbox_write_reg);
|
if (ret == OCTEON_MBOX_STATUS_SUCCESS)
|
||||||
|
writeq(mbox_cmd->data[i], mbox->mbox_write_reg);
|
||||||
|
else
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -20,16 +20,16 @@
|
||||||
|
|
||||||
/* Macros for Mail Box Communication */
|
/* Macros for Mail Box Communication */
|
||||||
|
|
||||||
#define OCTEON_MBOX_DATA_MAX 32
|
#define OCTEON_MBOX_DATA_MAX 32
|
||||||
|
|
||||||
#define OCTEON_VF_ACTIVE 0x1
|
#define OCTEON_VF_ACTIVE 0x1
|
||||||
#define OCTEON_VF_FLR_REQUEST 0x2
|
#define OCTEON_VF_FLR_REQUEST 0x2
|
||||||
#define OCTEON_PF_CHANGED_VF_MACADDR 0x4
|
#define OCTEON_PF_CHANGED_VF_MACADDR 0x4
|
||||||
|
|
||||||
/*Macro for Read acknowldgement*/
|
/*Macro for Read acknowldgement*/
|
||||||
#define OCTEON_PFVFACK 0xffffffffffffffff
|
#define OCTEON_PFVFACK 0xffffffffffffffffULL
|
||||||
#define OCTEON_PFVFSIG 0x1122334455667788
|
#define OCTEON_PFVFSIG 0x1122334455667788ULL
|
||||||
#define OCTEON_PFVFERR 0xDEADDEADDEADDEAD
|
#define OCTEON_PFVFERR 0xDEADDEADDEADDEADULL
|
||||||
|
|
||||||
#define LIO_MBOX_WRITE_WAIT_CNT 1000
|
#define LIO_MBOX_WRITE_WAIT_CNT 1000
|
||||||
#define LIO_MBOX_WRITE_WAIT_TIME msecs_to_jiffies(1)
|
#define LIO_MBOX_WRITE_WAIT_TIME msecs_to_jiffies(1)
|
||||||
|
@ -74,8 +74,8 @@ enum octeon_mbox_state {
|
||||||
OCTEON_MBOX_STATE_REQUEST_RECEIVED = 4,
|
OCTEON_MBOX_STATE_REQUEST_RECEIVED = 4,
|
||||||
OCTEON_MBOX_STATE_RESPONSE_PENDING = 8,
|
OCTEON_MBOX_STATE_RESPONSE_PENDING = 8,
|
||||||
OCTEON_MBOX_STATE_RESPONSE_RECEIVING = 16,
|
OCTEON_MBOX_STATE_RESPONSE_RECEIVING = 16,
|
||||||
OCTEON_MBOX_STATE_RESPONSE_RECEIVED = 16,
|
OCTEON_MBOX_STATE_RESPONSE_RECEIVED = 32,
|
||||||
OCTEON_MBOX_STATE_ERROR = 32
|
OCTEON_MBOX_STATE_ERROR = 64
|
||||||
};
|
};
|
||||||
|
|
||||||
struct octeon_mbox {
|
struct octeon_mbox {
|
||||||
|
|
Loading…
Reference in New Issue