diff options
Diffstat (limited to 'drivers/scsi/bfa/bfad_im.h')
| -rw-r--r-- | drivers/scsi/bfa/bfad_im.h | 94 | 
1 files changed, 61 insertions, 33 deletions
diff --git a/drivers/scsi/bfa/bfad_im.h b/drivers/scsi/bfa/bfad_im.h index b038c0e0892..f6c1023e502 100644 --- a/drivers/scsi/bfa/bfad_im.h +++ b/drivers/scsi/bfa/bfad_im.h @@ -37,6 +37,7 @@ int  bfad_im_scsi_host_alloc(struct bfad_s *bfad,  		struct bfad_im_port_s *im_port, struct device *dev);  void bfad_im_scsi_host_free(struct bfad_s *bfad,  				struct bfad_im_port_s *im_port); +u32 bfad_im_supported_speeds(struct bfa_s *bfa);  #define MAX_FCP_TARGET 1024  #define MAX_FCP_LUN 16384 @@ -91,6 +92,7 @@ struct bfad_itnim_s {  	struct fc_rport *fc_rport;  	struct bfa_itnim_s *bfa_itnim;  	u16        scsi_tgt_id; +	u16	   channel;  	u16        queue_work;  	unsigned long	last_ramp_up_time;  	unsigned long	last_queue_full_time; @@ -115,19 +117,41 @@ struct bfad_im_s {  	struct bfad_s         *bfad;  	struct workqueue_struct *drv_workq;  	char            drv_workq_name[KOBJ_NAME_LEN]; +	struct work_struct	aen_im_notify_work;  }; -struct Scsi_Host *bfad_os_scsi_host_alloc(struct bfad_im_port_s *im_port, +#define bfad_get_aen_entry(_drv, _entry) do {				\ +	unsigned long	_flags;						\ +	spin_lock_irqsave(&(_drv)->bfad_aen_spinlock, _flags);		\ +	bfa_q_deq(&(_drv)->free_aen_q, &(_entry));			\ +	if (_entry)							\ +		list_add_tail(&(_entry)->qe, &(_drv)->active_aen_q);	\ +	spin_unlock_irqrestore(&(_drv)->bfad_aen_spinlock, _flags);	\ +} while (0) + +/* post fc_host vendor event */ +#define bfad_im_post_vendor_event(_entry, _drv, _cnt, _cat, _evt) do {	      \ +	do_gettimeofday(&(_entry)->aen_tv);				      \ +	(_entry)->bfad_num = (_drv)->inst_no;				      \ +	(_entry)->seq_num = (_cnt);					      \ +	(_entry)->aen_category = (_cat);				      \ +	(_entry)->aen_type = (_evt);					      \ +	if ((_drv)->bfad_flags & BFAD_FC4_PROBE_DONE)			      \ +		queue_work((_drv)->im->drv_workq,			      \ +			   &(_drv)->im->aen_im_notify_work);		      \ +} while (0) + +struct Scsi_Host *bfad_scsi_host_alloc(struct bfad_im_port_s *im_port,  				struct bfad_s *); -bfa_status_t bfad_os_thread_workq(struct bfad_s *bfad); -void bfad_os_destroy_workq(struct bfad_im_s *im); -void bfad_os_fc_host_init(struct bfad_im_port_s *im_port); -void bfad_os_scsi_host_free(struct bfad_s *bfad, +bfa_status_t bfad_thread_workq(struct bfad_s *bfad); +void bfad_destroy_workq(struct bfad_im_s *im); +void bfad_fc_host_init(struct bfad_im_port_s *im_port); +void bfad_scsi_host_free(struct bfad_s *bfad,  				 struct bfad_im_port_s *im_port); -void bfad_os_ramp_up_qdepth(struct bfad_itnim_s *itnim, +void bfad_ramp_up_qdepth(struct bfad_itnim_s *itnim,  				 struct scsi_device *sdev); -void bfad_os_handle_qfull(struct bfad_itnim_s *itnim, struct scsi_device *sdev); -struct bfad_itnim_s *bfad_os_get_itnim(struct bfad_im_port_s *im_port, int id); +void bfad_handle_qfull(struct bfad_itnim_s *itnim, struct scsi_device *sdev); +struct bfad_itnim_s *bfad_get_itnim(struct bfad_im_port_s *im_port, int id);  extern struct scsi_host_template bfad_im_scsi_host_template;  extern struct scsi_host_template bfad_im_vport_template; @@ -141,29 +165,33 @@ extern struct device_attribute *bfad_im_vport_attrs[];  irqreturn_t bfad_intx(int irq, void *dev_id); -/* Firmware releated */ -#define BFAD_FW_FILE_CT_FC      "ctfw_fc.bin" -#define BFAD_FW_FILE_CT_CNA     "ctfw_cna.bin" -#define BFAD_FW_FILE_CB_FC      "cbfw_fc.bin" - -u32 *bfad_get_firmware_buf(struct pci_dev *pdev); -u32 *bfad_read_firmware(struct pci_dev *pdev, u32 **bfi_image, -		u32 *bfi_image_size, char *fw_name); - -static inline u32 * -bfad_load_fwimg(struct pci_dev *pdev) -{ -	return bfad_get_firmware_buf(pdev); -} - -static inline void -bfad_free_fwimg(void) -{ -	if (bfi_image_ct_fc_size && bfi_image_ct_fc) -		vfree(bfi_image_ct_fc); -	if (bfi_image_ct_cna_size && bfi_image_ct_cna) -		vfree(bfi_image_ct_cna); -	if (bfi_image_cb_fc_size && bfi_image_cb_fc) -		vfree(bfi_image_cb_fc); -} +int bfad_im_bsg_request(struct fc_bsg_job *job); +int bfad_im_bsg_timeout(struct fc_bsg_job *job); + +/* + * Macro to set the SCSI device sdev_bflags - sdev_bflags are used by the + * SCSI mid-layer to choose LUN Scanning mode REPORT_LUNS vs. Sequential Scan + * + * Internally iterate's over all the ITNIM's part of the im_port & set's the + * sdev_bflags for the scsi_device associated with LUN #0. + */ +#define bfad_reset_sdev_bflags(__im_port, __lunmask_cfg) do {		\ +	struct scsi_device *__sdev = NULL;				\ +	struct bfad_itnim_s *__itnim = NULL;				\ +	u32 scan_flags = BLIST_NOREPORTLUN | BLIST_SPARSELUN;		\ +	list_for_each_entry(__itnim, &((__im_port)->itnim_mapped_list),	\ +			    list_entry) {				\ +		__sdev = scsi_device_lookup((__im_port)->shost,		\ +					    __itnim->channel,		\ +					    __itnim->scsi_tgt_id, 0);	\ +		if (__sdev) {						\ +			if ((__lunmask_cfg) == BFA_TRUE)		\ +				__sdev->sdev_bflags |= scan_flags;	\ +			else						\ +				__sdev->sdev_bflags &= ~scan_flags;	\ +			scsi_device_put(__sdev);			\ +		}							\ +	}								\ +} while (0) +  #endif  | 
