/* * Copyright 2014 Cisco Systems, Inc. All rights reserved. * * This program is free software; you may redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2 of the License. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ #ifndef __SNIC_DISC_H #define __SNIC_DISC_H #include "snic_fwint.h" enum snic_disc_state { SNIC_DISC_NONE, SNIC_DISC_INIT, SNIC_DISC_PENDING, SNIC_DISC_DONE }; struct snic; struct snic_disc { struct list_head tgt_list; enum snic_disc_state state; struct mutex mutex; u16 disc_id; u8 req_cnt; u32 nxt_tgt_id; u32 rtgt_cnt; u8 *rtgt_info; struct delayed_work disc_timeout; void (*cb)(struct snic *); }; #define SNIC_TGT_NAM_LEN 16 enum snic_tgt_state { SNIC_TGT_STAT_NONE, SNIC_TGT_STAT_INIT, SNIC_TGT_STAT_ONLINE, /* Target is Online */ SNIC_TGT_STAT_OFFLINE, /* Target is Offline */ SNIC_TGT_STAT_DEL, }; struct snic_tgt_priv { struct list_head list; enum snic_tgt_type typ; u16 disc_id; char *name[SNIC_TGT_NAM_LEN]; union { /*DAS Target specific info */ /*SAN Target specific info */ u8 dummmy; } u; }; /* snic tgt flags */ #define SNIC_TGT_SCAN_PENDING 0x01 struct snic_tgt { struct list_head list; u16 id; u16 channel; u32 flags; u32 scsi_tgt_id; enum snic_tgt_state state; struct device dev; struct work_struct scan_work; struct work_struct del_work; struct snic_tgt_priv tdata; }; struct snic_fw_req; void snic_disc_init(struct snic_disc *); int snic_disc_start(struct snic *); void snic_disc_term(struct snic *); int snic_report_tgt_cmpl_handler(struct snic *, struct snic_fw_req *); int snic_tgtinfo_cmpl_handler(struct snic *snic, struct snic_fw_req *fwreq); void snic_process_report_tgts_rsp(struct work_struct *); void snic_handle_tgt_disc(struct work_struct *); void snic_handle_disc(struct work_struct *); void snic_tgt_dev_release(struct device *); void snic_tgt_del_all(struct snic *); #define dev_to_tgt(d) \ container_of(d, struct snic_tgt, dev) static inline int is_snic_target(struct device *dev) { return dev->release == snic_tgt_dev_release; } #define starget_to_tgt(st) \ (is_snic_target(((struct scsi_target *) st)->dev.parent) ? \ dev_to_tgt(st->dev.parent) : NULL) #define snic_tgt_to_shost(t) \ dev_to_shost(t->dev.parent) static inline int snic_tgt_chkready(struct snic_tgt *tgt) { if (tgt->state == SNIC_TGT_STAT_ONLINE) return 0; else return DID_NO_CONNECT << 16; } const char *snic_tgt_state_to_str(int); int snic_tgt_scsi_abort_io(struct snic_tgt *); #endif /* end of __SNIC_DISC_H */