17725ccfdSJing Huang /* 27725ccfdSJing Huang * Copyright (c) 2005-2009 Brocade Communications Systems, Inc. 37725ccfdSJing Huang * All rights reserved 47725ccfdSJing Huang * www.brocade.com 57725ccfdSJing Huang * 67725ccfdSJing Huang * Linux driver for Brocade Fibre Channel Host Bus Adapter. 77725ccfdSJing Huang * 87725ccfdSJing Huang * This program is free software; you can redistribute it and/or modify it 97725ccfdSJing Huang * under the terms of the GNU General Public License (GPL) Version 2 as 107725ccfdSJing Huang * published by the Free Software Foundation 117725ccfdSJing Huang * 127725ccfdSJing Huang * This program is distributed in the hope that it will be useful, but 137725ccfdSJing Huang * WITHOUT ANY WARRANTY; without even the implied warranty of 147725ccfdSJing Huang * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 157725ccfdSJing Huang * General Public License for more details. 167725ccfdSJing Huang */ 177725ccfdSJing Huang 187725ccfdSJing Huang #ifndef __BFAD_IM_H__ 197725ccfdSJing Huang #define __BFAD_IM_H__ 207725ccfdSJing Huang 217725ccfdSJing Huang #include "fcs/bfa_fcs_fcpim.h" 227725ccfdSJing Huang #include "bfad_im_compat.h" 237725ccfdSJing Huang 247725ccfdSJing Huang #define FCPI_NAME " fcpim" 257725ccfdSJing Huang 267725ccfdSJing Huang void bfad_flags_set(struct bfad_s *bfad, u32 flags); 277725ccfdSJing Huang bfa_status_t bfad_im_module_init(void); 287725ccfdSJing Huang void bfad_im_module_exit(void); 297725ccfdSJing Huang bfa_status_t bfad_im_probe(struct bfad_s *bfad); 307725ccfdSJing Huang void bfad_im_probe_undo(struct bfad_s *bfad); 317725ccfdSJing Huang void bfad_im_probe_post(struct bfad_im_s *im); 327725ccfdSJing Huang bfa_status_t bfad_im_port_new(struct bfad_s *bfad, struct bfad_port_s *port); 337725ccfdSJing Huang void bfad_im_port_delete(struct bfad_s *bfad, struct bfad_port_s *port); 347725ccfdSJing Huang void bfad_im_port_online(struct bfad_s *bfad, struct bfad_port_s *port); 357725ccfdSJing Huang void bfad_im_port_offline(struct bfad_s *bfad, struct bfad_port_s *port); 367725ccfdSJing Huang void bfad_im_port_clean(struct bfad_im_port_s *im_port); 377725ccfdSJing Huang int bfad_im_scsi_host_alloc(struct bfad_s *bfad, 387725ccfdSJing Huang struct bfad_im_port_s *im_port); 397725ccfdSJing Huang void bfad_im_scsi_host_free(struct bfad_s *bfad, 407725ccfdSJing Huang struct bfad_im_port_s *im_port); 417725ccfdSJing Huang 427725ccfdSJing Huang #define MAX_FCP_TARGET 1024 437725ccfdSJing Huang #define MAX_FCP_LUN 16384 447725ccfdSJing Huang #define BFAD_TARGET_RESET_TMO 60 457725ccfdSJing Huang #define BFAD_LUN_RESET_TMO 60 467725ccfdSJing Huang #define ScsiResult(host_code, scsi_code) (((host_code) << 16) | scsi_code) 477725ccfdSJing Huang #define BFA_QUEUE_FULL_RAMP_UP_TIME 120 487725ccfdSJing Huang #define BFAD_KOBJ_NAME_LEN 20 497725ccfdSJing Huang 507725ccfdSJing Huang /* 517725ccfdSJing Huang * itnim flags 527725ccfdSJing Huang */ 537725ccfdSJing Huang #define ITNIM_MAPPED 0x00000001 547725ccfdSJing Huang 557725ccfdSJing Huang #define SCSI_TASK_MGMT 0x00000001 567725ccfdSJing Huang #define IO_DONE_BIT 0 577725ccfdSJing Huang 587725ccfdSJing Huang struct bfad_itnim_data_s { 597725ccfdSJing Huang struct bfad_itnim_s *itnim; 607725ccfdSJing Huang }; 617725ccfdSJing Huang 627725ccfdSJing Huang struct bfad_im_port_s { 637725ccfdSJing Huang struct bfad_s *bfad; 647725ccfdSJing Huang struct bfad_port_s *port; 657725ccfdSJing Huang struct work_struct port_delete_work; 667725ccfdSJing Huang int idr_id; 677725ccfdSJing Huang u16 cur_scsi_id; 687725ccfdSJing Huang struct list_head binding_list; 697725ccfdSJing Huang struct Scsi_Host *shost; 707725ccfdSJing Huang struct list_head itnim_mapped_list; 717725ccfdSJing Huang }; 727725ccfdSJing Huang 737725ccfdSJing Huang enum bfad_itnim_state { 747725ccfdSJing Huang ITNIM_STATE_NONE, 757725ccfdSJing Huang ITNIM_STATE_ONLINE, 767725ccfdSJing Huang ITNIM_STATE_OFFLINE_PENDING, 777725ccfdSJing Huang ITNIM_STATE_OFFLINE, 787725ccfdSJing Huang ITNIM_STATE_TIMEOUT, 797725ccfdSJing Huang ITNIM_STATE_FREE, 807725ccfdSJing Huang }; 817725ccfdSJing Huang 827725ccfdSJing Huang /* 837725ccfdSJing Huang * Per itnim data structure 847725ccfdSJing Huang */ 857725ccfdSJing Huang struct bfad_itnim_s { 867725ccfdSJing Huang struct list_head list_entry; 877725ccfdSJing Huang struct bfa_fcs_itnim_s fcs_itnim; 887725ccfdSJing Huang struct work_struct itnim_work; 897725ccfdSJing Huang u32 flags; 907725ccfdSJing Huang enum bfad_itnim_state state; 917725ccfdSJing Huang struct bfad_im_s *im; 927725ccfdSJing Huang struct bfad_im_port_s *im_port; 937725ccfdSJing Huang struct bfad_rport_s *drv_rport; 947725ccfdSJing Huang struct fc_rport *fc_rport; 957725ccfdSJing Huang struct bfa_itnim_s *bfa_itnim; 967725ccfdSJing Huang u16 scsi_tgt_id; 977725ccfdSJing Huang u16 queue_work; 987725ccfdSJing Huang unsigned long last_ramp_up_time; 997725ccfdSJing Huang unsigned long last_queue_full_time; 1007725ccfdSJing Huang }; 1017725ccfdSJing Huang 1027725ccfdSJing Huang enum bfad_binding_type { 1037725ccfdSJing Huang FCP_PWWN_BINDING = 0x1, 1047725ccfdSJing Huang FCP_NWWN_BINDING = 0x2, 1057725ccfdSJing Huang FCP_FCID_BINDING = 0x3, 1067725ccfdSJing Huang }; 1077725ccfdSJing Huang 1087725ccfdSJing Huang struct bfad_fcp_binding { 1097725ccfdSJing Huang struct list_head list_entry; 1107725ccfdSJing Huang enum bfad_binding_type binding_type; 1117725ccfdSJing Huang u16 scsi_target_id; 1127725ccfdSJing Huang u32 fc_id; 1137725ccfdSJing Huang wwn_t nwwn; 1147725ccfdSJing Huang wwn_t pwwn; 1157725ccfdSJing Huang }; 1167725ccfdSJing Huang 1177725ccfdSJing Huang struct bfad_im_s { 1187725ccfdSJing Huang struct bfad_s *bfad; 1197725ccfdSJing Huang struct workqueue_struct *drv_workq; 1207725ccfdSJing Huang char drv_workq_name[BFAD_KOBJ_NAME_LEN]; 1217725ccfdSJing Huang }; 1227725ccfdSJing Huang 1237725ccfdSJing Huang struct Scsi_Host *bfad_os_scsi_host_alloc(struct bfad_im_port_s *im_port, 1247725ccfdSJing Huang struct bfad_s *); 1257725ccfdSJing Huang bfa_status_t bfad_os_thread_workq(struct bfad_s *bfad); 1267725ccfdSJing Huang void bfad_os_destroy_workq(struct bfad_im_s *im); 1277725ccfdSJing Huang void bfad_os_itnim_process(struct bfad_itnim_s *itnim_drv); 1287725ccfdSJing Huang void bfad_os_fc_host_init(struct bfad_im_port_s *im_port); 1297725ccfdSJing Huang void bfad_os_init_work(struct bfad_im_port_s *im_port); 1307725ccfdSJing Huang void bfad_os_scsi_host_free(struct bfad_s *bfad, 1317725ccfdSJing Huang struct bfad_im_port_s *im_port); 1327725ccfdSJing Huang void bfad_os_ramp_up_qdepth(struct bfad_itnim_s *itnim, 1337725ccfdSJing Huang struct scsi_device *sdev); 1347725ccfdSJing Huang void bfad_os_handle_qfull(struct bfad_itnim_s *itnim, struct scsi_device *sdev); 1357725ccfdSJing Huang struct bfad_itnim_s *bfad_os_get_itnim(struct bfad_im_port_s *im_port, int id); 1367725ccfdSJing Huang int bfad_os_scsi_add_host(struct Scsi_Host *shost, 1377725ccfdSJing Huang struct bfad_im_port_s *im_port, struct bfad_s *bfad); 1387725ccfdSJing Huang 1397725ccfdSJing Huang /* 1407725ccfdSJing Huang * scsi_host_template entries 1417725ccfdSJing Huang */ 1427725ccfdSJing Huang void bfad_im_itnim_unmap(struct bfad_im_port_s *im_port, 1437725ccfdSJing Huang struct bfad_itnim_s *itnim); 1447725ccfdSJing Huang 1457725ccfdSJing Huang extern struct scsi_host_template bfad_im_scsi_host_template; 1467725ccfdSJing Huang extern struct scsi_host_template bfad_im_vport_template; 1477725ccfdSJing Huang extern struct fc_function_template bfad_im_fc_function_template; 1487725ccfdSJing Huang extern struct scsi_transport_template *bfad_im_scsi_transport_template; 1497725ccfdSJing Huang 1507725ccfdSJing Huang #endif 151