Commit bf534588 authored by Vijaya Mohan Guvva's avatar Vijaya Mohan Guvva Committed by David S. Miller

liquidio: Fix an issue with multiple switchdev enable disables

Return success if the same dispatch function is being registered for
a given opcode and subcode, there by allow multiple switchdev enable
and disables.
Signed-off-by: default avatarVijaya Mohan Guvva <vijaya.guvva@cavium.com>
Signed-off-by: default avatarSatanand Burla <satananda.burla@cavium.com>
Signed-off-by: default avatarFelix Manlunas <felix.manlunas@cavium.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent de4cc8bd
...@@ -1180,6 +1180,10 @@ octeon_register_dispatch_fn(struct octeon_device *oct, ...@@ -1180,6 +1180,10 @@ octeon_register_dispatch_fn(struct octeon_device *oct,
spin_unlock_bh(&oct->dispatch.lock); spin_unlock_bh(&oct->dispatch.lock);
} else { } else {
if (pfn == fn &&
octeon_get_dispatch_arg(oct, opcode, subcode) == fn_arg)
return 0;
dev_err(&oct->pci_dev->dev, dev_err(&oct->pci_dev->dev,
"Found previously registered dispatch fn for opcode/subcode: %x/%x\n", "Found previously registered dispatch fn for opcode/subcode: %x/%x\n",
opcode, subcode); opcode, subcode);
......
...@@ -52,8 +52,8 @@ struct __dispatch { ...@@ -52,8 +52,8 @@ struct __dispatch {
* @return Failure: NULL * @return Failure: NULL
* *
*/ */
static inline void *octeon_get_dispatch_arg(struct octeon_device *octeon_dev, void *octeon_get_dispatch_arg(struct octeon_device *octeon_dev,
u16 opcode, u16 subcode) u16 opcode, u16 subcode)
{ {
int idx; int idx;
struct list_head *dispatch; struct list_head *dispatch;
......
...@@ -400,6 +400,9 @@ int octeon_register_dispatch_fn(struct octeon_device *oct, ...@@ -400,6 +400,9 @@ int octeon_register_dispatch_fn(struct octeon_device *oct,
u16 subcode, u16 subcode,
octeon_dispatch_fn_t fn, void *fn_arg); octeon_dispatch_fn_t fn, void *fn_arg);
void *octeon_get_dispatch_arg(struct octeon_device *oct,
u16 opcode, u16 subcode);
void octeon_droq_print_stats(void); void octeon_droq_print_stats(void);
u32 octeon_droq_check_hw_for_pkts(struct octeon_droq *droq); u32 octeon_droq_check_hw_for_pkts(struct octeon_droq *droq);
......
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