1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28#ifndef __OCTEON_NIC_H__
29#define __OCTEON_NIC_H__
30
31
32
33#define MAX_NCTRL_UDD 32
34
35typedef void (*octnic_ctrl_pkt_cb_fn_t) (void *);
36
37
38
39
40struct octnic_ctrl_pkt {
41
42 union octnet_cmd ncmd;
43
44
45 void *data;
46 u64 dmadata;
47
48
49 void *rdata;
50 u64 dmardata;
51
52
53 u64 udd[MAX_NCTRL_UDD];
54
55
56 u64 iq_no;
57
58
59
60
61 size_t wait_time;
62
63
64 u64 netpndev;
65
66
67 octnic_ctrl_pkt_cb_fn_t cb_fn;
68};
69
70#define MAX_UDD_SIZE(nctrl) (sizeof(nctrl->udd))
71
72
73
74
75struct octnic_data_pkt {
76
77
78
79 void *buf;
80
81
82 u32 reqtype;
83
84
85 u32 datasize;
86
87
88 union octeon_instr_64B cmd;
89
90
91 u32 q_no;
92
93};
94
95
96
97
98union octnic_cmd_setup {
99 struct {
100 u32 iq_no:8;
101 u32 gather:1;
102 u32 timestamp:1;
103 u32 ip_csum:1;
104 u32 transport_csum:1;
105 u32 tnl_csum:1;
106 u32 rsvd:19;
107
108 union {
109 u32 datasize;
110 u32 gatherptrs;
111 } u;
112 } s;
113
114 u64 u64;
115
116};
117
118static inline int octnet_iq_is_full(struct octeon_device *oct, u32 q_no)
119{
120 return ((u32)atomic_read(&oct->instr_queue[q_no]->instr_pending)
121 >= (oct->instr_queue[q_no]->max_count - 2));
122}
123
124static inline void
125octnet_prepare_pci_cmd_o2(struct octeon_device *oct,
126 union octeon_instr_64B *cmd,
127 union octnic_cmd_setup *setup, u32 tag)
128{
129 struct octeon_instr_ih2 *ih2;
130 struct octeon_instr_irh *irh;
131 union octnic_packet_params packet_params;
132 int port;
133
134 memset(cmd, 0, sizeof(union octeon_instr_64B));
135
136 ih2 = (struct octeon_instr_ih2 *)&cmd->cmd2.ih2;
137
138
139
140
141 ih2->fsz = LIO_PCICMD_O2;
142
143 ih2->tagtype = ORDERED_TAG;
144 ih2->grp = DEFAULT_POW_GRP;
145
146 port = (int)oct->instr_queue[setup->s.iq_no]->txpciq.s.port;
147
148 if (tag)
149 ih2->tag = tag;
150 else
151 ih2->tag = LIO_DATA(port);
152
153 ih2->raw = 1;
154 ih2->qos = (port & 3) + 4;
155
156 if (!setup->s.gather) {
157 ih2->dlengsz = setup->s.u.datasize;
158 } else {
159 ih2->gather = 1;
160 ih2->dlengsz = setup->s.u.gatherptrs;
161 }
162
163 irh = (struct octeon_instr_irh *)&cmd->cmd2.irh;
164
165 irh->opcode = OPCODE_NIC;
166 irh->subcode = OPCODE_NIC_NW_DATA;
167
168 packet_params.u32 = 0;
169
170 packet_params.s.ip_csum = setup->s.ip_csum;
171 packet_params.s.transport_csum = setup->s.transport_csum;
172 packet_params.s.tnl_csum = setup->s.tnl_csum;
173 packet_params.s.tsflag = setup->s.timestamp;
174
175 irh->ossp = packet_params.u32;
176}
177
178static inline void
179octnet_prepare_pci_cmd_o3(struct octeon_device *oct,
180 union octeon_instr_64B *cmd,
181 union octnic_cmd_setup *setup, u32 tag)
182{
183 struct octeon_instr_irh *irh;
184 struct octeon_instr_ih3 *ih3;
185 struct octeon_instr_pki_ih3 *pki_ih3;
186 union octnic_packet_params packet_params;
187 int port;
188
189 memset(cmd, 0, sizeof(union octeon_instr_64B));
190
191 ih3 = (struct octeon_instr_ih3 *)&cmd->cmd3.ih3;
192 pki_ih3 = (struct octeon_instr_pki_ih3 *)&cmd->cmd3.pki_ih3;
193
194
195
196
197 ih3->pkind = oct->instr_queue[setup->s.iq_no]->txpciq.s.pkind;
198
199 ih3->fsz = LIO_PCICMD_O3;
200
201 if (!setup->s.gather) {
202 ih3->dlengsz = setup->s.u.datasize;
203 } else {
204 ih3->gather = 1;
205 ih3->dlengsz = setup->s.u.gatherptrs;
206 }
207
208 pki_ih3->w = 1;
209 pki_ih3->raw = 1;
210 pki_ih3->utag = 1;
211 pki_ih3->utt = 1;
212 pki_ih3->uqpg = oct->instr_queue[setup->s.iq_no]->txpciq.s.use_qpg;
213
214 port = (int)oct->instr_queue[setup->s.iq_no]->txpciq.s.port;
215
216 if (tag)
217 pki_ih3->tag = tag;
218 else
219 pki_ih3->tag = LIO_DATA(port);
220
221 pki_ih3->tagtype = ORDERED_TAG;
222 pki_ih3->qpg = oct->instr_queue[setup->s.iq_no]->txpciq.s.qpg;
223 pki_ih3->pm = 0x7;
224 pki_ih3->sl = 8;
225
226 irh = (struct octeon_instr_irh *)&cmd->cmd3.irh;
227
228 irh->opcode = OPCODE_NIC;
229 irh->subcode = OPCODE_NIC_NW_DATA;
230
231 packet_params.u32 = 0;
232
233 packet_params.s.ip_csum = setup->s.ip_csum;
234 packet_params.s.transport_csum = setup->s.transport_csum;
235 packet_params.s.tnl_csum = setup->s.tnl_csum;
236 packet_params.s.tsflag = setup->s.timestamp;
237
238 irh->ossp = packet_params.u32;
239}
240
241
242
243
244
245
246
247
248static inline void
249octnet_prepare_pci_cmd(struct octeon_device *oct, union octeon_instr_64B *cmd,
250 union octnic_cmd_setup *setup, u32 tag)
251{
252 if (OCTEON_CN6XXX(oct))
253 octnet_prepare_pci_cmd_o2(oct, cmd, setup, tag);
254 else
255 octnet_prepare_pci_cmd_o3(oct, cmd, setup, tag);
256}
257
258
259
260
261
262
263
264
265
266
267
268void *
269octeon_alloc_soft_command_resp(struct octeon_device *oct,
270 union octeon_instr_64B *cmd,
271 u32 rdatasize);
272
273
274
275
276
277
278
279
280int octnet_send_nic_data_pkt(struct octeon_device *oct,
281 struct octnic_data_pkt *ndata);
282
283
284
285
286
287
288
289int
290octnet_send_nic_ctrl_pkt(struct octeon_device *oct,
291 struct octnic_ctrl_pkt *nctrl);
292
293#endif
294