1 /* 2 * Copyright (c) 2005-2010 Brocade Communications Systems, Inc. 3 * All rights reserved 4 * www.brocade.com 5 * 6 * Linux driver for Brocade Fibre Channel Host Bus Adapter. 7 * 8 * This program is free software; you can redistribute it and/or modify it 9 * under the terms of the GNU General Public License (GPL) Version 2 as 10 * published by the Free Software Foundation 11 * 12 * This program is distributed in the hope that it will be useful, but 13 * WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15 * General Public License for more details. 16 */ 17 18 #ifndef __BFA_IOC_H__ 19 #define __BFA_IOC_H__ 20 21 #include "bfa_os_inc.h" 22 #include "bfa_cs.h" 23 #include "bfi.h" 24 25 /* 26 * BFA timer declarations 27 */ 28 typedef void (*bfa_timer_cbfn_t)(void *); 29 30 /* 31 * BFA timer data structure 32 */ 33 struct bfa_timer_s { 34 struct list_head qe; 35 bfa_timer_cbfn_t timercb; 36 void *arg; 37 int timeout; /* in millisecs */ 38 }; 39 40 /* 41 * Timer module structure 42 */ 43 struct bfa_timer_mod_s { 44 struct list_head timer_q; 45 }; 46 47 #define BFA_TIMER_FREQ 200 /* specified in millisecs */ 48 49 void bfa_timer_beat(struct bfa_timer_mod_s *mod); 50 void bfa_timer_init(struct bfa_timer_mod_s *mod); 51 void bfa_timer_begin(struct bfa_timer_mod_s *mod, struct bfa_timer_s *timer, 52 bfa_timer_cbfn_t timercb, void *arg, 53 unsigned int timeout); 54 void bfa_timer_stop(struct bfa_timer_s *timer); 55 56 /* 57 * Generic Scatter Gather Element used by driver 58 */ 59 struct bfa_sge_s { 60 u32 sg_len; 61 void *sg_addr; 62 }; 63 64 #define bfa_sge_word_swap(__sge) do { \ 65 ((u32 *)(__sge))[0] = swab32(((u32 *)(__sge))[0]); \ 66 ((u32 *)(__sge))[1] = swab32(((u32 *)(__sge))[1]); \ 67 ((u32 *)(__sge))[2] = swab32(((u32 *)(__sge))[2]); \ 68 } while (0) 69 70 #define bfa_swap_words(_x) ( \ 71 ((_x) << 32) | ((_x) >> 32)) 72 73 #ifdef __BIGENDIAN 74 #define bfa_sge_to_be(_x) 75 #define bfa_sge_to_le(_x) bfa_sge_word_swap(_x) 76 #define bfa_sgaddr_le(_x) bfa_swap_words(_x) 77 #else 78 #define bfa_sge_to_be(_x) bfa_sge_word_swap(_x) 79 #define bfa_sge_to_le(_x) 80 #define bfa_sgaddr_le(_x) (_x) 81 #endif 82 83 /* 84 * PCI device information required by IOC 85 */ 86 struct bfa_pcidev_s { 87 int pci_slot; 88 u8 pci_func; 89 u16 device_id; 90 void __iomem *pci_bar_kva; 91 }; 92 93 /* 94 * Structure used to remember the DMA-able memory block's KVA and Physical 95 * Address 96 */ 97 struct bfa_dma_s { 98 void *kva; /* ! Kernel virtual address */ 99 u64 pa; /* ! Physical address */ 100 }; 101 102 #define BFA_DMA_ALIGN_SZ 256 103 #define BFA_ROUNDUP(_l, _s) (((_l) + ((_s) - 1)) & ~((_s) - 1)) 104 105 /* 106 * smem size for Crossbow and Catapult 107 */ 108 #define BFI_SMEM_CB_SIZE 0x200000U /* ! 2MB for crossbow */ 109 #define BFI_SMEM_CT_SIZE 0x280000U /* ! 2.5MB for catapult */ 110 111 112 #define bfa_dma_addr_set(dma_addr, pa) \ 113 __bfa_dma_addr_set(&dma_addr, (u64)pa) 114 115 static inline void 116 __bfa_dma_addr_set(union bfi_addr_u *dma_addr, u64 pa) 117 { 118 dma_addr->a32.addr_lo = (u32) pa; 119 dma_addr->a32.addr_hi = (u32) (bfa_os_u32(pa)); 120 } 121 122 123 #define bfa_dma_be_addr_set(dma_addr, pa) \ 124 __bfa_dma_be_addr_set(&dma_addr, (u64)pa) 125 static inline void 126 __bfa_dma_be_addr_set(union bfi_addr_u *dma_addr, u64 pa) 127 { 128 dma_addr->a32.addr_lo = (u32) cpu_to_be32(pa); 129 dma_addr->a32.addr_hi = (u32) cpu_to_be32(bfa_os_u32(pa)); 130 } 131 132 struct bfa_ioc_regs_s { 133 void __iomem *hfn_mbox_cmd; 134 void __iomem *hfn_mbox; 135 void __iomem *lpu_mbox_cmd; 136 void __iomem *lpu_mbox; 137 void __iomem *pss_ctl_reg; 138 void __iomem *pss_err_status_reg; 139 void __iomem *app_pll_fast_ctl_reg; 140 void __iomem *app_pll_slow_ctl_reg; 141 void __iomem *ioc_sem_reg; 142 void __iomem *ioc_usage_sem_reg; 143 void __iomem *ioc_init_sem_reg; 144 void __iomem *ioc_usage_reg; 145 void __iomem *host_page_num_fn; 146 void __iomem *heartbeat; 147 void __iomem *ioc_fwstate; 148 void __iomem *ll_halt; 149 void __iomem *err_set; 150 void __iomem *shirq_isr_next; 151 void __iomem *shirq_msk_next; 152 void __iomem *smem_page_start; 153 u32 smem_pg0; 154 }; 155 156 #define bfa_mem_read(_raddr, _off) swab32(readl(((_raddr) + (_off)))) 157 #define bfa_mem_write(_raddr, _off, _val) \ 158 writel(swab32((_val)), ((_raddr) + (_off))) 159 /* 160 * IOC Mailbox structures 161 */ 162 struct bfa_mbox_cmd_s { 163 struct list_head qe; 164 u32 msg[BFI_IOC_MSGSZ]; 165 }; 166 167 /* 168 * IOC mailbox module 169 */ 170 typedef void (*bfa_ioc_mbox_mcfunc_t)(void *cbarg, struct bfi_mbmsg_s *m); 171 struct bfa_ioc_mbox_mod_s { 172 struct list_head cmd_q; /* pending mbox queue */ 173 int nmclass; /* number of handlers */ 174 struct { 175 bfa_ioc_mbox_mcfunc_t cbfn; /* message handlers */ 176 void *cbarg; 177 } mbhdlr[BFI_MC_MAX]; 178 }; 179 180 /* 181 * IOC callback function interfaces 182 */ 183 typedef void (*bfa_ioc_enable_cbfn_t)(void *bfa, enum bfa_status status); 184 typedef void (*bfa_ioc_disable_cbfn_t)(void *bfa); 185 typedef void (*bfa_ioc_hbfail_cbfn_t)(void *bfa); 186 typedef void (*bfa_ioc_reset_cbfn_t)(void *bfa); 187 struct bfa_ioc_cbfn_s { 188 bfa_ioc_enable_cbfn_t enable_cbfn; 189 bfa_ioc_disable_cbfn_t disable_cbfn; 190 bfa_ioc_hbfail_cbfn_t hbfail_cbfn; 191 bfa_ioc_reset_cbfn_t reset_cbfn; 192 }; 193 194 /* 195 * Heartbeat failure notification queue element. 196 */ 197 struct bfa_ioc_hbfail_notify_s { 198 struct list_head qe; 199 bfa_ioc_hbfail_cbfn_t cbfn; 200 void *cbarg; 201 }; 202 203 /* 204 * Initialize a heartbeat failure notification structure 205 */ 206 #define bfa_ioc_hbfail_init(__notify, __cbfn, __cbarg) do { \ 207 (__notify)->cbfn = (__cbfn); \ 208 (__notify)->cbarg = (__cbarg); \ 209 } while (0) 210 211 struct bfa_iocpf_s { 212 bfa_fsm_t fsm; 213 struct bfa_ioc_s *ioc; 214 u32 retry_count; 215 bfa_boolean_t auto_recover; 216 }; 217 218 struct bfa_ioc_s { 219 bfa_fsm_t fsm; 220 struct bfa_s *bfa; 221 struct bfa_pcidev_s pcidev; 222 struct bfa_timer_mod_s *timer_mod; 223 struct bfa_timer_s ioc_timer; 224 struct bfa_timer_s sem_timer; 225 struct bfa_timer_s hb_timer; 226 u32 hb_count; 227 struct list_head hb_notify_q; 228 void *dbg_fwsave; 229 int dbg_fwsave_len; 230 bfa_boolean_t dbg_fwsave_once; 231 enum bfi_mclass ioc_mc; 232 struct bfa_ioc_regs_s ioc_regs; 233 struct bfa_trc_mod_s *trcmod; 234 struct bfa_ioc_drv_stats_s stats; 235 bfa_boolean_t fcmode; 236 bfa_boolean_t ctdev; 237 bfa_boolean_t cna; 238 bfa_boolean_t pllinit; 239 bfa_boolean_t stats_busy; /* outstanding stats */ 240 u8 port_id; 241 struct bfa_dma_s attr_dma; 242 struct bfi_ioc_attr_s *attr; 243 struct bfa_ioc_cbfn_s *cbfn; 244 struct bfa_ioc_mbox_mod_s mbox_mod; 245 struct bfa_ioc_hwif_s *ioc_hwif; 246 struct bfa_iocpf_s iocpf; 247 }; 248 249 struct bfa_ioc_hwif_s { 250 bfa_status_t (*ioc_pll_init) (void __iomem *rb, bfa_boolean_t fcmode); 251 bfa_boolean_t (*ioc_firmware_lock) (struct bfa_ioc_s *ioc); 252 void (*ioc_firmware_unlock) (struct bfa_ioc_s *ioc); 253 void (*ioc_reg_init) (struct bfa_ioc_s *ioc); 254 void (*ioc_map_port) (struct bfa_ioc_s *ioc); 255 void (*ioc_isr_mode_set) (struct bfa_ioc_s *ioc, 256 bfa_boolean_t msix); 257 void (*ioc_notify_hbfail) (struct bfa_ioc_s *ioc); 258 void (*ioc_ownership_reset) (struct bfa_ioc_s *ioc); 259 }; 260 261 #define bfa_ioc_pcifn(__ioc) ((__ioc)->pcidev.pci_func) 262 #define bfa_ioc_devid(__ioc) ((__ioc)->pcidev.device_id) 263 #define bfa_ioc_bar0(__ioc) ((__ioc)->pcidev.pci_bar_kva) 264 #define bfa_ioc_portid(__ioc) ((__ioc)->port_id) 265 #define bfa_ioc_fetch_stats(__ioc, __stats) \ 266 (((__stats)->drv_stats) = (__ioc)->stats) 267 #define bfa_ioc_clr_stats(__ioc) \ 268 memset(&(__ioc)->stats, 0, sizeof((__ioc)->stats)) 269 #define bfa_ioc_maxfrsize(__ioc) ((__ioc)->attr->maxfrsize) 270 #define bfa_ioc_rx_bbcredit(__ioc) ((__ioc)->attr->rx_bbcredit) 271 #define bfa_ioc_speed_sup(__ioc) \ 272 BFI_ADAPTER_GETP(SPEED, (__ioc)->attr->adapter_prop) 273 #define bfa_ioc_get_nports(__ioc) \ 274 BFI_ADAPTER_GETP(NPORTS, (__ioc)->attr->adapter_prop) 275 276 #define bfa_ioc_stats(_ioc, _stats) ((_ioc)->stats._stats++) 277 #define BFA_IOC_FWIMG_MINSZ (16 * 1024) 278 #define BFA_IOC_FWIMG_TYPE(__ioc) \ 279 (((__ioc)->ctdev) ? \ 280 (((__ioc)->fcmode) ? BFI_IMAGE_CT_FC : BFI_IMAGE_CT_CNA) : \ 281 BFI_IMAGE_CB_FC) 282 #define BFA_IOC_FW_SMEM_SIZE(__ioc) \ 283 (((__ioc)->ctdev) ? BFI_SMEM_CT_SIZE : BFI_SMEM_CB_SIZE) 284 #define BFA_IOC_FLASH_CHUNK_NO(off) (off / BFI_FLASH_CHUNK_SZ_WORDS) 285 #define BFA_IOC_FLASH_OFFSET_IN_CHUNK(off) (off % BFI_FLASH_CHUNK_SZ_WORDS) 286 #define BFA_IOC_FLASH_CHUNK_ADDR(chunkno) (chunkno * BFI_FLASH_CHUNK_SZ_WORDS) 287 288 /* 289 * IOC mailbox interface 290 */ 291 void bfa_ioc_mbox_queue(struct bfa_ioc_s *ioc, struct bfa_mbox_cmd_s *cmd); 292 void bfa_ioc_mbox_register(struct bfa_ioc_s *ioc, 293 bfa_ioc_mbox_mcfunc_t *mcfuncs); 294 void bfa_ioc_mbox_isr(struct bfa_ioc_s *ioc); 295 void bfa_ioc_mbox_send(struct bfa_ioc_s *ioc, void *ioc_msg, int len); 296 void bfa_ioc_msgget(struct bfa_ioc_s *ioc, void *mbmsg); 297 void bfa_ioc_mbox_regisr(struct bfa_ioc_s *ioc, enum bfi_mclass mc, 298 bfa_ioc_mbox_mcfunc_t cbfn, void *cbarg); 299 300 /* 301 * IOC interfaces 302 */ 303 304 #define bfa_ioc_pll_init_asic(__ioc) \ 305 ((__ioc)->ioc_hwif->ioc_pll_init((__ioc)->pcidev.pci_bar_kva, \ 306 (__ioc)->fcmode)) 307 308 bfa_status_t bfa_ioc_pll_init(struct bfa_ioc_s *ioc); 309 bfa_status_t bfa_ioc_cb_pll_init(void __iomem *rb, bfa_boolean_t fcmode); 310 bfa_boolean_t bfa_ioc_ct_pll_init_complete(void __iomem *rb); 311 bfa_status_t bfa_ioc_ct_pll_init(void __iomem *rb, bfa_boolean_t fcmode); 312 313 #define bfa_ioc_isr_mode_set(__ioc, __msix) \ 314 ((__ioc)->ioc_hwif->ioc_isr_mode_set(__ioc, __msix)) 315 #define bfa_ioc_ownership_reset(__ioc) \ 316 ((__ioc)->ioc_hwif->ioc_ownership_reset(__ioc)) 317 318 319 void bfa_ioc_set_ct_hwif(struct bfa_ioc_s *ioc); 320 void bfa_ioc_set_cb_hwif(struct bfa_ioc_s *ioc); 321 322 void bfa_ioc_attach(struct bfa_ioc_s *ioc, void *bfa, 323 struct bfa_ioc_cbfn_s *cbfn, struct bfa_timer_mod_s *timer_mod); 324 void bfa_ioc_auto_recover(bfa_boolean_t auto_recover); 325 void bfa_ioc_detach(struct bfa_ioc_s *ioc); 326 void bfa_ioc_pci_init(struct bfa_ioc_s *ioc, struct bfa_pcidev_s *pcidev, 327 enum bfi_mclass mc); 328 u32 bfa_ioc_meminfo(void); 329 void bfa_ioc_mem_claim(struct bfa_ioc_s *ioc, u8 *dm_kva, u64 dm_pa); 330 void bfa_ioc_enable(struct bfa_ioc_s *ioc); 331 void bfa_ioc_disable(struct bfa_ioc_s *ioc); 332 bfa_boolean_t bfa_ioc_intx_claim(struct bfa_ioc_s *ioc); 333 334 void bfa_ioc_boot(struct bfa_ioc_s *ioc, u32 boot_type, 335 u32 boot_param); 336 void bfa_ioc_isr(struct bfa_ioc_s *ioc, struct bfi_mbmsg_s *msg); 337 void bfa_ioc_error_isr(struct bfa_ioc_s *ioc); 338 bfa_boolean_t bfa_ioc_is_operational(struct bfa_ioc_s *ioc); 339 bfa_boolean_t bfa_ioc_is_initialized(struct bfa_ioc_s *ioc); 340 bfa_boolean_t bfa_ioc_is_disabled(struct bfa_ioc_s *ioc); 341 bfa_boolean_t bfa_ioc_fw_mismatch(struct bfa_ioc_s *ioc); 342 bfa_boolean_t bfa_ioc_adapter_is_disabled(struct bfa_ioc_s *ioc); 343 enum bfa_ioc_type_e bfa_ioc_get_type(struct bfa_ioc_s *ioc); 344 void bfa_ioc_get_adapter_serial_num(struct bfa_ioc_s *ioc, char *serial_num); 345 void bfa_ioc_get_adapter_fw_ver(struct bfa_ioc_s *ioc, char *fw_ver); 346 void bfa_ioc_get_adapter_optrom_ver(struct bfa_ioc_s *ioc, char *optrom_ver); 347 void bfa_ioc_get_adapter_model(struct bfa_ioc_s *ioc, char *model); 348 void bfa_ioc_get_adapter_manufacturer(struct bfa_ioc_s *ioc, 349 char *manufacturer); 350 void bfa_ioc_get_pci_chip_rev(struct bfa_ioc_s *ioc, char *chip_rev); 351 enum bfa_ioc_state bfa_ioc_get_state(struct bfa_ioc_s *ioc); 352 353 void bfa_ioc_get_attr(struct bfa_ioc_s *ioc, struct bfa_ioc_attr_s *ioc_attr); 354 void bfa_ioc_get_adapter_attr(struct bfa_ioc_s *ioc, 355 struct bfa_adapter_attr_s *ad_attr); 356 int bfa_ioc_debug_trcsz(bfa_boolean_t auto_recover); 357 void bfa_ioc_debug_memclaim(struct bfa_ioc_s *ioc, void *dbg_fwsave); 358 bfa_status_t bfa_ioc_debug_fwsave(struct bfa_ioc_s *ioc, void *trcdata, 359 int *trclen); 360 void bfa_ioc_debug_fwsave_clear(struct bfa_ioc_s *ioc); 361 bfa_status_t bfa_ioc_debug_fwtrc(struct bfa_ioc_s *ioc, void *trcdata, 362 int *trclen); 363 bfa_status_t bfa_ioc_debug_fwcore(struct bfa_ioc_s *ioc, void *buf, 364 u32 *offset, int *buflen); 365 u32 bfa_ioc_smem_pgnum(struct bfa_ioc_s *ioc, u32 fmaddr); 366 u32 bfa_ioc_smem_pgoff(struct bfa_ioc_s *ioc, u32 fmaddr); 367 void bfa_ioc_set_fcmode(struct bfa_ioc_s *ioc); 368 bfa_boolean_t bfa_ioc_get_fcmode(struct bfa_ioc_s *ioc); 369 void bfa_ioc_hbfail_register(struct bfa_ioc_s *ioc, 370 struct bfa_ioc_hbfail_notify_s *notify); 371 bfa_boolean_t bfa_ioc_sem_get(void __iomem *sem_reg); 372 void bfa_ioc_sem_release(void __iomem *sem_reg); 373 void bfa_ioc_hw_sem_release(struct bfa_ioc_s *ioc); 374 void bfa_ioc_fwver_get(struct bfa_ioc_s *ioc, 375 struct bfi_ioc_image_hdr_s *fwhdr); 376 bfa_boolean_t bfa_ioc_fwver_cmp(struct bfa_ioc_s *ioc, 377 struct bfi_ioc_image_hdr_s *fwhdr); 378 bfa_status_t bfa_ioc_fw_stats_get(struct bfa_ioc_s *ioc, void *stats); 379 bfa_status_t bfa_ioc_fw_stats_clear(struct bfa_ioc_s *ioc); 380 381 /* 382 * bfa mfg wwn API functions 383 */ 384 wwn_t bfa_ioc_get_pwwn(struct bfa_ioc_s *ioc); 385 wwn_t bfa_ioc_get_nwwn(struct bfa_ioc_s *ioc); 386 mac_t bfa_ioc_get_mac(struct bfa_ioc_s *ioc); 387 wwn_t bfa_ioc_get_mfg_pwwn(struct bfa_ioc_s *ioc); 388 wwn_t bfa_ioc_get_mfg_nwwn(struct bfa_ioc_s *ioc); 389 mac_t bfa_ioc_get_mfg_mac(struct bfa_ioc_s *ioc); 390 u64 bfa_ioc_get_adid(struct bfa_ioc_s *ioc); 391 392 /* 393 * F/W Image Size & Chunk 394 */ 395 extern u32 bfi_image_ct_fc_size; 396 extern u32 bfi_image_ct_cna_size; 397 extern u32 bfi_image_cb_fc_size; 398 extern u32 *bfi_image_ct_fc; 399 extern u32 *bfi_image_ct_cna; 400 extern u32 *bfi_image_cb_fc; 401 402 static inline u32 * 403 bfi_image_ct_fc_get_chunk(u32 off) 404 { return (u32 *)(bfi_image_ct_fc + off); } 405 406 static inline u32 * 407 bfi_image_ct_cna_get_chunk(u32 off) 408 { return (u32 *)(bfi_image_ct_cna + off); } 409 410 static inline u32 * 411 bfi_image_cb_fc_get_chunk(u32 off) 412 { return (u32 *)(bfi_image_cb_fc + off); } 413 414 static inline u32* 415 bfa_cb_image_get_chunk(int type, u32 off) 416 { 417 switch (type) { 418 case BFI_IMAGE_CT_FC: 419 return bfi_image_ct_fc_get_chunk(off); break; 420 case BFI_IMAGE_CT_CNA: 421 return bfi_image_ct_cna_get_chunk(off); break; 422 case BFI_IMAGE_CB_FC: 423 return bfi_image_cb_fc_get_chunk(off); break; 424 default: return 0; 425 } 426 } 427 428 static inline u32 429 bfa_cb_image_get_size(int type) 430 { 431 switch (type) { 432 case BFI_IMAGE_CT_FC: 433 return bfi_image_ct_fc_size; break; 434 case BFI_IMAGE_CT_CNA: 435 return bfi_image_ct_cna_size; break; 436 case BFI_IMAGE_CB_FC: 437 return bfi_image_cb_fc_size; break; 438 default: return 0; 439 } 440 } 441 442 /* 443 * CNA TRCMOD declaration 444 */ 445 /* 446 * !!! Only append to the enums defined here to avoid any versioning 447 * !!! needed between trace utility and driver version 448 */ 449 enum { 450 BFA_TRC_CNA_PORT = 1, 451 BFA_TRC_CNA_IOC = 2, 452 BFA_TRC_CNA_IOC_CB = 3, 453 BFA_TRC_CNA_IOC_CT = 4, 454 }; 455 456 #endif /* __BFA_IOC_H__ */ 457