2 * Linux network driver for Brocade Converged Network Adapter.
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License (GPL) Version 2 as
6 * published by the Free Software Foundation
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 * General Public License for more details.
14 * Copyright (c) 2005-2010 Brocade Communications Systems, Inc.
19 #include "bfa_defs_cna.h"
25 #define bfa_ioc_portid(__ioc) ((__ioc)->port_id)
26 #define bfa_lpuid(__arg) bfa_ioc_portid(&(__arg)->ioc)
28 static void bfa_cee_format_lldp_cfg(struct bfa_cee_lldp_cfg
*lldp_cfg
);
29 static void bfa_cee_format_cee_cfg(void *buffer
);
32 bfa_cee_format_cee_cfg(void *buffer
)
34 struct bfa_cee_attr
*cee_cfg
= buffer
;
35 bfa_cee_format_lldp_cfg(&cee_cfg
->lldp_remote
);
39 bfa_cee_stats_swap(struct bfa_cee_stats
*stats
)
41 u32
*buffer
= (u32
*)stats
;
44 for (i
= 0; i
< (sizeof(struct bfa_cee_stats
) / sizeof(u32
));
46 buffer
[i
] = ntohl(buffer
[i
]);
51 bfa_cee_format_lldp_cfg(struct bfa_cee_lldp_cfg
*lldp_cfg
)
53 lldp_cfg
->time_to_live
=
54 ntohs(lldp_cfg
->time_to_live
);
55 lldp_cfg
->enabled_system_cap
=
56 ntohs(lldp_cfg
->enabled_system_cap
);
60 * bfa_cee_attr_meminfo()
62 * @brief Returns the size of the DMA memory needed by CEE attributes
66 * @return Size of DMA region
69 bfa_cee_attr_meminfo(void)
71 return roundup(sizeof(struct bfa_cee_attr
), BFA_DMA_ALIGN_SZ
);
74 * bfa_cee_stats_meminfo()
76 * @brief Returns the size of the DMA memory needed by CEE stats
80 * @return Size of DMA region
83 bfa_cee_stats_meminfo(void)
85 return roundup(sizeof(struct bfa_cee_stats
), BFA_DMA_ALIGN_SZ
);
89 * bfa_cee_get_attr_isr()
91 * @brief CEE ISR for get-attributes responses from f/w
93 * @param[in] cee - Pointer to the CEE module
94 * status - Return status from the f/w
99 bfa_cee_get_attr_isr(struct bfa_cee
*cee
, enum bfa_status status
)
101 cee
->get_attr_status
= status
;
102 if (status
== BFA_STATUS_OK
) {
103 memcpy(cee
->attr
, cee
->attr_dma
.kva
,
104 sizeof(struct bfa_cee_attr
));
105 bfa_cee_format_cee_cfg(cee
->attr
);
107 cee
->get_attr_pending
= false;
108 if (cee
->cbfn
.get_attr_cbfn
)
109 cee
->cbfn
.get_attr_cbfn(cee
->cbfn
.get_attr_cbarg
, status
);
113 * bfa_cee_get_attr_isr()
115 * @brief CEE ISR for get-stats responses from f/w
117 * @param[in] cee - Pointer to the CEE module
118 * status - Return status from the f/w
123 bfa_cee_get_stats_isr(struct bfa_cee
*cee
, enum bfa_status status
)
125 cee
->get_stats_status
= status
;
126 if (status
== BFA_STATUS_OK
) {
127 memcpy(cee
->stats
, cee
->stats_dma
.kva
,
128 sizeof(struct bfa_cee_stats
));
129 bfa_cee_stats_swap(cee
->stats
);
131 cee
->get_stats_pending
= false;
132 if (cee
->cbfn
.get_stats_cbfn
)
133 cee
->cbfn
.get_stats_cbfn(cee
->cbfn
.get_stats_cbarg
, status
);
137 * bfa_cee_get_attr_isr()
139 * @brief CEE ISR for reset-stats responses from f/w
141 * @param[in] cee - Pointer to the CEE module
142 * status - Return status from the f/w
147 bfa_cee_reset_stats_isr(struct bfa_cee
*cee
, enum bfa_status status
)
149 cee
->reset_stats_status
= status
;
150 cee
->reset_stats_pending
= false;
151 if (cee
->cbfn
.reset_stats_cbfn
)
152 cee
->cbfn
.reset_stats_cbfn(cee
->cbfn
.reset_stats_cbarg
, status
);
157 * @brief Returns the size of the DMA memory needed by CEE module
161 * @return Size of DMA region
164 bfa_cee_meminfo(void)
166 return bfa_cee_attr_meminfo() + bfa_cee_stats_meminfo();
170 * bfa_cee_mem_claim()
172 * @brief Initialized CEE DMA Memory
174 * @param[in] cee CEE module pointer
175 * dma_kva Kernel Virtual Address of CEE DMA Memory
176 * dma_pa Physical Address of CEE DMA Memory
181 bfa_cee_mem_claim(struct bfa_cee
*cee
, u8
*dma_kva
, u64 dma_pa
)
183 cee
->attr_dma
.kva
= dma_kva
;
184 cee
->attr_dma
.pa
= dma_pa
;
185 cee
->stats_dma
.kva
= dma_kva
+ bfa_cee_attr_meminfo();
186 cee
->stats_dma
.pa
= dma_pa
+ bfa_cee_attr_meminfo();
187 cee
->attr
= (struct bfa_cee_attr
*) dma_kva
;
188 cee
->stats
= (struct bfa_cee_stats
*)
189 (dma_kva
+ bfa_cee_attr_meminfo());
196 * Send the request to the f/w to fetch CEE attributes.
198 * @param[in] Pointer to the CEE module data structure.
204 bfa_cee_get_attr(struct bfa_cee
*cee
, struct bfa_cee_attr
*attr
,
205 bfa_cee_get_attr_cbfn_t cbfn
, void *cbarg
)
207 struct bfi_cee_get_req
*cmd
;
209 BUG_ON(!((cee
!= NULL
) && (cee
->ioc
!= NULL
)));
210 if (!bfa_ioc_is_operational(cee
->ioc
))
211 return BFA_STATUS_IOC_FAILURE
;
212 if (cee
->get_attr_pending
== true)
213 return BFA_STATUS_DEVBUSY
;
214 cee
->get_attr_pending
= true;
215 cmd
= (struct bfi_cee_get_req
*) cee
->get_cfg_mb
.msg
;
217 cee
->cbfn
.get_attr_cbfn
= cbfn
;
218 cee
->cbfn
.get_attr_cbarg
= cbarg
;
219 bfi_h2i_set(cmd
->mh
, BFI_MC_CEE
, BFI_CEE_H2I_GET_CFG_REQ
,
220 bfa_ioc_portid(cee
->ioc
));
221 bfa_dma_be_addr_set(cmd
->dma_addr
, cee
->attr_dma
.pa
);
222 bfa_ioc_mbox_queue(cee
->ioc
, &cee
->get_cfg_mb
);
224 return BFA_STATUS_OK
;
228 * bfa_cee_get_stats()
231 * Send the request to the f/w to fetch CEE statistics.
233 * @param[in] Pointer to the CEE module data structure.
239 bfa_cee_get_stats(struct bfa_cee
*cee
, struct bfa_cee_stats
*stats
,
240 bfa_cee_get_stats_cbfn_t cbfn
, void *cbarg
)
242 struct bfi_cee_get_req
*cmd
;
244 BUG_ON(!((cee
!= NULL
) && (cee
->ioc
!= NULL
)));
246 if (!bfa_ioc_is_operational(cee
->ioc
))
247 return BFA_STATUS_IOC_FAILURE
;
248 if (cee
->get_stats_pending
== true)
249 return BFA_STATUS_DEVBUSY
;
250 cee
->get_stats_pending
= true;
251 cmd
= (struct bfi_cee_get_req
*) cee
->get_stats_mb
.msg
;
253 cee
->cbfn
.get_stats_cbfn
= cbfn
;
254 cee
->cbfn
.get_stats_cbarg
= cbarg
;
255 bfi_h2i_set(cmd
->mh
, BFI_MC_CEE
, BFI_CEE_H2I_GET_STATS_REQ
,
256 bfa_ioc_portid(cee
->ioc
));
257 bfa_dma_be_addr_set(cmd
->dma_addr
, cee
->stats_dma
.pa
);
258 bfa_ioc_mbox_queue(cee
->ioc
, &cee
->get_stats_mb
);
260 return BFA_STATUS_OK
;
264 * bfa_cee_reset_stats()
266 * @brief Clears CEE Stats in the f/w.
268 * @param[in] Pointer to the CEE module data structure.
274 bfa_cee_reset_stats(struct bfa_cee
*cee
, bfa_cee_reset_stats_cbfn_t cbfn
,
277 struct bfi_cee_reset_stats
*cmd
;
279 BUG_ON(!((cee
!= NULL
) && (cee
->ioc
!= NULL
)));
280 if (!bfa_ioc_is_operational(cee
->ioc
))
281 return BFA_STATUS_IOC_FAILURE
;
282 if (cee
->reset_stats_pending
== true)
283 return BFA_STATUS_DEVBUSY
;
284 cee
->reset_stats_pending
= true;
285 cmd
= (struct bfi_cee_reset_stats
*) cee
->reset_stats_mb
.msg
;
286 cee
->cbfn
.reset_stats_cbfn
= cbfn
;
287 cee
->cbfn
.reset_stats_cbarg
= cbarg
;
288 bfi_h2i_set(cmd
->mh
, BFI_MC_CEE
, BFI_CEE_H2I_RESET_STATS
,
289 bfa_ioc_portid(cee
->ioc
));
290 bfa_ioc_mbox_queue(cee
->ioc
, &cee
->reset_stats_mb
);
291 return BFA_STATUS_OK
;
297 * @brief Handles Mail-box interrupts for CEE module.
299 * @param[in] Pointer to the CEE module data structure.
305 bfa_cee_isr(void *cbarg
, struct bfi_mbmsg
*m
)
307 union bfi_cee_i2h_msg_u
*msg
;
308 struct bfi_cee_get_rsp
*get_rsp
;
309 struct bfa_cee
*cee
= (struct bfa_cee
*) cbarg
;
310 msg
= (union bfi_cee_i2h_msg_u
*) m
;
311 get_rsp
= (struct bfi_cee_get_rsp
*) m
;
312 switch (msg
->mh
.msg_id
) {
313 case BFI_CEE_I2H_GET_CFG_RSP
:
314 bfa_cee_get_attr_isr(cee
, get_rsp
->cmd_status
);
316 case BFI_CEE_I2H_GET_STATS_RSP
:
317 bfa_cee_get_stats_isr(cee
, get_rsp
->cmd_status
);
319 case BFI_CEE_I2H_RESET_STATS_RSP
:
320 bfa_cee_reset_stats_isr(cee
, get_rsp
->cmd_status
);
330 * @brief CEE module heart-beat failure handler.
332 * @param[in] Pointer to the CEE module data structure.
338 bfa_cee_hbfail(void *arg
)
341 cee
= (struct bfa_cee
*) arg
;
343 if (cee
->get_attr_pending
== true) {
344 cee
->get_attr_status
= BFA_STATUS_FAILED
;
345 cee
->get_attr_pending
= false;
346 if (cee
->cbfn
.get_attr_cbfn
) {
347 cee
->cbfn
.get_attr_cbfn(cee
->cbfn
.get_attr_cbarg
,
351 if (cee
->get_stats_pending
== true) {
352 cee
->get_stats_status
= BFA_STATUS_FAILED
;
353 cee
->get_stats_pending
= false;
354 if (cee
->cbfn
.get_stats_cbfn
) {
355 cee
->cbfn
.get_stats_cbfn(cee
->cbfn
.get_stats_cbarg
,
359 if (cee
->reset_stats_pending
== true) {
360 cee
->reset_stats_status
= BFA_STATUS_FAILED
;
361 cee
->reset_stats_pending
= false;
362 if (cee
->cbfn
.reset_stats_cbfn
) {
363 cee
->cbfn
.reset_stats_cbfn(cee
->cbfn
.reset_stats_cbarg
,
372 * @brief CEE module-attach API
374 * @param[in] cee - Pointer to the CEE module data structure
375 * ioc - Pointer to the ioc module data structure
376 * dev - Pointer to the device driver module data structure
377 * The device driver specific mbox ISR functions have
378 * this pointer as one of the parameters.
383 bfa_cee_attach(struct bfa_cee
*cee
, struct bfa_ioc
*ioc
,
386 BUG_ON(!(cee
!= NULL
));
390 bfa_ioc_mbox_regisr(cee
->ioc
, BFI_MC_CEE
, bfa_cee_isr
, cee
);
391 bfa_ioc_hbfail_init(&cee
->hbfail
, bfa_cee_hbfail
, cee
);
392 bfa_ioc_hbfail_register(cee
->ioc
, &cee
->hbfail
);
398 * @brief CEE module-detach API
400 * @param[in] cee - Pointer to the CEE module data structure
405 bfa_cee_detach(struct bfa_cee
*cee
)