spinlock_t fp_work_lock;
};
+
struct bnx2fc_hba {
struct list_head link;
struct cnic_dev *cnic;
#define BNX2FC_CTLR_INIT_DONE 1
#define BNX2FC_CREATE_DONE 2
struct fcoe_ctlr ctlr;
- struct list_head vports;
u8 vlan_enabled;
int vlan_id;
u32 next_conn_id;
#define bnx2fc_from_ctlr(fip) container_of(fip, struct bnx2fc_hba, ctlr)
-struct bnx2fc_lport {
- struct list_head list;
- struct fc_lport *lport;
-};
-
struct bnx2fc_cmd_mgr {
struct bnx2fc_hba *hba;
u16 next_idx;
struct bnx2fc_unsol_els {
struct fc_lport *lport;
struct fc_frame *fp;
- struct bnx2fc_hba *hba;
struct work_struct unsol_els_work;
};
hba->ctlr.get_src_addr = bnx2fc_get_src_mac;
set_bit(BNX2FC_CTLR_INIT_DONE, &hba->init_done);
- INIT_LIST_HEAD(&hba->vports);
rc = bnx2fc_netdev_setup(hba);
if (rc)
goto setup_err;
struct fcoe_port *port;
struct Scsi_Host *shost;
struct fc_vport *vport = dev_to_vport(parent);
- struct bnx2fc_lport *blport;
int rc = 0;
- blport = kzalloc(sizeof(struct bnx2fc_lport), GFP_KERNEL);
- if (!blport) {
- BNX2FC_HBA_DBG(hba->ctlr.lp, "Unable to alloc bnx2fc_lport\n");
- return NULL;
- }
-
/* Allocate Scsi_Host structure */
if (!npiv)
lport = libfc_host_alloc(&bnx2fc_shost_template, sizeof(*port));
if (!lport) {
printk(KERN_ERR PFX "could not allocate scsi host structure\n");
- goto free_blport;
+ return NULL;
}
shost = lport->host;
port = lport_priv(lport);
}
bnx2fc_interface_get(hba);
-
- spin_lock_bh(&hba->hba_lock);
- blport->lport = lport;
- list_add_tail(&blport->list, &hba->vports);
- spin_unlock_bh(&hba->hba_lock);
-
return lport;
shost_err:
scsi_remove_host(shost);
lp_config_err:
scsi_host_put(lport->host);
-free_blport:
- kfree(blport);
return NULL;
}
{
struct fcoe_port *port = lport_priv(lport);
struct bnx2fc_hba *hba = port->priv;
- struct bnx2fc_lport *blport, *tmp;
BNX2FC_HBA_DBG(hba->ctlr.lp, "ENTERED bnx2fc_if_destroy\n");
/* Stop the transmit retry timer */
/* Free memory used by statistical counters */
fc_lport_free_stats(lport);
- spin_lock_bh(&hba->hba_lock);
- list_for_each_entry_safe(blport, tmp, &hba->vports, list) {
- if (blport->lport == lport) {
- list_del(&blport->list);
- kfree(blport);
- }
- }
- spin_unlock_bh(&hba->hba_lock);
-
/* Release Scsi_Host */
scsi_host_put(lport->host);
return rc;
}
-static bool is_valid_lport(struct bnx2fc_hba *hba, struct fc_lport *lport)
-{
- struct bnx2fc_lport *blport;
-
- spin_lock_bh(&hba->hba_lock);
- list_for_each_entry(blport, &hba->vports, list) {
- if (blport->lport == lport) {
- spin_unlock_bh(&hba->hba_lock);
- return true;
- }
- }
- spin_unlock_bh(&hba->hba_lock);
- return false;
-
-}
-
-
static void bnx2fc_unsol_els_work(struct work_struct *work)
{
struct bnx2fc_unsol_els *unsol_els;
struct fc_lport *lport;
- struct bnx2fc_hba *hba;
struct fc_frame *fp;
unsol_els = container_of(work, struct bnx2fc_unsol_els, unsol_els_work);
lport = unsol_els->lport;
fp = unsol_els->fp;
- hba = unsol_els->hba;
- if (is_valid_lport(hba, lport))
- fc_exch_recv(lport, fp);
+ fc_exch_recv(lport, fp);
kfree(unsol_els);
}
{
struct fcoe_port *port = tgt->port;
struct fc_lport *lport = port->lport;
- struct bnx2fc_hba *hba = port->priv;
struct bnx2fc_unsol_els *unsol_els;
struct fc_frame_header *fh;
struct fc_frame *fp;
fr_eof(fp) = FC_EOF_T;
fr_crc(fp) = cpu_to_le32(~crc);
unsol_els->lport = lport;
- unsol_els->hba = hba;
unsol_els->fp = fp;
INIT_WORK(&unsol_els->unsol_els_work, bnx2fc_unsol_els_work);
queue_work(bnx2fc_wq, &unsol_els->unsol_els_work);