1/**********************************************************************
2 * Author: Cavium, Inc.
3 *
4 * Contact: support@cavium.com
5 * Please include "LiquidIO" in the subject.
6 *
7 * Copyright (c) 2003-2016 Cavium, Inc.
8 *
9 * This file is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License, Version 2, as
11 * published by the Free Software Foundation.
12 *
13 * This file is distributed in the hope that it will be useful, but
14 * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
15 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
16 * NONINFRINGEMENT. See the GNU General Public License for more details.
17 ***********************************************************************/
18#ifndef __MAILBOX_H__
19#define __MAILBOX_H__
20
21/* Macros for Mail Box Communication */
22
23#define OCTEON_MBOX_DATA_MAX 32
24
25#define OCTEON_VF_ACTIVE 0x1
26#define OCTEON_VF_FLR_REQUEST 0x2
27#define OCTEON_PF_CHANGED_VF_MACADDR 0x4
28#define OCTEON_GET_VF_STATS 0x8
29
30/*Macro for Read acknowldgement*/
31#define OCTEON_PFVFACK 0xffffffffffffffffULL
32#define OCTEON_PFVFSIG 0x1122334455667788ULL
33#define OCTEON_PFVFERR 0xDEADDEADDEADDEADULL
34
35#define LIO_MBOX_WRITE_WAIT_CNT 1000
36#define LIO_MBOX_WRITE_WAIT_TIME msecs_to_jiffies(1)
37
38enum octeon_mbox_cmd_status {
39 OCTEON_MBOX_STATUS_SUCCESS = 0,
40 OCTEON_MBOX_STATUS_FAILED = 1,
41 OCTEON_MBOX_STATUS_BUSY = 2
42};
43
44enum octeon_mbox_message_type {
45 OCTEON_MBOX_REQUEST = 0,
46 OCTEON_MBOX_RESPONSE = 1
47};
48
49union octeon_mbox_message {
50 u64 u64;
51 struct {
52 u16 type : 1;
53 u16 resp_needed : 1;
54 u16 cmd : 6;
55 u16 len : 8;
56 u8 params[6];
57 } s;
58};
59
60struct octeon_mbox_cmd;
61
62typedef void (*octeon_mbox_callback_t)(struct octeon_device *,
63 struct octeon_mbox_cmd *, void *);
64
65struct octeon_mbox_cmd {
66 union octeon_mbox_message msg;
67 u64 data[OCTEON_MBOX_DATA_MAX];
68 u32 q_no;
69 u32 recv_len;
70 u32 recv_status;
71 octeon_mbox_callback_t fn;
72 void *fn_arg;
73};
74
75enum octeon_mbox_state {
76 OCTEON_MBOX_STATE_IDLE = 1,
77 OCTEON_MBOX_STATE_REQUEST_RECEIVING = 2,
78 OCTEON_MBOX_STATE_REQUEST_RECEIVED = 4,
79 OCTEON_MBOX_STATE_RESPONSE_PENDING = 8,
80 OCTEON_MBOX_STATE_RESPONSE_RECEIVING = 16,
81 OCTEON_MBOX_STATE_RESPONSE_RECEIVED = 32,
82 OCTEON_MBOX_STATE_ERROR = 64
83};
84
85struct octeon_mbox {
86 /** A spinlock to protect access to this q_mbox. */
87 spinlock_t lock;
88
89 struct octeon_device *oct_dev;
90
91 u32 q_no;
92
93 enum octeon_mbox_state state;
94
95 struct cavium_wk mbox_poll_wk;
96
97 /** SLI_MAC_PF_MBOX_INT for PF, SLI_PKT_MBOX_INT for VF. */
98 void *mbox_int_reg;
99
100 /** SLI_PKT_PF_VF_MBOX_SIG(0) for PF, SLI_PKT_PF_VF_MBOX_SIG(1) for VF.
101 */
102 void *mbox_write_reg;
103
104 /** SLI_PKT_PF_VF_MBOX_SIG(1) for PF, SLI_PKT_PF_VF_MBOX_SIG(0) for VF.
105 */
106 void *mbox_read_reg;
107
108 struct octeon_mbox_cmd mbox_req;
109
110 struct octeon_mbox_cmd mbox_resp;
111
112};
113
114struct oct_vf_stats_ctx {
115 atomic_t status;
116 struct oct_vf_stats *stats;
117};
118
119int octeon_mbox_read(struct octeon_mbox *mbox);
120int octeon_mbox_write(struct octeon_device *oct,
121 struct octeon_mbox_cmd *mbox_cmd);
122int octeon_mbox_process_message(struct octeon_mbox *mbox);
123int octeon_mbox_cancel(struct octeon_device *oct, int q_no);
124
125#endif
126

source code of linux/drivers/net/ethernet/cavium/liquidio/octeon_mailbox.h