diff options
Diffstat (limited to 'drivers/net/bna/bfa_ioc_ct.c')
-rw-r--r-- | drivers/net/bna/bfa_ioc_ct.c | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/drivers/net/bna/bfa_ioc_ct.c b/drivers/net/bna/bfa_ioc_ct.c index 469997c4ffd1..87aecdf22cf9 100644 --- a/drivers/net/bna/bfa_ioc_ct.c +++ b/drivers/net/bna/bfa_ioc_ct.c | |||
@@ -41,6 +41,7 @@ static void bfa_ioc_ct_map_port(struct bfa_ioc *ioc); | |||
41 | static void bfa_ioc_ct_isr_mode_set(struct bfa_ioc *ioc, bool msix); | 41 | static void bfa_ioc_ct_isr_mode_set(struct bfa_ioc *ioc, bool msix); |
42 | static void bfa_ioc_ct_notify_fail(struct bfa_ioc *ioc); | 42 | static void bfa_ioc_ct_notify_fail(struct bfa_ioc *ioc); |
43 | static void bfa_ioc_ct_ownership_reset(struct bfa_ioc *ioc); | 43 | static void bfa_ioc_ct_ownership_reset(struct bfa_ioc *ioc); |
44 | static bool bfa_ioc_ct_sync_start(struct bfa_ioc *ioc); | ||
44 | static void bfa_ioc_ct_sync_join(struct bfa_ioc *ioc); | 45 | static void bfa_ioc_ct_sync_join(struct bfa_ioc *ioc); |
45 | static void bfa_ioc_ct_sync_leave(struct bfa_ioc *ioc); | 46 | static void bfa_ioc_ct_sync_leave(struct bfa_ioc *ioc); |
46 | static void bfa_ioc_ct_sync_ack(struct bfa_ioc *ioc); | 47 | static void bfa_ioc_ct_sync_ack(struct bfa_ioc *ioc); |
@@ -63,6 +64,7 @@ bfa_nw_ioc_set_ct_hwif(struct bfa_ioc *ioc) | |||
63 | nw_hwif_ct.ioc_isr_mode_set = bfa_ioc_ct_isr_mode_set; | 64 | nw_hwif_ct.ioc_isr_mode_set = bfa_ioc_ct_isr_mode_set; |
64 | nw_hwif_ct.ioc_notify_fail = bfa_ioc_ct_notify_fail; | 65 | nw_hwif_ct.ioc_notify_fail = bfa_ioc_ct_notify_fail; |
65 | nw_hwif_ct.ioc_ownership_reset = bfa_ioc_ct_ownership_reset; | 66 | nw_hwif_ct.ioc_ownership_reset = bfa_ioc_ct_ownership_reset; |
67 | nw_hwif_ct.ioc_sync_start = bfa_ioc_ct_sync_start; | ||
66 | nw_hwif_ct.ioc_sync_join = bfa_ioc_ct_sync_join; | 68 | nw_hwif_ct.ioc_sync_join = bfa_ioc_ct_sync_join; |
67 | nw_hwif_ct.ioc_sync_leave = bfa_ioc_ct_sync_leave; | 69 | nw_hwif_ct.ioc_sync_leave = bfa_ioc_ct_sync_leave; |
68 | nw_hwif_ct.ioc_sync_ack = bfa_ioc_ct_sync_ack; | 70 | nw_hwif_ct.ioc_sync_ack = bfa_ioc_ct_sync_ack; |
@@ -345,6 +347,32 @@ bfa_ioc_ct_ownership_reset(struct bfa_ioc *ioc) | |||
345 | /** | 347 | /** |
346 | * Synchronized IOC failure processing routines | 348 | * Synchronized IOC failure processing routines |
347 | */ | 349 | */ |
350 | static bool | ||
351 | bfa_ioc_ct_sync_start(struct bfa_ioc *ioc) | ||
352 | { | ||
353 | u32 r32 = readl(ioc->ioc_regs.ioc_fail_sync); | ||
354 | u32 sync_reqd = bfa_ioc_ct_get_sync_reqd(r32); | ||
355 | |||
356 | /* | ||
357 | * Driver load time. If the sync required bit for this PCI fn | ||
358 | * is set, it is due to an unclean exit by the driver for this | ||
359 | * PCI fn in the previous incarnation. Whoever comes here first | ||
360 | * should clean it up, no matter which PCI fn. | ||
361 | */ | ||
362 | |||
363 | if (sync_reqd & bfa_ioc_ct_sync_pos(ioc)) { | ||
364 | writel(0, ioc->ioc_regs.ioc_fail_sync); | ||
365 | writel(1, ioc->ioc_regs.ioc_usage_reg); | ||
366 | writel(BFI_IOC_UNINIT, ioc->ioc_regs.ioc_fwstate); | ||
367 | writel(BFI_IOC_UNINIT, ioc->ioc_regs.alt_ioc_fwstate); | ||
368 | return true; | ||
369 | } | ||
370 | |||
371 | return bfa_ioc_ct_sync_complete(ioc); | ||
372 | } | ||
373 | /** | ||
374 | * Synchronized IOC failure processing routines | ||
375 | */ | ||
348 | static void | 376 | static void |
349 | bfa_ioc_ct_sync_join(struct bfa_ioc *ioc) | 377 | bfa_ioc_ct_sync_join(struct bfa_ioc *ioc) |
350 | { | 378 | { |