Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
bfa_ioc.h
Go to the documentation of this file.
1 /*
2  * Linux network driver for Brocade Converged Network Adapter.
3  *
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
7  *
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.
12  */
13 /*
14  * Copyright (c) 2005-2010 Brocade Communications Systems, Inc.
15  * All rights reserved
16  * www.brocade.com
17  */
18 
19 #ifndef __BFA_IOC_H__
20 #define __BFA_IOC_H__
21 
22 #include "bfa_cs.h"
23 #include "bfi.h"
24 #include "cna.h"
25 
26 #define BFA_IOC_TOV 3000 /* msecs */
27 #define BFA_IOC_HWSEM_TOV 500 /* msecs */
28 #define BFA_IOC_HB_TOV 500 /* msecs */
29 #define BFA_IOC_POLL_TOV 200 /* msecs */
30 #define BNA_DBG_FWTRC_LEN (BFI_IOC_TRC_ENTS * BFI_IOC_TRC_ENT_SZ + \
31  BFI_IOC_TRC_HDR_SZ)
32 
33 /* PCI device information required by IOC */
34 struct bfa_pcidev {
35  int pci_slot;
40 };
41 
42 /* Structure used to remember the DMA-able memory block's KVA and Physical
43  * Address
44  */
45 struct bfa_dma {
46  void *kva; /* ! Kernel virtual address */
47  u64 pa; /* ! Physical address */
48 };
49 
50 #define BFA_DMA_ALIGN_SZ 256
51 
52 /* smem size for Crossbow and Catapult */
53 #define BFI_SMEM_CB_SIZE 0x200000U /* ! 2MB for crossbow */
54 #define BFI_SMEM_CT_SIZE 0x280000U /* ! 2.5MB for catapult */
55 
56 /* BFA dma address assignment macro. (big endian format) */
57 #define bfa_dma_be_addr_set(dma_addr, pa) \
58  __bfa_dma_be_addr_set(&dma_addr, (u64)pa)
59 static inline void
60 __bfa_dma_be_addr_set(union bfi_addr_u *dma_addr, u64 pa)
61 {
62  dma_addr->a32.addr_lo = (u32) htonl(pa);
63  dma_addr->a32.addr_hi = (u32) htonl(upper_32_bits(pa));
64 }
65 
66 #define bfa_alen_set(__alen, __len, __pa) \
67  __bfa_alen_set(__alen, __len, (u64)__pa)
68 
69 static inline void
70 __bfa_alen_set(struct bfi_alen *alen, u32 len, u64 pa)
71 {
72  alen->al_len = cpu_to_be32(len);
73  bfa_dma_be_addr_set(alen->al_addr, pa);
74 }
75 
76 struct bfa_ioc_regs {
102 };
103 
104 /* IOC Mailbox structures */
105 typedef void (*bfa_mbox_cmd_cbfn_t)(void *cbarg);
106 struct bfa_mbox_cmd {
107  struct list_head qe;
109  void *cbarg;
111 };
112 
113 /* IOC mailbox module */
114 typedef void (*bfa_ioc_mbox_mcfunc_t)(void *cbarg, struct bfi_mbmsg *m);
116  struct list_head cmd_q;
117  int nmclass;
118  struct {
120  void *cbarg;
121  } mbhdlr[BFI_MC_MAX];
122 };
123 
124 /* IOC callback function interfaces */
125 typedef void (*bfa_ioc_enable_cbfn_t)(void *bfa, enum bfa_status status);
126 typedef void (*bfa_ioc_disable_cbfn_t)(void *bfa);
127 typedef void (*bfa_ioc_hbfail_cbfn_t)(void *bfa);
128 typedef void (*bfa_ioc_reset_cbfn_t)(void *bfa);
129 struct bfa_ioc_cbfn {
134 };
135 
136 /* IOC event notification mechanism. */
141 };
142 
143 typedef void (*bfa_ioc_notify_cbfn_t)(void *, enum bfa_ioc_event);
144 
146  struct list_head qe;
148  void *cbarg;
149 };
150 
151 /* Initialize a IOC event notification structure */
152 #define bfa_ioc_notify_init(__notify, __cbfn, __cbarg) do { \
153  (__notify)->cbfn = (__cbfn); \
154  (__notify)->cbarg = (__cbarg); \
155 } while (0)
156 
157 struct bfa_iocpf {
159  struct bfa_ioc *ioc;
163 };
164 
165 struct bfa_ioc {
167  struct bfa *bfa;
175  void *dbg_fwsave;
181  bool fcmode;
182  bool pllinit;
183  bool stats_busy;
185 
190  const struct bfa_ioc_hwif *ioc_hwif;
191  struct bfa_iocpf iocpf;
199 };
200 
201 struct bfa_ioc_hwif {
203  enum bfi_asic_mode m);
206  void (*ioc_reg_init) (struct bfa_ioc *ioc);
207  void (*ioc_map_port) (struct bfa_ioc *ioc);
209  bool msix);
215  void (*ioc_sync_ack) (struct bfa_ioc *ioc);
218 };
219 
220 #define bfa_ioc_pcifn(__ioc) ((__ioc)->pcidev.pci_func)
221 #define bfa_ioc_devid(__ioc) ((__ioc)->pcidev.device_id)
222 #define bfa_ioc_bar0(__ioc) ((__ioc)->pcidev.pci_bar_kva)
223 #define bfa_ioc_portid(__ioc) ((__ioc)->port_id)
224 #define bfa_ioc_asic_gen(__ioc) ((__ioc)->asic_gen)
225 #define bfa_ioc_fetch_stats(__ioc, __stats) \
226  (((__stats)->drv_stats) = (__ioc)->stats)
227 #define bfa_ioc_clr_stats(__ioc) \
228  memset(&(__ioc)->stats, 0, sizeof((__ioc)->stats))
229 #define bfa_ioc_maxfrsize(__ioc) ((__ioc)->attr->maxfrsize)
230 #define bfa_ioc_rx_bbcredit(__ioc) ((__ioc)->attr->rx_bbcredit)
231 #define bfa_ioc_speed_sup(__ioc) \
232  BFI_ADAPTER_GETP(SPEED, (__ioc)->attr->adapter_prop)
233 #define bfa_ioc_get_nports(__ioc) \
234  BFI_ADAPTER_GETP(NPORTS, (__ioc)->attr->adapter_prop)
235 
236 #define bfa_ioc_stats(_ioc, _stats) ((_ioc)->stats._stats++)
237 #define bfa_ioc_stats_hb_count(_ioc, _hb_count) \
238  ((_ioc)->stats.hb_count = (_hb_count))
239 #define BFA_IOC_FWIMG_MINSZ (16 * 1024)
240 #define BFA_IOC_FW_SMEM_SIZE(__ioc) \
241  ((bfa_ioc_asic_gen(__ioc) == BFI_ASIC_GEN_CB) \
242  ? BFI_SMEM_CB_SIZE : BFI_SMEM_CT_SIZE)
243 #define BFA_IOC_FLASH_CHUNK_NO(off) (off / BFI_FLASH_CHUNK_SZ_WORDS)
244 #define BFA_IOC_FLASH_OFFSET_IN_CHUNK(off) (off % BFI_FLASH_CHUNK_SZ_WORDS)
245 #define BFA_IOC_FLASH_CHUNK_ADDR(chunkno) (chunkno * BFI_FLASH_CHUNK_SZ_WORDS)
246 
247 /* IOC mailbox interface */
248 bool bfa_nw_ioc_mbox_queue(struct bfa_ioc *ioc,
249  struct bfa_mbox_cmd *cmd,
250  bfa_mbox_cmd_cbfn_t cbfn, void *cbarg);
251 void bfa_nw_ioc_mbox_isr(struct bfa_ioc *ioc);
252 void bfa_nw_ioc_mbox_regisr(struct bfa_ioc *ioc, enum bfi_mclass mc,
253  bfa_ioc_mbox_mcfunc_t cbfn, void *cbarg);
254 
255 /* IOC interfaces */
256 
257 #define bfa_ioc_pll_init_asic(__ioc) \
258  ((__ioc)->ioc_hwif->ioc_pll_init((__ioc)->pcidev.pci_bar_kva, \
259  (__ioc)->asic_mode))
260 
261 #define bfa_ioc_isr_mode_set(__ioc, __msix) do { \
262  if ((__ioc)->ioc_hwif->ioc_isr_mode_set) \
263  ((__ioc)->ioc_hwif->ioc_isr_mode_set(__ioc, __msix)); \
264 } while (0)
265 #define bfa_ioc_ownership_reset(__ioc) \
266  ((__ioc)->ioc_hwif->ioc_ownership_reset(__ioc))
267 
268 #define bfa_ioc_lpu_read_stat(__ioc) do { \
269  if ((__ioc)->ioc_hwif->ioc_lpu_read_stat) \
270  ((__ioc)->ioc_hwif->ioc_lpu_read_stat(__ioc)); \
271 } while (0)
272 
273 void bfa_nw_ioc_set_ct_hwif(struct bfa_ioc *ioc);
274 void bfa_nw_ioc_set_ct2_hwif(struct bfa_ioc *ioc);
275 void bfa_nw_ioc_ct2_poweron(struct bfa_ioc *ioc);
276 
277 void bfa_nw_ioc_attach(struct bfa_ioc *ioc, void *bfa,
278  struct bfa_ioc_cbfn *cbfn);
279 void bfa_nw_ioc_auto_recover(bool auto_recover);
280 void bfa_nw_ioc_detach(struct bfa_ioc *ioc);
281 void bfa_nw_ioc_pci_init(struct bfa_ioc *ioc, struct bfa_pcidev *pcidev,
282  enum bfi_pcifn_class clscode);
283 u32 bfa_nw_ioc_meminfo(void);
284 void bfa_nw_ioc_mem_claim(struct bfa_ioc *ioc, u8 *dm_kva, u64 dm_pa);
285 void bfa_nw_ioc_enable(struct bfa_ioc *ioc);
286 void bfa_nw_ioc_disable(struct bfa_ioc *ioc);
287 
288 void bfa_nw_ioc_error_isr(struct bfa_ioc *ioc);
289 bool bfa_nw_ioc_is_disabled(struct bfa_ioc *ioc);
291 void bfa_nw_ioc_get_attr(struct bfa_ioc *ioc, struct bfa_ioc_attr *ioc_attr);
293  struct bfa_ioc_notify *notify);
294 bool bfa_nw_ioc_sem_get(void __iomem *sem_reg);
295 void bfa_nw_ioc_sem_release(void __iomem *sem_reg);
297 void bfa_nw_ioc_fwver_get(struct bfa_ioc *ioc,
298  struct bfi_ioc_image_hdr *fwhdr);
299 bool bfa_nw_ioc_fwver_cmp(struct bfa_ioc *ioc,
300  struct bfi_ioc_image_hdr *fwhdr);
302 void bfa_nw_ioc_debug_memclaim(struct bfa_ioc *ioc, void *dbg_fwsave);
303 int bfa_nw_ioc_debug_fwtrc(struct bfa_ioc *ioc, void *trcdata, int *trclen);
304 int bfa_nw_ioc_debug_fwsave(struct bfa_ioc *ioc, void *trcdata, int *trclen);
305 
306 /*
307  * Timeout APIs
308  */
309 void bfa_nw_ioc_timeout(void *ioc);
310 void bfa_nw_ioc_hb_check(void *ioc);
311 void bfa_nw_iocpf_timeout(void *ioc);
312 void bfa_nw_iocpf_sem_timeout(void *ioc);
313 
314 /*
315  * F/W Image Size & Chunk
316  */
319 
320 /*
321  * Flash module specific
322  */
323 typedef void (*bfa_cb_flash) (void *cbarg, enum bfa_status status);
324 
325 struct bfa_flash {
326  struct bfa_ioc *ioc; /* back pointer to ioc */
327  u32 type; /* partition type */
328  u8 instance; /* partition instance */
329  u8 rsv[3];
330  u32 op_busy; /* operation busy flag */
331  u32 residue; /* residual length */
332  u32 offset; /* offset */
333  enum bfa_status status; /* status */
334  u8 *dbuf_kva; /* dma buf virtual address */
335  u64 dbuf_pa; /* dma buf physical address */
336  bfa_cb_flash cbfn; /* user callback function */
337  void *cbarg; /* user callback arg */
338  u8 *ubuf; /* user supplied buffer */
339  u32 addr_off; /* partition address offset */
340  struct bfa_mbox_cmd mb; /* mailbox */
341  struct bfa_ioc_notify ioc_notify; /* ioc event notify */
342 };
343 
345  struct bfa_flash_attr *attr,
346  bfa_cb_flash cbfn, void *cbarg);
348  u32 type, u8 instance, void *buf, u32 len, u32 offset,
349  bfa_cb_flash cbfn, void *cbarg);
351  u32 type, u8 instance, void *buf, u32 len, u32 offset,
352  bfa_cb_flash cbfn, void *cbarg);
354 void bfa_nw_flash_attach(struct bfa_flash *flash,
355  struct bfa_ioc *ioc, void *dev);
356 void bfa_nw_flash_memclaim(struct bfa_flash *flash, u8 *dm_kva, u64 dm_pa);
357 
358 #endif /* __BFA_IOC_H__ */